Commit f1cafcb8ad98f516cfe74487afd7e2d1f4209010

Authored by Joenio Costa
2 parents 889c79b5 206bd7b9

Merge branch 'master' into AI3191-private_environment

Showing 439 changed files with 11631 additions and 14997 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 439 files displayed.

.ackrc 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +--ignore-dir=log
  2 +--ignore-dir=tmp
  3 +--ignore-dir=pkg
... ...
... ... @@ -1,250 +0,0 @@
1   -If you are not listed here, but should be, please write to the noosfero mailing
2   -list: http://listas.softwarelivre.org/cgi-bin/mailman/listinfo/noosfero-dev
3   -(this list requires subscription to post, but since you are an author of
4   -noosfero, that's not a problem).
5   -
6   -Developers
7   -==========
8   -
9   -Ábner Silva de Oliveira <abner.oliveira@serpro.gov.br>
10   -Alan Freihof Tygel <alantygel@gmail.com>
11   -alcampelo <alcampelo@alcampelo.(none)>
12   -Alessandro Palmeira <alessandro.palmeira@gmail.com>
13   -Alessandro Palmeira + Caio C. Salgado <alessandro.palmeira@gmail.com>
14   -Alessandro Palmeira + Caio Salgado <alessandro.palmeira@gmail.com>
15   -Alessandro Palmeira + Caio Salgado <caio.csalgado@gmail.com>
16   -Alessandro Palmeira + Caio Salgado + Diego Araújo + João M. M. da Silva <diegoamc90@gmail.com>
17   -Alessandro Palmeira + Carlos Morais <alessandro.palmeira@gmail.com>
18   -Alessandro Palmeira + Daniel Alves <alessandro.palmeira@gmail.com>
19   -Alessandro Palmeira + Daniel Alves + Diego Araújo <diegoamc90@gmail.com>
20   -Alessandro Palmeira + Daniel Alves + Diego Araújo + Guilherme Rojas <danpaulalves@gmail.com>
21   -Alessandro Palmeira + Diego Araujo <alessandro.palmeira@gmail.com>
22   -Alessandro Palmeira + Diego Araújo <alessandro.palmeira@gmail.com>
23   -Alessandro Palmeira + Diego Araujo + Daniela Feitosa <alessandro.palmeira@gmail.com>
24   -Alessandro Palmeira + Diego Araujo <diegoamc90@gmail.com>
25   -Alessandro Palmeira + Diego Araújo <diegoamc90@gmail.com>
26   -Alessandro Palmeira + Diego Araujo + Eduardo Morais <alessandro.palmeira@gmail.com>
27   -Alessandro Palmeira + Diego Araújo + João M. M. da Silva <alessandro.palmeira@gmail.com>
28   -Alessandro Palmeira + Diego Araújo + João M. M. da Silva <diegoamc90@gmail.com>
29   -Alessandro Palmeira + Diego Araujo + João M. M. da Silva + Paulo Meirelles <alessandro.palmeira@gmail.com>
30   -Alessandro Palmeira + Diego Araújo + Pedro Leal <diegoamc90@gmail.com>
31   -Alessandro Palmeira + Diego Araújo + Pedro Leal + João M. M. da Silva <diegoamc90@gmail.com>
32   -Alessandro Palmeira + Diego Araujo + Rafael Manzo <alessandro.palmeira@gmail.com>
33   -Alessandro Palmeira + Eduardo Morais <alessandro.palmeira@gmail.com>
34   -Alessandro Palmeira + Guilherme Rojas <alessandro.palmeira@gmail.com>
35   -Alessandro Palmeira + Jefferson Fernandes <alessandro.palmeira@gmail.com>
36   -Alessandro Palmeira + João M. M. da Silva <alessandro.palmeira@gmail.com>
37   -Alessandro Palmeira + Joao M. M. da Silva + Diego Araujo <alessandro.palmeira@gmail.com>
38   -Alessandro Palmeira + João M. M. da Silva + Renan Teruo <alessandro.palmeira@gmail.com>
39   -Alessandro Palmeira + João M. M. Silva <alessandro.palmeira@gmail.com>
40   -Alessandro Palmeira + Paulo Meirelles <alessandro.palmeira@gmail.com>
41   -Alessandro Palmeira + Paulo Meirelles + João M. M. da Silva <alessandro.palmeira@gmail.com>
42   -Alessandro Palmeira + Rafael Manzo <alessandro.palmeira@gmail.com>
43   -Ana Losnak <analosnak@gmail.com>
44   -Antonio Terceiro + Carlos Morais <terceiro@colivre.coop.br>
45   -Antonio Terceiro + Paulo Meirelles <terceiro@colivre.coop.br>
46   -Antonio Terceiro <terceiro@colivre.coop.br>
47   -Arthur Del Esposte <arthurmde@gmail.com>
48   -Arthur Del Esposte <arthurmde@yahoo.com.br>
49   -Aurelio A. Heckert <aurelio@colivre.coop.br>
50   -Braulio Bhavamitra <brauliobo@gmail.com>
51   -Bráulio Bhavamitra <brauliobo@gmail.com>
52   -Braulio Bhavamitra <braulio@eita.org.br>
53   -Caio <caio.csalgado@gmail.com>
54   -Caio + Diego + Pedro + João <caio.csalgado@gmail.com>
55   -Caio Formiga <caio.formiga@gmail.com>
56   -Caio, Pedro <caio.csalgado@gmail.com>
57   -Caio Salgado + Alessandro Palmeira <caio.csalgado@gmail.com>
58   -Caio Salgado <caio.csalgado@gmail.com>
59   -Caio Salgado + Carlos Morais + Diego Araújo + Pedro Leal <diegoamc90@gmail.com>
60   -Caio Salgado + Diego Araujo <caio.csalgado@gmail.com>
61   -Caio Salgado + Diego Araújo <caio.csalgado@gmail.com>
62   -Caio Salgado + Diego Araújo <diegoamc90@gmail.com>
63   -Caio Salgado + Diego Araújo + Jefferson Fernandes <caio.csalgado@gmail.com>
64   -Caio Salgado + Diego Araújo + João M. M. da Silva <caio.csalgado@gmail.com>
65   -Caio Salgado + Diego Araújo + Pedro Leal <caio.csalgado@gmail.com>
66   -Caio Salgado + Diego Araújo + Pedro Leal <diegoamc90@gmail.com>
67   -Caio Salgado + Diego Araújo + Rafael Manzo <diegoamc90@gmail.com>
68   -Caio Salgado + Jefferson Fernandes <caio.csalgado@gmail.com>
69   -Caio Salgado + Jefferson Fernandes <jeffs.fernandes@gmail.com>
70   -Caio Salgado + Rafael Manzo <caio.csalgado@gmail.com>
71   -Caio Salgado + Renan Teruo <caio.csalgado@gmail.com>
72   -Caio Salgado + Renan Teruo <caio.salgado@gmail.com>
73   -Caio Salgado + Renan Teruo + Jefferson Fernandes <jeffs.fernandes@gmail.com>
74   -Caio Salgado + Renan Teruo <renanteruoc@gmail.com>
75   -Caio SBA <caio@colivre.coop.br>
76   -Caio Tiago Oliveira <caiotiago@colivre.coop.br>
77   -Carlos Andre de Souza <carlos.andre.souza@msn.com>
78   -Carlos Morais <carlos88morais@gmail.com>
79   -Carlos Morais + Diego Araújo <diegoamc90@gmail.com>
80   -Carlos Morais + Eduardo Morais <carlos88morais@gmail.com>
81   -Carlos Morais + Paulo Meirelles <carlos88morais@gmail.com>
82   -Carlos Morais + Pedro Leal <carlos88morais@gmail.com>
83   -Daniela Feitosa <dani@dohko.(none)>
84   -Daniel Alves + Diego Araújo <danpaulalves@gmail.com>
85   -Daniel Alves + Diego Araújo <diegoamc90@gmail.com>
86   -Daniel Alves + Diego Araújo + Guilherme Rojas <danpaulalves@gmail.com>
87   -Daniel Alves + Diego Araújo + Guilherme Rojas <diegoamc90@gmail.com>
88   -Daniel Alves + Diego Araújo + Guilherme Rojas <guilhermehrojas@gmail.com>
89   -Daniel Alves + Guilherme Rojas <danpaulalves@gmail.com>
90   -Daniel Alves + Rafael Manzo <rr.manzo@gmail.com>
91   -Daniela Soares Feitosa <danielafeitosa@colivre.coop.br>
92   -Daniel Bucher <daniel.bucher88@gmail.com>
93   -Daniel Cunha <daniel@colivre.coop.br>
94   -David Carlos <ddavidcarlos1392@gmail.com>
95   -diegoamc <diegoamc90@gmail.com>
96   -Diego Araújo + Alessandro Palmeira <diegoamc90@gmail.com>
97   -Diego Araújo + Alessandro Palmeira + João M. M. da Silva <diegoamc90@gmail.com>
98   -Diego Araújo + Alessandro Palmeira + Rafael Manzo <rr.manzo@gmail.com>
99   -Diego Araujo + Caio Salgado <diegoamc90@gmail.com>
100   -Diego Araújo + Daniel Alves + Rafael Manzo <rr.manzo@gmail.com>
101   -Diego Araújo <diegoamc90@gmail.com>
102   -Diego Araújo + Eduardo Morais + Paulo Meirelles <diegoamc90@gmail.com>
103   -Diego Araújo + Guilherme Rojas <diegoamc90@gmail.com>
104   -Diego Araújo + Jefferson Fernandes <diegoamc90@gmail.com>
105   -Diego Araujo + Jefferson Fernandes <jeffs.fernandes@gmail.com>
106   -Diego Araújo + João Machini <diegoamc90@gmail.com>
107   -Diego Araújo + João Machini <digoamc90@gmail.com>
108   -Diego Araújo + João M. M. da Silva + Alessandro Palmeira <jaodsilv@linux.ime.usp.br>
109   -Diego Araújo + João M. M. da Silva <diegoamc90@gmail.com>
110   -Diego Araújo + João M. M. da Silva + João Machini <diegoamc90@gmail.com>
111   -Diego Araújo + João M. M. da Silva + Pedro Leal <diegoamc90@gmail.com>
112   -Diego Araújo + Paulo Meirelles <diegoamc90@gmail.com>
113   -Diego Araújo + Pedro Leal <diegoamc90@gmail.com>
114   -Diego Araujo + Rafael Manzo <diegoamc90@gmail.com>
115   -Diego Araújo + Rafael Manzo <diegoamc90@gmail.com>
116   -Diego Araújo + Renan Teruo + Alessandro Palmeira <diegoamc90@gmail.com>
117   -Diego Araújo + Renan Teruo <diegoamc90@gmail.com>
118   -Diego Araujo + Rodrigo Souto + Rafael Manzo <rr.manzo@gmail.com>
119   -Diego + Jefferson <diegoamc90@gmail.com>
120   -Diego Martinez <diegoamc90@gmail.com>
121   -Diego Martinez <diego@diego-K55A.(none)>
122   -Diego + Renan <renanteruoc@gmail.com>
123   -Eduardo Tourinho Edington <eduardo.edington@serpro.gov.br>
124   -Evandro Jr <evandrojr@gmail.com>
125   -Evandro Junior <evandrojr@gmail.com>
126   -Fabio Teixeira <fabio1079@gmail.com>
127   -Fernanda Lopes <nanda.listas+psl@gmail.com>
128   -Francisco Marcelo A. Lima Júnior <francisco.lima-junior@serpro.gov.br>
129   -Francisco Marcelo de Araujo Lima Junior <79350259591@serpro-1457614.(none)>
130   -Francisco Marcelo de Araújo Lima Júnior <francisco.lima-junior@serpro.gov.br>
131   -Francisco Marcelo de Araújo Lima Júnior <maljunior@gmail.com>
132   -Gabriela Navarro <navarro1703@gmail.com>
133   -Grazieno Pellegrino <grazieno@gmail.com>
134   -Gust <darksshades@hotmail.com>
135   -Hugo Melo <hugo@riseup.net>
136   -Isaac Canan <isaac@intelletto.com.br>
137   -Italo Valcy <italo@dcc.ufba.br>
138   -Jefferson Fernandes + Diego Araujo + Rafael Manzo <jeffs.fernandes@gmail.com>
139   -Jefferson Fernandes + Joao M. M. da Silva <jeffs.fernandes@gmail.com>
140   -Jefferson Fernandes + Joao M. M. Silva <jeffs.fernandes@gmail.com>
141   -João da Silva + Eduardo Morais + Rafael Manzo <rr.manzo@gmail.com>
142   -João da Silva <jaodsilv@linux.ime.usp.br>
143   -João Marco Maciel da Silva + Rafael Manzo + Renan Teruo <jaodsilv@linux.ime.usp.br>
144   -João M. M. da Silva + Alessandro Palmeira + Diego Araújo + Caio Salgado <jaodsilv@linux.ime.usp.br>
145   -João M. M. da Silva + Alessandro Palmeira + Diego Araújo <jaodsilv@linux.ime.usp.br>
146   -Joao M. M. da Silva + Alessandro Palmeira <jaodsilv@linux.ime.usp.br>
147   -João M. M. da Silva + Alessandro Palmeira <jaodsilv@linux.ime.usp.br>
148   -João M. M. da Silva + Alessandro Palmeira + João Machini <jaodsilv@linux.ime.usp.br>
149   -João M. M. da Silva + Caio Salgado + Alessandro Palmeira <jaodsilv@linux.ime.usp.br>
150   -João M. M. da Silva + Caio Salgado <jaodsilv@linux.ime.usp.br>
151   -João M. M. da Silva + Carlos Morais <jaodsilv@linux.ime.usp.br>
152   -João M. M. da Silva + Diego Araújo <diegoamc90@gmail.com>
153   -João M. M. da Silva + Diego Araújo <jaodsilv@linux.ime.usp.br>
154   -João M. M. da Silva + Diego Araújo + Pedro Leal <jaodsilv@linux.ime.usp.br>
155   -João M. M. da Silva <jaodsilv@linux.ime.usp.br>
156   -Joao M. M. da Silva + Jefferson Fernandes <jaodsilv@linux.ime.usp.br>
157   -João M. M. da Silva + Jefferson Fernandes <jaodsilv@linux.ime.usp.br>
158   -João M. M. da Silva + João M. Miranda <jaodsilv@linux.ime.usp.br>
159   -João M. M. da Silva + Paulo Meirelles <jaodsilv@linux.ime.usp.br>
160   -João M. M. da Silva + Pedro Leal <jaodsilv@linux.ime.usp.br>
161   -João M. M. da Silva + Rafael Manzo + Diego Araújo <jaodsilv@linux.ime.usp.br>
162   -João M. M. da Silva + Rafael Manzo <jaodsilv@linux.ime.usp.br>
163   -João M. M. da Silva + Renan Teruo <jaodsilv@linux.ime.usp.br>
164   -João M. M. Silva + Caio Salgado <jaodsilv@linux.ime.usp.br>
165   -João M. M. Silva + Diego Araújo <jaodsilv@linux.ime.usp.br>
166   -Joao M. M. Silva + Jefferson Fernandes <jaodsilv@linux.ime.usp.br>
167   -João M. M. Silva + Paulo Meirelles <jaodsilv@linux.ime.usp.br>
168   -João M. M. Silva + Rafael Manzo <jaodsilv@linux.ime.usp.br>
169   -João M. M. Silva + Renan Teruo <jaodsilv@linux.ime.usp.br>
170   -Joenio Costa <joenio@colivre.coop.br>
171   -Josef Spillner <josef.spillner@tu-dresden.de>
172   -Junior Silva <junior@bajor.localhost.localdomain>
173   -Junior Silva <juniorsilva1001@gmail.com>
174   -Junior Silva <juniorsilva7@juniorsilva-Aspire-5750Z.(none)>
175   -Junior Silva <juniorsilva@colivre.coop.br>
176   -juniorsilva <juniorsilva@QonoS.localhost.localdomain>
177   -Keilla Menezes <keilla@colivre.coop.br>
178   -Larissa Reis <larissa@colivre.coop.br>
179   -Larissa Reis <reiss.larissa@gmail.com>
180   -Leandro Nunes dos Santos <81665687568@serpro-1541727.Home>
181   -Leandro Nunes dos Santos <81665687568@serpro-1541727.(none)>
182   -Leandro Nunes dos Santos <leandronunes@gmail.com>
183   -Leandro Nunes dos Santos <leandro.santos@serpro.gov.br>
184   -LinguÁgil 2010 <linguagil.bahia@gmail.com>
185   -Lucas Melo <lucas@colivre.coop.br>
186   -Lucas Melo <lucaspradomelo@gmail.com>
187   -Luciano <lucianopcbr@gmail.com>
188   -Luis David Aguilar Carlos <ludwig9003@gmail.com>
189   -Luiz Fernando de Freitas Matos <luiz@luizff.matos@gmail.com>
190   -Marcos Ramos <ms.ramos@outlook.com>
191   -Martín Olivera <molivera@solar.org.ar>
192   -Moises Machado <moises@colivre.coop.br>
193   -Naíla Alves <naila@colivre.coop.br>
194   -Nanda Lopes <nanda.listas+psl@gmail.com>
195   -Paulo Meirelles + Alessandro Palmeira + João M. M. da Silva <paulo@softwarelivre.org>
196   -Paulo Meirelles + Alessandro Palmeira <paulo@softwarelivre.org>
197   -Paulo Meirelles + Carlos Morais <paulo@softwarelivre.org>
198   -Paulo Meirelles + Diego Araújo <paulo@softwarelivre.org>
199   -Paulo Meirelles + João M. M. da Silva <paulo@softwarelivre.org>
200   -Paulo Meirelles <paulo@softwarelivre.org>
201   -Paulo Meirelles + Rafael Manzo <paulo@softwarelivre.org>
202   -Rafael Gomes <rafaelgomes@techfree.com.br>
203   -Rafael Manzo + Alessandro Palmeira <rr.manzo@gmail.com>
204   -Rafael Manzo + Daniel Alves <danpaulalves@gmail.com>
205   -Rafael Manzo + Diego Araújo <rr.manzo@gmail.com>
206   -Rafael Manzo + João M. M. Silva <rr.manzo@gmail.com>
207   -Rafael Manzo + Paulo Meirelles <rr.manzo@gmail.com>
208   -Rafael Martins <rmmartins@gmail.com>
209   -Rafael Reggiani Manzo + Caio Salgado + Jefferson Fernandes <rr.manzo@gmail.com>
210   -Rafael Reggiani Manzo + Diego Araujo <diegoamc90@gmail.com>
211   -Rafael Reggiani Manzo + Diego Araujo <rr.manzo@gmail.com>
212   -Rafael Reggiani Manzo + Diego Araújo <rr.manzo@gmail.com>
213   -Rafael Reggiani Manzo + João M. M. da Silva <rr.manzo@gmail.com>
214   -Rafael Reggiani Manzo <rr.manzo@gmail.com>
215   -Raphaël Rousseau <raph@r4f.org>
216   -Raquel Lira <raquel.lira@gmail.com>
217   -Renan Teruo + Caio Salgado <renanteruoc@gmail.com>
218   -Renan Teruoc + Diego Araujo <renanteruoc@gmail.com>
219   -Renan Teruo + Diego Araujo <renanteruoc@gmail.com>
220   -Renan Teruo + Diego Araújo <renanteruoc@gmail.com>
221   -Renan Teruo + Paulo Meirelles <renanteruoc@gmail.com>
222   -Renan Teruo + Rafael Manzo <renanteruoc@gmail.com>
223   -Rodrigo Souto + Ana Losnak + Daniel Bucher + Caio Almeida + Leandro Nunes + Daniela Feitosa + Mariel Zasso <noosfero-br@listas.softwarelivre.org>
224   -Rodrigo Souto <diguliu@gmail.com>
225   -Rodrigo Souto <rodrigo@colivre.coop.br>
226   -Ronny Kursawe <kursawe.ronny@googlemail.com>
227   -root <root@debian.sdr.serpro>
228   -Samuel R. C. Vale <srcvale@holoscopio.com>
229   -Valessio Brito <contato@valessiobrito.com.br>
230   -Valessio Brito <contato@valessiobrito.info>
231   -Valessio Brito <valessio@gmail.com>
232   -vfcosta <vfcosta@gmail.com>
233   -Victor Carvalho <victorhugodf.ac@gmail.com>
234   -Victor Costa <vfcosta@gmail.com>
235   -Victor Hugo Alves de Carvalho <victorhugodf.ac@gmail.com>
236   -Vinicius Cubas Brand <viniciuscb@gmail.com>
237   -Visita <visita@debian.(none)>
238   -Yann Lugrin <yann.lugrin@liquid-concept.ch>
239   -
240   -Ideas, specifications and incentive
241   -===================================
242   -Daniel Tygel <dtygel@fbes.org.br>
243   -Guilherme Rocha <guilherme@gf7.com.br>
244   -Raphael Rousseau <raph@r4f.org>
245   -Théo Bondolfi <move@cooperation.net>
246   -Vicente Aguiar <vicenteaguiar@colivre.coop.br>
247   -
248   -Arts
249   -===================================
250   -Nara Oliveira <narananet@gmail.com>
AUTHORS.md
1   -If you are not listed here, but should be, please write to the noosfero mailing list: http://listas.softwarelivre.org/cgi-bin/mailman/listinfo/noosfero-dev (this list requires subscription to post, but since you are an author of noosfero, that's not a problem).
  1 +If you are not listed here, but should be, please write to the noosfero mailing
  2 +list: http://listas.softwarelivre.org/cgi-bin/mailman/listinfo/noosfero-dev
  3 +(this list requires subscription to post, but since you are an author of
  4 +noosfero, that's not a problem).
2 5  
3 6 Developers
4 7 ==========
5 8  
  9 +Ábner Silva de Oliveira <abner.oliveira@serpro.gov.br>
6 10 Alan Freihof Tygel <alantygel@gmail.com>
  11 +alcampelo <alcampelo@alcampelo.(none)>
7 12 Alessandro Palmeira <alessandro.palmeira@gmail.com>
8 13 Alessandro Palmeira + Caio C. Salgado <alessandro.palmeira@gmail.com>
9 14 Alessandro Palmeira + Caio Salgado <alessandro.palmeira@gmail.com>
... ... @@ -35,9 +40,12 @@ Alessandro Palmeira + João M. M. Silva &lt;alessandro.palmeira@gmail.com&gt;
35 40 Alessandro Palmeira + Paulo Meirelles <alessandro.palmeira@gmail.com>
36 41 Alessandro Palmeira + Paulo Meirelles + João M. M. da Silva <alessandro.palmeira@gmail.com>
37 42 Alessandro Palmeira + Rafael Manzo <alessandro.palmeira@gmail.com>
  43 +Ana Losnak <analosnak@gmail.com>
38 44 Antonio Terceiro + Carlos Morais <terceiro@colivre.coop.br>
39 45 Antonio Terceiro + Paulo Meirelles <terceiro@colivre.coop.br>
40 46 Antonio Terceiro <terceiro@colivre.coop.br>
  47 +Arthur Del Esposte <arthurmde@gmail.com>
  48 +Arthur Del Esposte <arthurmde@yahoo.com.br>
41 49 Aurelio A. Heckert <aurelio@colivre.coop.br>
42 50 Braulio Bhavamitra <brauliobo@gmail.com>
43 51 Bráulio Bhavamitra <brauliobo@gmail.com>
... ... @@ -65,11 +73,14 @@ Caio Salgado + Renan Teruo &lt;caio.salgado@gmail.com&gt;
65 73 Caio Salgado + Renan Teruo + Jefferson Fernandes <jeffs.fernandes@gmail.com>
66 74 Caio Salgado + Renan Teruo <renanteruoc@gmail.com>
67 75 Caio SBA <caio@colivre.coop.br>
  76 +Caio Tiago Oliveira <caiotiago@colivre.coop.br>
  77 +Carlos Andre de Souza <carlos.andre.souza@msn.com>
68 78 Carlos Morais <carlos88morais@gmail.com>
69 79 Carlos Morais + Diego Araújo <diegoamc90@gmail.com>
70 80 Carlos Morais + Eduardo Morais <carlos88morais@gmail.com>
71 81 Carlos Morais + Paulo Meirelles <carlos88morais@gmail.com>
72 82 Carlos Morais + Pedro Leal <carlos88morais@gmail.com>
  83 +Daniela Feitosa <dani@dohko.(none)>
73 84 Daniel Alves + Diego Araújo <danpaulalves@gmail.com>
74 85 Daniel Alves + Diego Araújo <diegoamc90@gmail.com>
75 86 Daniel Alves + Diego Araújo + Guilherme Rojas <danpaulalves@gmail.com>
... ... @@ -78,7 +89,9 @@ Daniel Alves + Diego Araújo + Guilherme Rojas &lt;guilhermehrojas@gmail.com&gt;
78 89 Daniel Alves + Guilherme Rojas <danpaulalves@gmail.com>
79 90 Daniel Alves + Rafael Manzo <rr.manzo@gmail.com>
80 91 Daniela Soares Feitosa <danielafeitosa@colivre.coop.br>
  92 +Daniel Bucher <daniel.bucher88@gmail.com>
81 93 Daniel Cunha <daniel@colivre.coop.br>
  94 +David Carlos <ddavidcarlos1392@gmail.com>
82 95 diegoamc <diegoamc90@gmail.com>
83 96 Diego Araújo + Alessandro Palmeira <diegoamc90@gmail.com>
84 97 Diego Araújo + Alessandro Palmeira + João M. M. da Silva <diegoamc90@gmail.com>
... ... @@ -107,15 +120,25 @@ Diego + Jefferson &lt;diegoamc90@gmail.com&gt;
107 120 Diego Martinez <diegoamc90@gmail.com>
108 121 Diego Martinez <diego@diego-K55A.(none)>
109 122 Diego + Renan <renanteruoc@gmail.com>
  123 +Eduardo Tourinho Edington <eduardo.edington@serpro.gov.br>
  124 +Evandro Jr <evandrojr@gmail.com>
  125 +Evandro Junior <evandrojr@gmail.com>
  126 +Fabio Teixeira <fabio1079@gmail.com>
110 127 Fernanda Lopes <nanda.listas+psl@gmail.com>
111 128 Francisco Marcelo A. Lima Júnior <francisco.lima-junior@serpro.gov.br>
112 129 Francisco Marcelo de Araujo Lima Junior <79350259591@serpro-1457614.(none)>
  130 +Francisco Marcelo de Araújo Lima Júnior <francisco.lima-junior@serpro.gov.br>
  131 +Francisco Marcelo de Araújo Lima Júnior <maljunior@gmail.com>
  132 +Gabriela Navarro <navarro1703@gmail.com>
113 133 Grazieno Pellegrino <grazieno@gmail.com>
  134 +Gust <darksshades@hotmail.com>
  135 +Hugo Melo <hugo@riseup.net>
114 136 Isaac Canan <isaac@intelletto.com.br>
115 137 Italo Valcy <italo@dcc.ufba.br>
116 138 Jefferson Fernandes + Diego Araujo + Rafael Manzo <jeffs.fernandes@gmail.com>
117 139 Jefferson Fernandes + Joao M. M. da Silva <jeffs.fernandes@gmail.com>
118 140 Jefferson Fernandes + Joao M. M. Silva <jeffs.fernandes@gmail.com>
  141 +João da Silva + Eduardo Morais + Rafael Manzo <rr.manzo@gmail.com>
119 142 João da Silva <jaodsilv@linux.ime.usp.br>
120 143 João Marco Maciel da Silva + Rafael Manzo + Renan Teruo <jaodsilv@linux.ime.usp.br>
121 144 João M. M. da Silva + Alessandro Palmeira + Diego Araújo + Caio Salgado <jaodsilv@linux.ime.usp.br>
... ... @@ -146,17 +169,29 @@ João M. M. Silva + Rafael Manzo &lt;jaodsilv@linux.ime.usp.br&gt;
146 169 João M. M. Silva + Renan Teruo <jaodsilv@linux.ime.usp.br>
147 170 Joenio Costa <joenio@colivre.coop.br>
148 171 Josef Spillner <josef.spillner@tu-dresden.de>
  172 +Jose Pedro <1jpsneto@gmail.com>
  173 +Junior Silva <junior@bajor.localhost.localdomain>
  174 +Junior Silva <junior@sedeantigo.colivre.coop.br>
149 175 Junior Silva <juniorsilva1001@gmail.com>
150 176 Junior Silva <juniorsilva7@juniorsilva-Aspire-5750Z.(none)>
  177 +Junior Silva <juniorsilva@colivre.coop.br>
  178 +juniorsilva <juniorsilva@QonoS.localhost.localdomain>
151 179 Keilla Menezes <keilla@colivre.coop.br>
152 180 Larissa Reis <larissa@colivre.coop.br>
153 181 Larissa Reis <reiss.larissa@gmail.com>
  182 +Leandro Alves <leandrosustenido@gmail.com>
  183 +Leandro Nunes dos Santos <81665687568@serpro-1541727.Home>
  184 +Leandro Nunes dos Santos <81665687568@serpro-1541727.(none)>
154 185 Leandro Nunes dos Santos <leandronunes@gmail.com>
155 186 Leandro Nunes dos Santos <leandro.santos@serpro.gov.br>
156 187 LinguÁgil 2010 <linguagil.bahia@gmail.com>
157 188 Lucas Melo <lucas@colivre.coop.br>
158 189 Lucas Melo <lucaspradomelo@gmail.com>
  190 +Luciano <lucianopcbr@gmail.com>
  191 +Luciano Prestes Cavalcanti <lucianopcbr@gmail.com>
159 192 Luis David Aguilar Carlos <ludwig9003@gmail.com>
  193 +Luiz Fernando de Freitas Matos <luiz@luizff.matos@gmail.com>
  194 +Marcos Ramos <ms.ramos@outlook.com>
160 195 Martín Olivera <molivera@solar.org.ar>
161 196 Moises Machado <moises@colivre.coop.br>
162 197 Naíla Alves <naila@colivre.coop.br>
... ... @@ -189,14 +224,19 @@ Renan Teruo + Diego Araujo &lt;renanteruoc@gmail.com&gt;
189 224 Renan Teruo + Diego Araújo <renanteruoc@gmail.com>
190 225 Renan Teruo + Paulo Meirelles <renanteruoc@gmail.com>
191 226 Renan Teruo + Rafael Manzo <renanteruoc@gmail.com>
  227 +Rodrigo Souto + Ana Losnak + Daniel Bucher + Caio Almeida + Leandro Nunes + Daniela Feitosa + Mariel Zasso <noosfero-br@listas.softwarelivre.org>
192 228 Rodrigo Souto <diguliu@gmail.com>
193 229 Rodrigo Souto <rodrigo@colivre.coop.br>
194 230 Ronny Kursawe <kursawe.ronny@googlemail.com>
195 231 root <root@debian.sdr.serpro>
196 232 Samuel R. C. Vale <srcvale@holoscopio.com>
  233 +Valessio Brito <contato@valessiobrito.com.br>
  234 +Valessio Brito <contato@valessiobrito.info>
197 235 Valessio Brito <valessio@gmail.com>
198 236 vfcosta <vfcosta@gmail.com>
  237 +Victor Carvalho <victorhugodf.ac@gmail.com>
199 238 Victor Costa <vfcosta@gmail.com>
  239 +Victor Hugo Alves de Carvalho <victorhugodf.ac@gmail.com>
200 240 Vinicius Cubas Brand <viniciuscb@gmail.com>
201 241 Visita <visita@debian.(none)>
202 242 Yann Lugrin <yann.lugrin@liquid-concept.ch>
... ...
Gemfile
... ... @@ -15,6 +15,8 @@ gem &#39;thin&#39;
15 15 gem 'hpricot'
16 16 gem 'nokogiri'
17 17 gem 'rake', :require => false
  18 +gem 'rest-client'
  19 +gem 'exception_notification'
18 20  
19 21 # FIXME list here all actual dependencies (i.e. the ones in debian/control),
20 22 # with their GEM names (not the Debian package names)
... ... @@ -30,7 +32,6 @@ group :test do
30 32 end
31 33  
32 34 group :cucumber do
33   - gem 'rake'
34 35 gem 'cucumber-rails', :require => false
35 36 gem 'capybara'
36 37 gem 'cucumber'
... ...
Gemfile.lock
... ... @@ -61,7 +61,10 @@ GEM
61 61 database_cleaner (1.2.0)
62 62 diff-lcs (1.1.3)
63 63 erubis (2.7.0)
64   - eventmachine (0.12.11)
  64 + eventmachine (0.12.10)
  65 + exception_notification (4.0.1)
  66 + actionmailer (>= 3.0.4)
  67 + activesupport (>= 3.0.4)
65 68 fast_gettext (0.6.8)
66 69 ffi (1.0.11)
67 70 gherkin (2.4.21)
... ... @@ -111,6 +114,8 @@ GEM
111 114 thor (>= 0.14.6, < 2.0)
112 115 rake (0.9.2.2)
113 116 rdoc (3.9.4)
  117 + rest-client (1.6.7)
  118 + mime-types (>= 1.16)
114 119 rmagick (2.13.1)
115 120 rspec (2.10.0)
116 121 rspec-core (~> 2.10.0)
... ... @@ -165,6 +170,7 @@ DEPENDENCIES
165 170 daemons
166 171 dalli
167 172 database_cleaner
  173 + exception_notification
168 174 fast_gettext
169 175 hpricot
170 176 mocha
... ... @@ -175,6 +181,7 @@ DEPENDENCIES
175 181 rails
176 182 rails_autolink
177 183 rake
  184 + rest-client
178 185 rmagick
179 186 rspec
180 187 rspec-rails
... ...
INSTALL.chat.md
1   -XMPP/Chat Client Setup
2   -======================
  1 +XMPP/Chat Setup
  2 +===============
3 3  
4   -To configure XMPP/BOSH in Noosfero you need:
  4 +The samples of config file to configure a XMPP/BOSH server with ejabberd,
  5 +postgresql and apache2 can be found at util/chat directory.
5 6  
6   -* REST Client - http://github.com/archiloque/rest-client
7   -* SystemTimer - http://ph7spot.com/musings/system-timer
8   -* Pidgin data files - http://www.pidgin.im/
  7 +This setup supposes that you are using Noosfero installed via Debian package
  8 +in a production environment.
9 9  
10   -If you use Debian 6.0 (squeeze):
11   -
12   - # apt-get install librestclient-ruby pidgin-data ruby1.8-dev
13   - # gem install SystemTimer
14   -
15   -The samples of config file to configure a XMPP/BOSH server with ejabberd, postgresql and apache2 can be found at util/chat directory.
16   -
17   -XMPP/Chat Server Setup
18   -======================
  10 +Steps
  11 +=====
19 12  
20 13 This is a step-by-step guide to get a XMPP service working, in a Debian system.
21 14  
22 15 ## 1. Install the required packages
23 16  
24   - # apt-get install ejabberd odbc-postgresql
  17 + # apt-get install ejabberd odbc-postgresql librestclient-ruby pidgin-data ruby1.8-dev
  18 + # gem install SystemTimer
25 19  
26 20 ## 2. Ejabberd configuration
27 21  
28   -All the following changes must be done in config file: `/etc/ejabberd/ejabberd.cfg`
29   -
30   -### 2.1. Set the default admin user
31   -
32   - { acl, admin, { user, "john", "www.example.com" } }.
33   - { acl, admin, { user, "bart", "www.example.com" } }.
34   -
35   -### 2.2. Set the default host
36   -
37   - { hosts, [ "www.example.com" ] }.
38   -
39   -### 2.3. Http-Bind activation
40   -
41   - { 5280, ejabberd_http, [
42   - http_bind,
43   - web_admin
44   - ]
45   - }
46   -
47   - (...)
48   -
49   - { modules, [
50   - {mod_http_bind, []},
51   - ...
52   - ] }.
53   -
54   -Ejabberd creates semi-anonymous rooms by default, but Noosfero's Jabber client needs non-anonymous room, then we need to change default params of creation rooms in ejabberd to create non-anonymous rooms.
55   -
56   -In non-anonymous rooms the jabber service sends the new occupant's full JID to all occupants in the room [[1]].
  22 + # cp /usr/share/noosfero/util/chat/ejabberd.cfg /etc/ejabberd/
57 23  
58   -Add option "`{default_room_options, [{anonymous, false}]}`" to `/etc/ejabberd/ejabberd.cfg` in mod_muc session. See below:
  24 +Edit the /etc/ejabberd/ejabberd.cfg file and set your domain on the first 2 lines.
59 25  
60   - { mod_muc, [
61   - %%{host, "conference.@HOST@"},
62   - {access, muc},
63   - {access_create, muc},
64   - {access_persistent, muc},
65   - {access_admin, muc_admin},
66   - {max_users, 500},
67   - {default_room_options, [{anonymous, false}]}
68   - ]},
69   -
70   -[1]: http://xmpp.org/extensions/xep-0045.html#enter-nonanon
71   -
72   -
73   -### 2.4. Authentication method
74   -
75   -To use Postgresql through ODBC, the following modifications must be done:
76   -
77   - * Disable the default method:
78   - `{auth_method, internal}.`
79   -
80   - * Enable autheticantion through ODBC:
81   - `{auth_method, odbc}.`
  26 +## 3. Configuring Postgresql
82 27  
83   - * Set database server name
84   - `{odbc_server, "DSN=PostgreSQLEjabberdNoosfero"}.`
  28 +Give permission to noosfero user create new roles, login as
  29 +postgres user and execute:
85 30  
  31 + $ psql
  32 + postgres=# GRANT CREATE ON DATABASE noosfero TO noosfero;
86 33  
87   -### 2.5. Increase the shaper traffic limit
  34 +Change the postgresql authentication method to md5 instead of ident,
  35 +add the following line to the file /etc/postgresql/8.4/main/pg_hba.conf:
88 36  
89   - { shaper, normal, { maxrate, 10000000 } }.
  37 + # Noosfero user
  38 + local noosfero noosfero md5
90 39  
  40 +(add this line before the following line)
91 41  
92   -### 2.6. Disable unused modules
  42 + # "local" is for Unix domain socket connections only
  43 + local all all ident
93 44  
94   -Unused modules can be disabled, for example:
  45 +Restart postgresql server:
95 46  
96   - * s2s
97   - * web_admin
98   - * mod_pubsub
99   - * mod_irc
100   - * mod_offline
101   - * mod_admin_extra
102   - * mod_register
  47 + # service postgresql restart
103 48  
  49 +Login as noosfero user, and execute:
104 50  
105   -### 2.7. Enable ODBC modules
  51 + $ psql -U noosfero -W noosfero < /usr/share/noosfero/util/chat/postgresql/ejabberd.sql
106 52  
107   - * mod_privacy -> mod_privacy_odbc
108   - * mod_private -> mod_private_odbc
109   - * mod_roster -> mod_roster_odbc
  53 +(see database password in the /etc/noosfero/database.yml file)
110 54  
111   -## 3. Configuring Postgresql
  55 +This will create a new schema inside the noosfero database, called `ejabberd`.
112 56  
113   -Login as noosfero user, and execute:
  57 +Note that there should be at least one domain with `is_default = true` in
  58 +`domains` table, otherwise people won't be able to see their friends online.
114 59  
115   - $ psql noosfero < /path/to/noosfero/util/chat/postgresql/ejabberd.sql
  60 +## 4. ODBC configuration
116 61  
117   -Where `noosfero` may need to be replace by the name of the database used for Noosfero.
  62 +Create the following files:
118 63  
119   -This will create a new schema inside the noosfero database, called `ejabberd`.
  64 + # cp /usr/share/noosfero/util/chat/odbc.ini /etc/
  65 + # cp /usr/share/noosfero/util/chat/odbcinst.ini /etc/
120 66  
121   -Note `noosfero` user should have permission to create Postgresql schemas. Also, there should be at least one domain with `is_default = true` in `domains` table, otherwise people won't be able to see their friends online.
  67 +Edit the odbc.ini file and set the password for the database user, see
  68 +the file /etc/noosfero/database.yml to get the password.
122 69  
123   -## 4. ODBC configuration
  70 +Adjust premissions:
124 71  
125   -The following files must be created:
126   -
127   -`/etc/odbc.ini`:
128   -
129   - [PostgreSQLEjabberdNoosfero]
130   - Description = PostgreSQL Noosfero ejabberd database
131   - Driver = PostgreSQL Unicode
132   - Trace = No
133   - TraceFile = /tmp/psqlodbc.log
134   - Database = noosfero
135   - Servername = localhost
136   - UserName = <DBUSER>
137   - Password = <DBPASS>
138   - Port =
139   - ReadOnly = No
140   - RowVersioning = No
141   - ShowSystemTables = No
142   - ShowOidColumn = No
143   - FakeOidIndex = No
144   - ConnSettings = SET search_path TO ejabberd
145   -
146   -`/etc/odbcinst.ini`:
147   -
148   - [PostgreSQL Unicode]
149   - Description = PostgreSQL ODBC driver (Unicode version)
150   - Driver = /usr/lib/odbc/psqlodbcw.so
151   - Setup = /usr/lib/odbc/libodbcpsqlS.so
152   - Debug = 0
153   - CommLog = 1
154   - UsageCount = 3
  72 + # chmod 640 /etc/odbc.ini
  73 + # chown ejabberd /etc/odbc.ini
155 74  
156 75 ## 4.1 testing all:
157 76  
... ... @@ -159,7 +78,6 @@ The following files must be created:
159 78  
160 79 If the configuration was done right, the message "Connected!" will be displayed.
161 80  
162   -
163 81 ## 5. Enabling kernel polling and SMP in `/etc/default/ejabberd`
164 82  
165 83 POLL=true
... ... @@ -205,32 +123,45 @@ Note: module proxy_http must be enabled:
205 123  
206 124 # a2enmod proxy_http
207 125  
208   -## 8. DNS configuration
  126 +Restart services:
209 127  
210   -For this point, we assume you are using BIND as your DNS server. You need to add the following entries to the DNS zone file corresponding to the domain of your noosfero site:
  128 + # service ejabberd restart
  129 + # service noosfero restart
  130 + # service apache2 restart
211 131  
212   - _xmpp-client._tcp SRV 5 100 5222 master
213   - conference CNAME master
214   - _xmpp-client._tcp.conference SRV 5 100 5222 master
  132 +## 8. Test Apache Configuration
215 133  
216   -If you are running a DNS server other than BIND, you will have to figure out how to create equivalente rules for your zone file. Patches to this documentation are welcome.
  134 +Open in your browser the address:
217 135  
218   -## 9. Testing this Setup
  136 + http://<yout domain>/http-bind
219 137  
220   -Adjust shell limits to proceed with some benchmarks and load tests:
  138 +You should see a page with a message like that:
221 139  
222   - # ulimit −s 256
223   - # ulimit −n 8192
224   - # echo 10 > /proc/sys/net/ipv4/tcp_syn_retries
  140 + ejabberd mod_http_bind
  141 + An implementation of XMPP over BOSH (XEP-0206)
  142 + This web page is only informative. To use HTTP-Bind you need a Jabber/XMPP
  143 + client that supports it.
225 144  
226   -To measure the bandwidth between server and client:
  145 +## 9. Test chat session
227 146  
228   - * at server side:
229   - `# iperf −s`
  147 +Open Noosfero console and execute:
230 148  
231   - * at client side:
232   - `# iperf −c server_ip`
  149 +>> environment = Environment.default
  150 +>> user = Person['guest']
  151 +>> password = user.user.crypted_password
  152 +>> login = user.jid
  153 +>> RubyBOSH.initialize_session(login, password, "http://#{environment.default_hostname}/http-bind", :wait => 30, :hold => 1, :window => 5
233 154  
234   -For heavy load tests, clone and use this software:
  155 +If you have luck, should see something like that:
235 156  
236   - $ git clone http://git.holoscopio.com/git/metal/tester.git
  157 +Ruby-BOSH - SEND
  158 +<body window="5" rid="60265" xmlns="http://jabber.org/protocol/httpbind" xmlns:xmpp="urn:xmpp:xbosh" to="vagrant-debian-squeeze.vagrantup.com" wait="30" xmpp:version="1.0" hold="1"/>
  159 +Ruby-BOSH - SEND
  160 +<body rid="60266" xmlns="http://jabber.org/protocol/httpbind" sid="24cdfc43646a2af1059a7060b677c2e11b26f34f" xmlns:xmpp="urn:xmpp:xbosh" xmpp:version="1.0"><auth mechanism="PLAIN" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">Z3Vlc3RAdmFncmFudC1kZWJpYW4tc3F1ZWV6ZS52YWdyYW50dXAuY29tAGd1ZXN0ADEzZTFhYWVlYjRhYjZlMTA0MmRkNWI1YWY0MzM4MjA1OGJiOWZmNzk=</auth></body>
  161 +Ruby-BOSH - SEND
  162 +<body xmpp:restart="true" rid="60267" xmlns="http://jabber.org/protocol/httpbind" sid="24cdfc43646a2af1059a7060b677c2e11b26f34f" xmlns:xmpp="urn:xmpp:xbosh" xmpp:version="1.0"/>
  163 +Ruby-BOSH - SEND
  164 +<body rid="60268" xmlns="http://jabber.org/protocol/httpbind" sid="24cdfc43646a2af1059a7060b677c2e11b26f34f" xmlns:xmpp="urn:xmpp:xbosh" xmpp:version="1.0"><iq type="set" xmlns="jabber:client" id="bind_29330"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>bosh_9631</resource></bind></iq></body>
  165 +Ruby-BOSH - SEND
  166 +<body rid="60269" xmlns="http://jabber.org/protocol/httpbind" sid="24cdfc43646a2af1059a7060b677c2e11b26f34f" xmlns:xmpp="urn:xmpp:xbosh" xmpp:version="1.0"><iq type="set" xmlns="jabber:client" id="sess_21557"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq></body>
  167 +=> ["guest@vagrant-debian-squeeze.vagrantup.com", "24cdfc43646a2af1059a7060b677c2e11b26f34f", 60270]
... ...
INSTALL.https.md 0 → 100644
... ... @@ -0,0 +1,115 @@
  1 +Setup Noosfero to use HTTPS
  2 +===========================
  3 +
  4 +This document assumes that you have a fully and clean Noosfero
  5 +installation as explained at the `INSTALL.md` file.
  6 +
  7 +SSL certificate
  8 ++++++++++++++++
  9 +
  10 +You should get a valid SSL certificate, but if you want to test
  11 +your setup before, you could generate a self-signed certificate
  12 +as below:
  13 +
  14 + # mkdir /etc/noosfero/ssl
  15 + # cd /etc/noosfero/ssl
  16 + # openssl genrsa 1024 > noosfero.key
  17 + # openssl req -new -x509 -nodes -sha1 -days $[10*365] -key noosfero.key > noosfero.cert
  18 + # cat noosfero.key noosfero.cert > noosfero.pem
  19 +
  20 +There are two ways of using SSL with Noosfero: 1) If you are not using
  21 +Varnish; and 2) If you are using Varnish.
  22 +
  23 +1) If you are are not using Varnish
  24 ++++++++++++++++++++++++++++++++++++
  25 +
  26 +Simply do a redirect in apache to force all connections with SSL:
  27 +
  28 + <VirtualHost *:8080>
  29 + ServerName test.stoa.usp.br
  30 +
  31 + Redirect / https://example.com/
  32 + </VirtualHost>
  33 +
  34 +And set a vhost to receive then:
  35 +
  36 + <VirtualHost *:443>
  37 + ServerName example.com
  38 +
  39 + SSLEngine On
  40 + SSLCertificateFile /etc/ssl/certs/cert.pem
  41 + SSLCertificateKeyFile /etc/ssl/private/cert.key
  42 +
  43 + Include /etc/noosfero/apache/virtualhost.conf
  44 + </VirtualHost>
  45 +
  46 +Be aware that if you had configured varnish, the requests won't reach
  47 +it with this configuration.
  48 +
  49 +2) If you are using Varnish
  50 ++++++++++++++++++++++++++++
  51 +
  52 +Varnish isn't able to communicate with the SSL protocol, so we will
  53 +need some one who do this and Pound[1] can do the job. In order to
  54 +install it in Debian based systems:
  55 +
  56 + $ sudo apt-get install pound
  57 +
  58 +Set Varnish to listen in other port than 80:
  59 +
  60 +/etc/defaults/varnish
  61 +---------------------
  62 +
  63 + DAEMON_OPTS="-a localhost:6081 \
  64 + -T localhost:6082 \
  65 + -f /etc/varnish/default.vcl \
  66 + -S /etc/varnish/secret \
  67 + -s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G"
  68 +
  69 +Configure Pound:
  70 +
  71 + # cp /usr/share/noosfero/etc/pound.cfg /etc/pound/
  72 +
  73 +Edit /etc/pound.cfg and set the IP and domain of your server.
  74 +
  75 +Configure Pound to start at system initialization:
  76 +
  77 +/etc/default/pound
  78 +------------------
  79 +
  80 + startup=1
  81 +
  82 +Set Apache to only listen to localhost:
  83 +
  84 +/etc/apache2/ports.conf
  85 +-----------------------
  86 +
  87 + Listen 127.0.0.1:8080
  88 +
  89 +Restart the services:
  90 +
  91 + $ sudo service apache2 restart
  92 + $ sudo service varnish restart
  93 +
  94 +Start pound:
  95 +
  96 + $ sudo service pound start
  97 +
  98 +[1] http://www.apsis.ch/pound
  99 +
  100 +Noosfero XMPP chat
  101 +++++++++++++++++++
  102 +
  103 +If you want to use chat over HTTPS, then you should add the domain
  104 +and IP of your server in the /etc/hosts file, example:
  105 +
  106 +/etc/hosts
  107 +----------
  108 +
  109 + 192.168.1.86 mydomain.example.com
  110 +
  111 +Also, it's recomended that you remove lines above from the file
  112 +`/etc/apache2/sites-enabled/noosfero`:
  113 +
  114 + RewriteEngine On
  115 + Include /usr/share/noosfero/util/chat/apache/xmpp.conf
... ...
INSTALL.varnish.md
... ... @@ -24,10 +24,6 @@ Install the RPAF apache module (or skip this step if not using apache):
24 24  
25 25 3b) Edit `/etc/apache2/sites-enabled/*`, and change `<VirtualHost *:80>` to `<VirtualHost *:8080>`
26 26  
27   -3c) Restart apache
28   -
29   - # invoke-rc.d apache2 restart
30   -
31 27 4) Varnish configuration
32 28  
33 29 4a) Edit `/etc/default/varnish`
... ... @@ -44,10 +40,6 @@ On manual installations, change `/etc/noosfero/*` to `{Rails.root}/etc/noosfero/
44 40  
45 41 **NOTE**: it is very important that the `*.vcl` files are included in that order, i.e. *first* include `varnish-noosfero.vcl`, and *after* `noosfero-accept-language.cvl`.
46 42  
47   -4c) Restart Varnish
48   -
49   - # invoke-rc.d varnish restart
50   -
51 43 5) Enable varnish logging:
52 44  
53 45 5a) Edit `/etc/default/varnishncsa` and uncomment the line that contains:
... ... @@ -56,8 +48,10 @@ On manual installations, change `/etc/noosfero/*` to `{Rails.root}/etc/noosfero/
56 48  
57 49 The varnish log will be written to `/var/log/varnish/varnishncsa.log` in an apache-compatible format. You should change your statistics generation software (e.g. awstats) to use that instead of apache logs.
58 50  
59   -5b) Restart Varnish Logging service
  51 +Thanks to Cosimo Streppone for varnish-accept-language. See http://github.com/cosimo/varnish-accept-language for more information.
60 52  
61   - # invoke-rc.d varnishncsa restart
  53 +6) Restart services
62 54  
63   -Thanks to Cosimo Streppone for varnish-accept-language. See http://github.com/cosimo/varnish-accept-language for more information.
  55 + # service apache2 restart
  56 + # service varnish restart
  57 + # service varnishncsa restart
... ...
Rakefile
1 1 #!/usr/bin/env rake
  2 +
2 3 # Add your own tasks in files placed in lib/tasks ending in .rake,
3 4 # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
4 5  
... ...
app/controllers/admin/categories_controller.rb
... ... @@ -45,9 +45,11 @@ class CategoriesController &lt; AdminController
45 45 if request.post?
46 46 @category.update_attributes!(params[:category])
47 47 @saved = true
  48 + session[:notice] = _("Category %s saved." % @category.name)
48 49 redirect_to :action => 'index'
49 50 end
50 51 rescue Exception => e
  52 + session[:notice] = _('Could not save category.')
51 53 render :action => 'edit'
52 54 end
53 55 end
... ...
app/controllers/my_profile/cms_controller.rb
... ... @@ -143,6 +143,7 @@ class CmsController &lt; MyProfileController
143 143 end
144 144  
145 145 @article.profile = profile
  146 + @article.author = user
146 147 @article.last_changed_by = user
147 148 @article.created_by = user
148 149  
... ... @@ -188,7 +189,18 @@ class CmsController &lt; MyProfileController
188 189 end
189 190 if request.post? && params[:uploaded_files]
190 191 params[:uploaded_files].each do |file|
191   - @uploaded_files << UploadedFile.create({:uploaded_data => file, :profile => profile, :parent => @parent, :last_changed_by => user}, :without_protection => true) unless file == ''
  192 + unless file == ''
  193 + @uploaded_files << UploadedFile.create(
  194 + {
  195 + :uploaded_data => file,
  196 + :profile => profile,
  197 + :parent => @parent,
  198 + :last_changed_by => user,
  199 + :author => user,
  200 + },
  201 + :without_protection => true
  202 + )
  203 + end
192 204 end
193 205 @errors = @uploaded_files.select { |f| f.errors.any? }
194 206 if @errors.any?
... ... @@ -232,7 +244,7 @@ class CmsController &lt; MyProfileController
232 244 @current_category = Category.find(params[:category_id])
233 245 @categories = @current_category.children
234 246 end
235   - render :template => 'shared/update_categories', :locals => { :category => @current_category }
  247 + render :template => 'shared/update_categories', :locals => { :category => @current_category, :object_name => 'article' }
236 248 end
237 249  
238 250 def publish
... ... @@ -248,12 +260,15 @@ class CmsController &lt; MyProfileController
248 260 end.compact unless params[:marked_groups].nil?
249 261 if request.post?
250 262 @failed = {}
  263 + if @marked_groups.empty?
  264 + return session[:notice] = _("Select some group to publish your article")
  265 + end
251 266 @marked_groups.each do |item|
252 267 task = ApproveArticle.create!(:article => @article, :name => item[:name], :target => item[:group], :requestor => profile)
253 268 begin
254 269 task.finish unless item[:group].moderated_articles?
255 270 rescue Exception => ex
256   - @failed[ex.message] ? @failed[ex.message] << item[:group].name : @failed[ex.message] = [item[:group].name]
  271 + @failed[ex.message] ? @failed[ex.message] << item[:group].name : @failed[ex.message] = [item[:group].name]
257 272 end
258 273 end
259 274 if @failed.blank?
... ...
app/controllers/my_profile/friends_controller.rb
... ... @@ -11,7 +11,7 @@ class FriendsController &lt; MyProfileController
11 11 def remove
12 12 @friend = profile.friends.find(params[:id])
13 13 if request.post? && params[:confirmation]
14   - profile.remove_friend(@friend)
  14 + Friendship.remove_friendship(profile, @friend)
15 15 redirect_to :action => 'index'
16 16 end
17 17 end
... ...
app/controllers/my_profile/memberships_controller.rb
... ... @@ -7,9 +7,9 @@ class MembershipsController &lt; MyProfileController
7 7 ra = profile.role_assignments.find_by_role_id(role.id)
8 8 ra.present? && ra.resource_type == 'Profile'
9 9 end
10   - @filter = params[:filter_type].blank? ? nil : params[:filter_type]
  10 + @filter = params[:filter_type].to_i
11 11 begin
12   - @memberships = @filter.nil? ? profile.memberships : profile.memberships_by_role(environment.roles.find(@filter))
  12 + @memberships = @filter.zero? ? profile.memberships : profile.memberships_by_role(environment.roles.find(@filter))
13 13 rescue ActiveRecord::RecordNotFound
14 14 @memberships = []
15 15 end
... ...
app/controllers/my_profile/profile_editor_controller.rb
... ... @@ -54,7 +54,7 @@ class ProfileEditorController &lt; MyProfileController
54 54 @current_category = Category.find(params[:category_id])
55 55 @categories = @current_category.children
56 56 end
57   - render :template => 'shared/update_categories', :locals => { :category => @current_category }
  57 + render :template => 'shared/update_categories', :locals => { :category => @current_category, :object_name => 'profile_data' }
58 58 end
59 59  
60 60 def header_footer
... ...
app/controllers/public/account_controller.rb
... ... @@ -2,7 +2,7 @@ class AccountController &lt; ApplicationController
2 2  
3 3 no_design_blocks
4 4  
5   - before_filter :login_required, :only => [:activation_question, :accept_terms, :activate_enterprise]
  5 + before_filter :login_required, :only => [:activation_question, :accept_terms, :activate_enterprise, :change_password]
6 6 before_filter :redirect_if_logged_in, :only => [:login, :signup]
7 7 before_filter :protect_from_bots, :only => :signup
8 8  
... ...
app/controllers/public/catalog_controller.rb
... ... @@ -11,7 +11,7 @@ class CatalogController &lt; PublicController
11 11 protected
12 12  
13 13 def check_enterprise_and_environment
14   - unless profile.kind_of?(Enterprise) && @profile.environment.enabled?('products_for_enterprises')
  14 + unless profile.enterprise? && @profile.environment.enabled?('products_for_enterprises')
15 15 redirect_to :controller => 'profile', :profile => profile.identifier, :action => 'index'
16 16 end
17 17 end
... ...
app/controllers/public/content_viewer_controller.rb
... ... @@ -31,8 +31,8 @@ class ContentViewerController &lt; ApplicationController
31 31  
32 32 if request.post? && @page.forum?
33 33 process_forum_terms_of_use(user, params[:terms_accepted])
34   - elsif is_a_forum_topic?(@page)
35   - redirect_to @page.parent.url unless @page.parent.agrees_with_terms?(user)
  34 + elsif is_a_forum_topic?(@page) && !@page.parent.agrees_with_terms?(user)
  35 + redirect_to @page.parent.url
36 36 return
37 37 end
38 38  
... ... @@ -74,7 +74,7 @@ class ContentViewerController &lt; ApplicationController
74 74 end
75 75  
76 76 def versions_diff
77   - path = params[:page].join('/')
  77 + path = params[:page]
78 78 @page = profile.articles.find_by_path(path)
79 79 @v1, @v2 = @page.versions.find_by_version(params[:v1]), @page.versions.find_by_version(params[:v2])
80 80 end
... ... @@ -216,6 +216,8 @@ class ContentViewerController &lt; ApplicationController
216 216 if @page.has_posts?
217 217 posts = get_posts(params[:year], params[:month])
218 218  
  219 + posts = posts.includes(:parent, {:profile => [:domains, :environment]}, :author)
  220 +
219 221 #FIXME Need to run this before the pagination because this version of
220 222 # will_paginate returns a will_paginate collection instead of a
221 223 # relation.
... ...
app/controllers/public/profile_controller.rb
... ... @@ -51,7 +51,7 @@ class ProfileController &lt; PublicController
51 51  
52 52 def communities
53 53 if is_cache_expired?(profile.communities_cache_key(params))
54   - @communities = profile.communities.includes(relations_to_include).paginate(:per_page => per_page, :page => params[:npage])
  54 + @communities = profile.communities.includes(relations_to_include).paginate(:per_page => per_page, :page => params[:npage], :total_entries => profile.communities.count)
55 55 end
56 56 end
57 57  
... ... @@ -202,7 +202,8 @@ class ProfileController &lt; PublicController
202 202 end
203 203  
204 204 def more_comments
205   - activity = ActionTracker::Record.find(:first, :conditions => {:id => params[:activity], :user_id => @profile})
  205 + profile_filter = @profile.person? ? {:user_id => @profile} : {:target_id => @profile}
  206 + activity = ActionTracker::Record.find(:first, :conditions => {:id => params[:activity]}.merge(profile_filter))
206 207 comments_count = activity.comments.count
207 208 comment_page = (params[:comment_page] || 1).to_i
208 209 comments_per_page = 5
... ...
app/helpers/application_helper.rb
... ... @@ -312,13 +312,13 @@ module ApplicationHelper
312 312 raise ArgumentError, 'No partial for object. Is there a partial for any class in the inheritance hierarchy?'
313 313 end
314 314  
315   - def view_for_profile_actions(klass)
316   - raise ArgumentError, 'No profile actions view for this class.' if klass.nil?
317   -
318   - name = klass.name.underscore
319   - return "blocks/profile_info_actions/" + name + '.html.erb' if File.exists?(Rails.root.join('app', 'views', 'blocks', 'profile_info_actions', name + '.html.erb'))
320   -
321   - view_for_profile_actions(klass.superclass)
  315 + def render_profile_actions klass
  316 + name = klass.to_s.underscore
  317 + begin
  318 + render "blocks/profile_info_actions/#{name}"
  319 + rescue ActionView::MissingTemplate
  320 + render_profile_actions klass.superclass
  321 + end
322 322 end
323 323  
324 324 def user
... ... @@ -671,7 +671,7 @@ module ApplicationHelper
671 671  
672 672 def theme_javascript_ng
673 673 script = File.join(theme_path, 'theme.js')
674   - if File.exists?(Rails.root.join('public', script))
  674 + if File.exists?(File.join(Rails.root, 'public', script))
675 675 javascript_include_tag script
676 676 else
677 677 nil
... ... @@ -1095,7 +1095,7 @@ module ApplicationHelper
1095 1095 result
1096 1096 end
1097 1097  
1098   - def manage_link(list, kind)
  1098 + def manage_link(list, kind, title)
1099 1099 if list.present?
1100 1100 link_to_all = nil
1101 1101 if list.count > 5
... ... @@ -1108,19 +1108,19 @@ module ApplicationHelper
1108 1108 if link_to_all
1109 1109 link << link_to_all
1110 1110 end
1111   - render :partial => "shared/manage_link", :locals => {:link => link, :kind => kind.to_s}
  1111 + render :partial => "shared/manage_link", :locals => {:link => link, :kind => kind.to_s, :title => title}
1112 1112 end
1113 1113 end
1114 1114  
1115 1115 def manage_enterprises
1116 1116 return '' unless user && user.environment.enabled?(:display_my_enterprises_on_user_menu)
1117   - manage_link(user.enterprises, :enterprises).to_s
  1117 + manage_link(user.enterprises, :enterprises, _('My enterprises')).to_s
1118 1118 end
1119 1119  
1120 1120 def manage_communities
1121 1121 return '' unless user && user.environment.enabled?(:display_my_communities_on_user_menu)
1122 1122 administered_communities = user.communities.more_popular.select {|c| c.admins.include? user}
1123   - manage_link(administered_communities, :communities).to_s
  1123 + manage_link(administered_communities, :communities, _('My communities')).to_s
1124 1124 end
1125 1125  
1126 1126 def admin_link
... ... @@ -1223,22 +1223,9 @@ module ApplicationHelper
1223 1223 end
1224 1224  
1225 1225 def add_zoom_to_images
1226   - stylesheet_link_tag('fancybox') +
1227   - javascript_include_tag('jquery.fancybox-1.3.4.pack') +
1228   - javascript_tag("jQuery(function($) {
1229   - $(window).load( function() {
1230   - $('#article .article-body img').each( function(index) {
1231   - var original = original_image_dimensions($(this).attr('src'));
1232   - if ($(this).width() < original['width'] || $(this).height() < original['height']) {
1233   - $(this).wrap('<div class=\"zoomable-image\" />');
1234   - $(this).parent('.zoomable-image').attr('style', $(this).attr('style'));
1235   - $(this).attr('style', '');
1236   - $(this).after(\'<a href=\"' + $(this).attr('src') + '\" class=\"zoomify-image\"><span class=\"zoomify-text\">%s</span></a>');
1237   - }
1238   - });
1239   - $('.zoomify-image').fancybox();
1240   - });
1241   - });" % _('Zoom in'))
  1226 + stylesheet_link_tag('jquery.fancybox') +
  1227 + javascript_include_tag('jquery.fancybox.pack') +
  1228 + javascript_tag("apply_zoom_to_images(#{_('Zoom in').to_json})")
1242 1229 end
1243 1230  
1244 1231 def render_dialog_error_messages(instance_name)
... ... @@ -1373,7 +1360,7 @@ module ApplicationHelper
1373 1360 @message = _("The content here is available to %s's friends only.") % profile.short_name
1374 1361 else
1375 1362 @action = :join
1376   - @message = _('The contents in this community is available to members only.')
  1363 + @message = _('The contents in this profile is available to members only.')
1377 1364 end
1378 1365 @no_design_blocks = true
1379 1366 end
... ... @@ -1415,4 +1402,14 @@ module ApplicationHelper
1415 1402 content_tag('ul', article.versions.map {|v| link_to("r#{v.version}", @page.url.merge(:version => v.version))})
1416 1403 end
1417 1404  
  1405 + def labelled_colorpicker_field(human_name, object_name, method, options = {})
  1406 + options[:id] ||= 'text-field-' + FormsHelper.next_id_number
  1407 + content_tag('label', human_name, :for => options[:id], :class => 'formlabel') +
  1408 + colorpicker_field(object_name, method, options.merge(:class => 'colorpicker_field'))
  1409 + end
  1410 +
  1411 + def colorpicker_field(object_name, method, options = {})
  1412 + text_field(object_name, method, options.merge(:class => 'colorpicker_field'))
  1413 + end
  1414 +
1418 1415 end
... ...
app/helpers/block_helper.rb
... ... @@ -6,19 +6,20 @@ module BlockHelper
6 6 content_tag 'h3', content_tag('span', h(title)), :class => tag_class
7 7 end
8 8  
9   - def highlights_block_config_image_fields(block, image={})
  9 + def highlights_block_config_image_fields(block, image={}, row_number=nil)
10 10 "
11   - <tr class=\"image-data-line\">
  11 + <tr class=\"image-data-line\" data-row-number='#{row_number}'>
12 12 <td>
13 13 #{select_tag 'block[images][][image_id]', content_tag(:option) + option_groups_from_collection_for_select(block.folder_choices, :images, :name, :id, :name, image[:image_id].to_i).html_safe}
14 14 </td>
15 15 <td>#{text_field_tag 'block[images][][address]', image[:address], :class => 'highlight-address', :size => 20}</td>
16 16 <td>#{text_field_tag 'block[images][][position]', image[:position], :class => 'highlight-position', :size => 1}</td>
17   - </tr><tr class=\"image-title\">
  17 + </tr><tr class=\"image-title\" data-row-number='#{row_number}'>
18 18 <td colspan=\"3\"><label>#{
19 19 content_tag('span', _('Title')) +
20 20 text_field_tag('block[images][][title]', image[:title], :class => 'highlight-title', :size => 45)
21 21 }</label></td>
  22 + <td>#{link_to '', '#', :class=>'button icon-button icon-delete delete-highlight', :confirm=>_('Are you sure you want to remove this highlight')}</td>
22 23 </tr>
23 24 "
24 25 end
... ...
app/helpers/blog_helper.rb
... ... @@ -17,13 +17,13 @@ module BlogHelper
17 17 _('Configure blog')
18 18 end
19 19  
20   - def list_posts(articles, format = 'full')
  20 + def list_posts(articles, format = 'full', paginate = true)
21 21 pagination = will_paginate(articles, {
22 22 :param_name => 'npage',
23 23 :previous_label => _('&laquo; Newer posts'),
24 24 :next_label => _('Older posts &raquo;'),
25 25 :params => {:action=>"view_page", :page=>articles.first.parent.path.split('/'), :controller=>"content_viewer"}
26   - }) if articles.present?
  26 + }) if articles.present? && paginate
27 27 content = []
28 28 artic_len = articles.length
29 29 articles.each_with_index{ |art,i|
... ... @@ -45,9 +45,9 @@ module BlogHelper
45 45  
46 46 def display_post(article, format = 'full')
47 47 no_comments = (format == 'full') ? false : true
  48 + title = article_title(article, :no_comments => no_comments)
48 49 html = send("display_#{format}_format", FilePresenter.for(article)).html_safe
49   -
50   - article_title(article, :no_comments => no_comments) + html
  50 + title + html
51 51 end
52 52  
53 53 def display_full_format(article)
... ...
app/helpers/categories_helper.rb
1 1 module CategoriesHelper
2 2  
3   -
4   - COLORS = [
5   - [ N_('Do not display at the menu'), nil ],
6   - [ N_('Orange'), 1],
7   - [ N_('Green'), 2],
8   - [ N_('Purple'), 3],
9   - [ N_('Red'), 4],
10   - [ N_('Dark Green'), 5],
11   - [ N_('Blue Oil'), 6],
12   - [ N_('Blue'), 7],
13   - [ N_('Brown'), 8],
14   - [ N_('Light Green'), 9],
15   - [ N_('Light Blue'), 10],
16   - [ N_('Dark Blue'), 11],
17   - [ N_('Blue Pool'), 12],
18   - [ N_('Beige'), 13],
19   - [ N_('Yellow'), 14],
20   - [ N_('Light Brown'), 15]
21   - ]
22   -
23 3 TYPES = [
24 4 [ _('General Category'), Category.to_s ],
25 5 [ _('Product Category'), ProductCategory.to_s ],
26 6 [ _('Region'), Region.to_s ],
27 7 ]
28 8  
29   - def select_color_for_category
30   - if @category.top_level?
31   - labelled_form_field(_('Display at the menu?'), select('category', 'display_color', CategoriesHelper::COLORS.map {|item| [gettext(item[0]), item[1]] }))
32   - else
33   - ""
34   - end
35   - end
36   -
37   - def display_color_for_category(category)
38   - color = category.display_color
39   - if color.nil?
40   - ""
41   - else
42   - "[" + gettext(CategoriesHelper::COLORS.find {|item| item[1] == color}.first) + "]"
43   - end
44   - end
45   -
46 9 def select_category_type(field)
47 10 value = params[field]
48 11 labelled_form_field(_('Type of category'), select_tag('type', options_for_select(TYPES, value)))
49 12 end
50 13  
  14 + def category_color_style(category)
  15 + return '' if category.nil? or category.display_color.blank?
  16 + 'background-color: #'+category.display_color+';'
  17 + end
  18 +
51 19 #FIXME make this test
52 20 def selected_category_link(cat)
53 21 js_remove = "jQuery('#selected-category-#{cat.id}').remove();"
... ...
app/helpers/content_viewer_helper.rb
... ... @@ -10,7 +10,7 @@ module ContentViewerHelper
10 10 end
11 11  
12 12 def number_of_comments(article)
13   - display_number_of_comments(article.comments.without_spam.count)
  13 + display_number_of_comments(article.comments_count - article.spam_comments_count)
14 14 end
15 15  
16 16 def article_title(article, args = {})
... ... @@ -26,7 +26,7 @@ module ContentViewerHelper
26 26 end
27 27 title << content_tag('span',
28 28 content_tag('span', show_date(article.published_at), :class => 'date') +
29   - content_tag('span', _(", by %s") % link_to(article.author_name, article.author_url), :class => 'author') +
  29 + content_tag('span', _(", by %s") % (article.author ? link_to(article.author_name, article.author_url) : article.author_name), :class => 'author') +
30 30 content_tag('span', comments, :class => 'comments'),
31 31 :class => 'created-at'
32 32 )
... ...
app/helpers/folder_helper.rb
... ... @@ -5,15 +5,17 @@ module FolderHelper
5 5 include ShortFilename
6 6 include ArticleHelper
7 7  
8   - def list_articles(articles, recursive = false)
9   - if !articles.blank?
10   - articles = articles.paginate(
  8 + def list_contents(configure={})
  9 + configure[:recursive] ||= false
  10 + configure[:list_type] ||= :folder
  11 + if !configure[:contents].blank?
  12 + configure[:contents] = configure[:contents].paginate(
11 13 :order => "updated_at DESC",
12 14 :per_page => 10,
13 15 :page => params[:npage]
14 16 )
15 17  
16   - render :file => 'shared/articles_list', :locals => {:articles => articles, :recursive => recursive}
  18 + render :file => 'shared/content_list', :locals => configure
17 19 else
18 20 content_tag('em', _('(empty folder)'))
19 21 end
... ... @@ -23,21 +25,33 @@ module FolderHelper
23 25 articles.select {|article| article.display_to?(user)}
24 26 end
25 27  
26   - def display_article_in_listing(article, recursive = false, level = 0)
27   - article = FilePresenter.for article
28   - article_link = if article.image?
29   - link_to('&nbsp;' * (level * 4) + image_tag(icon_for_article(article)) + short_filename(article.name), article.url.merge(:view => true))
  28 + def display_content_in_listing(configure={})
  29 + recursive = configure[:recursive] || false
  30 + list_type = configure[:list_type] || :folder
  31 + level = configure[:level] || 0
  32 + content = FilePresenter.for configure[:content]
  33 + content_link = if content.image?
  34 + link_to('&nbsp;' * (level * 4) +
  35 + image_tag(icon_for_article(content)) + short_filename(content.name),
  36 + content.url.merge(:view => true)
  37 + )
30 38 else
31   - link_to('&nbsp;' * (level * 4) + short_filename(article.name), article.url.merge(:view => true), :class => icon_for_article(article))
  39 + link_to('&nbsp;' * (level * 4) +
  40 + short_filename(content.name),
  41 + content.url.merge(:view => true), :class => icon_for_article(content)
  42 + )
32 43 end
33 44 result = content_tag(
34 45 'tr',
35   - content_tag('td', article_link )+
36   - content_tag('td', show_date(article.updated_at), :class => 'last-update'),
37   - :class => 'sitemap-item'
  46 + content_tag('td', content_link ) +
  47 + content_tag('td', show_date(content.updated_at), :class => 'last-update'),
  48 + :class => "#{list_type}-item"
38 49 )
39 50 if recursive
40   - result + article.children.map {|item| display_article_in_listing(item, recursive, level + 1) }.join('')
  51 + result + content.children.map {|item|
  52 + display_content_in_listing :content=>item, :recursive=>recursive,
  53 + :list_type=>list_type, :level=>level+1
  54 + }.join("\n")
41 55 else
42 56 result
43 57 end
... ...
app/models/article.rb
... ... @@ -2,7 +2,7 @@ require &#39;hpricot&#39;
2 2  
3 3 class Article < ActiveRecord::Base
4 4  
5   - attr_accessible :name, :body, :abstract, :profile, :tag_list, :parent, :allow_members_to_edit, :translation_of_id, :language, :license_id, :parent_id, :display_posts_in_current_language, :category_ids, :posts_per_page, :moderate_comments, :accept_comments, :feed, :published, :source, :highlighted, :notify_comments, :display_hits, :slug, :external_feed_builder, :display_versions, :external_link
  5 + attr_accessible :name, :body, :abstract, :profile, :tag_list, :parent, :allow_members_to_edit, :translation_of_id, :language, :license_id, :parent_id, :display_posts_in_current_language, :category_ids, :posts_per_page, :moderate_comments, :accept_comments, :feed, :published, :source, :highlighted, :notify_comments, :display_hits, :slug, :external_feed_builder, :display_versions, :external_link, :image_builder
6 6  
7 7 acts_as_having_image
8 8  
... ... @@ -40,6 +40,12 @@ class Article &lt; ActiveRecord::Base
40 40 # xss_terminate plugin can't sanitize array fields
41 41 before_save :sanitize_tag_list
42 42  
  43 + before_create do |article|
  44 + if article.author
  45 + article.author_name = article.author.name
  46 + end
  47 + end
  48 +
43 49 belongs_to :profile
44 50 validates_presence_of :profile_id, :name
45 51 validates_presence_of :slug, :path, :if => lambda { |article| !article.name.blank? }
... ... @@ -48,6 +54,7 @@ class Article &lt; ActiveRecord::Base
48 54  
49 55 validates_uniqueness_of :slug, :scope => ['profile_id', 'parent_id'], :message => N_('The title (article name) is already being used by another article, please use another title.'), :if => lambda { |article| !article.slug.blank? }
50 56  
  57 + belongs_to :author, :class_name => 'Person'
51 58 belongs_to :last_changed_by, :class_name => 'Person', :foreign_key => 'last_changed_by_id'
52 59 belongs_to :created_by, :class_name => 'Person', :foreign_key => 'created_by_id'
53 60  
... ... @@ -456,10 +463,10 @@ class Article &lt; ActiveRecord::Base
456 463 ['TextArticle', 'TextileArticle', 'TinyMceArticle']
457 464 end
458 465  
459   - scope :published, :conditions => { :published => true }
460   - scope :folders, lambda {|profile|{:conditions => { :type => profile.folder_types} }}
461   - scope :no_folders, lambda {|profile|{:conditions => ['type NOT IN (?)', profile.folder_types]}}
462   - scope :galleries, :conditions => { :type => 'Gallery' }
  466 + scope :published, :conditions => ['articles.published = ?', true]
  467 + scope :folders, lambda {|profile|{:conditions => ['articles.type IN (?)', profile.folder_types] }}
  468 + scope :no_folders, lambda {|profile|{:conditions => ['articles.type NOT IN (?)', profile.folder_types]}}
  469 + scope :galleries, :conditions => [ "articles.type IN ('Gallery')" ]
463 470 scope :images, :conditions => { :is_image => true }
464 471 scope :text_articles, :conditions => [ 'articles.type IN (?)', text_article_types ]
465 472 scope :with_types, lambda { |types| { :conditions => [ 'articles.type IN (?)', types ] } }
... ... @@ -469,7 +476,7 @@ class Article &lt; ActiveRecord::Base
469 476 scope :more_recent, :order => "created_at DESC"
470 477  
471 478 def self.display_filter(user, profile)
472   - return {:conditions => ['published = ?', true]} if !user
  479 + return {:conditions => ['articles.published = ?', true]} if !user
473 480 {:conditions => [" articles.published = ? OR
474 481 articles.last_changed_by_id = ? OR
475 482 articles.profile_id = ? OR
... ... @@ -496,6 +503,7 @@ class Article &lt; ActiveRecord::Base
496 503 end
497 504  
498 505 def allow_post_content?(user = nil)
  506 + return true if allow_edit_topic?(user)
499 507 user && (user.has_permission?('post_content', profile) || allow_publish_content?(user) && (user == author))
500 508 end
501 509  
... ... @@ -515,9 +523,14 @@ class Article &lt; ActiveRecord::Base
515 523 end
516 524  
517 525 def allow_edit?(user)
  526 + return true if allow_edit_topic?(user)
518 527 allow_post_content?(user) || user && allow_members_to_edit && user.is_member_of?(profile)
519 528 end
520 529  
  530 + def allow_edit_topic?(user)
  531 + self.belongs_to_forum? && (user == author) && user.present? && user.is_member_of?(profile)
  532 + end
  533 +
521 534 def moderate_comments?
522 535 moderate_comments == true
523 536 end
... ... @@ -632,35 +645,36 @@ class Article &lt; ActiveRecord::Base
632 645 can_display_versions? && display_versions
633 646 end
634 647  
635   - def author(version_number = nil)
636   - if version_number
637   - version = self.versions.find_by_version(version_number)
638   - author_id = version.last_changed_by_id if version
639   - else
640   - author_id = self.created_by_id
641   - end
  648 + def get_version(version_number = nil)
  649 + version_number ? versions.find(:first, :order => 'version', :offset => version_number - 1) : versions.earliest
  650 + end
642 651  
643   - environment.people.find_by_id(author_id)
  652 + def author_by_version(version_number = nil)
  653 + version_number ? profile.environment.people.find_by_id(get_version(version_number).author_id) : author
644 654 end
645 655  
646 656 def author_name(version_number = nil)
647   - person = author(version_number)
648   - person ? person.name : (setting[:author_name] || _('Unknown'))
  657 + person = author_by_version(version_number)
  658 + if version_number
  659 + person ? person.name : _('Unknown')
  660 + else
  661 + person ? person.name : (setting[:author_name] || _('Unknown'))
  662 + end
649 663 end
650 664  
651 665 def author_url(version_number = nil)
652   - person = author(version_number)
  666 + person = author_by_version(version_number)
653 667 person ? person.url : nil
654 668 end
655 669  
656 670 def author_id(version_number = nil)
657   - person = author(version_number)
  671 + person = author_by_version(version_number)
658 672 person ? person.id : nil
659 673 end
660 674  
661 675 def version_license(version_number = nil)
662 676 return license if version_number.nil?
663   - profile.environment.licenses.find_by_id(versions.find_by_version(version_number).license_id)
  677 + profile.environment.licenses.find_by_id(get_version(version_number).license_id)
664 678 end
665 679  
666 680 alias :active_record_cache_key :cache_key
... ...
app/models/block.rb
... ... @@ -22,6 +22,10 @@ class Block &lt; ActiveRecord::Base
22 22 false
23 23 end
24 24  
  25 + def get_limit
  26 + [0,limit].max
  27 + end
  28 +
25 29 def embed_code
26 30 me = self
27 31 proc do
... ...
app/models/category.rb
... ... @@ -14,9 +14,6 @@ class Category &lt; ActiveRecord::Base
14 14 validates_uniqueness_of :slug,:scope => [ :environment_id, :parent_id ], :message => N_('{fn} is already being used by another category.').fix_i18n
15 15 belongs_to :environment
16 16  
17   - validates_inclusion_of :display_color, :in => 1..15, :allow_nil => true
18   - validates_uniqueness_of :display_color, :scope => :environment_id, :if => (lambda { |cat| ! cat.display_color.nil? }), :message => N_('{fn} was already assigned to another category.').fix_i18n
19   -
20 17 # Finds all top level categories for a given environment.
21 18 scope :top_level_for, lambda { |environment|
22 19 {:conditions => ['parent_id is null and environment_id = ?', environment.id ]}
... ... @@ -42,6 +39,13 @@ class Category &lt; ActiveRecord::Base
42 39  
43 40 acts_as_having_image
44 41  
  42 + before_save :normalize_display_color
  43 +
  44 + def normalize_display_color
  45 + display_color.gsub!('#', '') if display_color
  46 + display_color = nil if display_color.blank?
  47 + end
  48 +
45 49 scope :from_types, lambda { |types|
46 50 types.select{ |t| t.blank? }.empty? ?
47 51 { :conditions => { :type => types } } :
... ... @@ -101,4 +105,12 @@ class Category &lt; ActiveRecord::Base
101 105 self.children.find(:all, :conditions => {:display_in_menu => true}).empty?
102 106 end
103 107  
  108 + def with_color
  109 + if display_color.blank?
  110 + parent.nil? ? nil : parent.with_color
  111 + else
  112 + self
  113 + end
  114 + end
  115 +
104 116 end
... ...
app/models/comment.rb
... ... @@ -109,14 +109,17 @@ class Comment &lt; ActiveRecord::Base
109 109 include Noosfero::Plugin::HotSpot
110 110  
111 111 include Spammable
  112 + include CacheCounterHelper
112 113  
113 114 def after_spam!
114 115 SpammerLogger.log(ip_address, self)
115 116 Delayed::Job.enqueue(CommentHandler.new(self.id, :marked_as_spam))
  117 + update_cache_counter(:spam_comments_count, source, 1) if source.kind_of?(Article)
116 118 end
117 119  
118 120 def after_ham!
119 121 Delayed::Job.enqueue(CommentHandler.new(self.id, :marked_as_ham))
  122 + update_cache_counter(:spam_comments_count, source, -1) if source.kind_of?(Article)
120 123 end
121 124  
122 125 def verify_and_notify
... ...
app/models/domain.rb
... ... @@ -2,7 +2,7 @@ require &#39;noosfero/multi_tenancy&#39;
2 2  
3 3 class Domain < ActiveRecord::Base
4 4  
5   - attr_accessible :name, :owner
  5 + attr_accessible :name, :owner, :is_default
6 6  
7 7 # relationships
8 8 ###############
... ...
app/models/enterprise.rb
... ... @@ -25,7 +25,10 @@ class Enterprise &lt; Organization
25 25 N_('Organization website'); N_('Historic and current context'); N_('Activities short description'); N_('City'); N_('State'); N_('Country'); N_('ZIP code')
26 26  
27 27 settings_items :organization_website, :historic_and_current_context, :activities_short_description
  28 +
28 29 settings_items :products_per_catalog_page, :type => :integer, :default => 6
  30 + alias_method :products_per_catalog_page_before_type_cast, :products_per_catalog_page
  31 + validates_numericality_of :products_per_catalog_page, :allow_nil => true, :greater_than => 0
29 32  
30 33 extend SetProfileRegionFromCityState::ClassMethods
31 34 set_profile_region_from_city_state
... ...
app/models/environment.rb
... ... @@ -287,7 +287,7 @@ class Environment &lt; ActiveRecord::Base
287 287 www.youtube.com
288 288 ] + ('a' .. 'z').map{|i| "#{i}.yimg.com"}
289 289  
290   - settings_items :enabled_plugins, :type => Array, :default => []
  290 + settings_items :enabled_plugins, :type => Array, :default => Noosfero::Plugin.available_plugin_names
291 291  
292 292 settings_items :search_hints, :type => Hash, :default => {}
293 293  
... ...
app/models/featured_products_block.rb
1 1 class FeaturedProductsBlock < Block
2 2  
  3 + attr_accessible :product_ids, :groups_of, :speed, :reflect
  4 +
3 5 settings_items :product_ids, :type => Array, :default => []
4 6 settings_items :groups_of, :type => :integer, :default => 3
5 7 settings_items :speed, :type => :integer, :default => 1000
... ...
app/models/friendship.rb
... ... @@ -15,4 +15,9 @@ class Friendship &lt; ActiveRecord::Base
15 15 Friendship.update_cache_counter(:friends_count, friendship.person, -1)
16 16 Friendship.update_cache_counter(:friends_count, friendship.friend, -1)
17 17 end
  18 +
  19 + def self.remove_friendship(person1, person2)
  20 + person1.remove_friend(person2)
  21 + person2.remove_friend(person1)
  22 + end
18 23 end
... ...
app/models/highlights_block.rb
1 1 class HighlightsBlock < Block
2 2  
3   - attr_accessible :images
  3 + attr_accessible :images, :interval, :shuffle, :navigation
4 4  
5 5 settings_items :images, :type => Array, :default => []
6 6 settings_items :interval, :type => 'integer', :default => 4
... ...
app/models/location_block.rb
1 1 class LocationBlock < Block
2 2  
  3 + attr_accessible :zoom, :map_type
  4 +
3 5 settings_items :zoom, :type => :integer, :default => 4
4 6 settings_items :map_type, :type => :string, :default => 'roadmap'
5 7  
... ...
app/models/person_notifier.rb
... ... @@ -82,7 +82,7 @@ class PersonNotifier
82 82 @url = @profile.environment.top_url
83 83 mail(
84 84 content_type: "text/html",
85   - from: "#{@profile.environment.name} <#{@profile.environment.contact_email}>",
  85 + from: "#{@profile.environment.name} <#{@profile.environment.noreply_email}>",
86 86 to: @profile.email,
87 87 subject: _("[%s] Network Activity") % [@profile.environment.name]
88 88 )
... ...
app/models/product.rb
... ... @@ -11,7 +11,7 @@ class Product &lt; ActiveRecord::Base
11 11  
12 12 SEARCH_DISPLAYS = %w[map full]
13 13  
14   - attr_accessible :name, :product_category, :highlighted, :price, :enterprise, :image_builder, :description, :available, :qualifiers
  14 + attr_accessible :name, :product_category, :highlighted, :price, :enterprise, :image_builder, :description, :available, :qualifiers, :unit_id, :discount, :inputs
15 15  
16 16 def self.default_search_display
17 17 'full'
... ...
app/models/product_categories_block.rb
... ... @@ -17,7 +17,7 @@ class ProductCategoriesBlock &lt; Block
17 17 profile = owner
18 18 proc do
19 19 if @categories.nil? or @categories.length == 0
20   - categories = ProductCategory.on_level().order(:name)
  20 + categories = ProductCategory.on_level(nil).order(:name)
21 21 if @categories and @categories.length == 0
22 22 notice = _('There are no sub-categories for %s') % @category.name
23 23 end
... ... @@ -33,7 +33,7 @@ class ProductCategoriesBlock &lt; Block
33 33 end
34 34 end
35 35  
36   - DISPLAY_OPTIONS['catalog_only'] = _('Only on the catalog')
  36 + DISPLAY_OPTIONS = DISPLAY_OPTIONS.merge('catalog_only' => _('Only on the catalog'))
37 37  
38 38 def display
39 39 settings[:display].nil? ? 'catalog_only' : super
... ...
app/models/products_block.rb
... ... @@ -49,17 +49,10 @@ class ProductsBlock &lt; Block
49 49  
50 50 def products(reload = false)
51 51 if product_ids.blank?
52   - products_list = owner.products(reload)
53   - result = []
54   - [4, products_list.size].min.times do
55   - p = products_list.sample
56   - result << p
57   - products_list -= [p]
58   - end
59   - result
  52 + owner.products.order('RANDOM()').limit([4,owner.products.count].min)
60 53 else
61   - product_ids.map {|item| owner.products.find(item) }
62   - end
  54 + owner.products.where(:id => product_ids)
  55 + end.compact
63 56 end
64 57  
65 58 end
... ...
app/models/profile.rb
... ... @@ -3,7 +3,7 @@
3 3 # which by default is the one returned by Environment:default.
4 4 class Profile < ActiveRecord::Base
5 5  
6   - attr_accessible :name, :identifier, :public_profile, :nickname, :custom_footer, :custom_header, :address, :zip_code, :contact_phone, :image_builder, :description, :closed, :template_id, :environment, :lat, :lng, :is_template, :fields_privacy, :preferred_domain_id, :category_ids, :country, :city, :state, :national_region_code, :email, :contact_email, :redirect_l10n, :notification_time
  6 + attr_accessible :name, :identifier, :public_profile, :nickname, :custom_footer, :custom_header, :address, :zip_code, :contact_phone, :image_builder, :description, :closed, :template_id, :environment, :lat, :lng, :is_template, :fields_privacy, :preferred_domain_id, :category_ids, :country, :city, :state, :national_region_code, :email, :contact_email, :redirect_l10n, :notification_time, :redirection_after_login
7 7  
8 8 # use for internationalizable human type names in search facets
9 9 # reimplement on subclasses
... ...
app/models/profile_list_block.rb
1 1 class ProfileListBlock < Block
2 2  
3   - attr_accessible :limit, :prioritize_profiles_with_image
  3 + attr_accessible :prioritize_profiles_with_image
4 4  
5 5 settings_items :limit, :type => :integer, :default => 6
6 6 settings_items :prioritize_profiles_with_image, :type => :boolean, :default => true
... ... @@ -18,13 +18,13 @@ class ProfileListBlock &lt; Block
18 18 result = nil
19 19 visible_profiles = profiles.visible.includes([:image,:domains,:preferred_domain,:environment])
20 20 if !prioritize_profiles_with_image
21   - result = visible_profiles.all(:limit => limit, :order => 'profiles.updated_at DESC').sort_by{ rand }
22   - elsif profiles.visible.with_image.count >= limit
23   - result = visible_profiles.with_image.all(:limit => limit * 5, :order => 'profiles.updated_at DESC').sort_by{ rand }
  21 + result = visible_profiles.all(:limit => get_limit, :order => 'profiles.updated_at DESC').sort_by{ rand }
  22 + elsif profiles.visible.with_image.count >= get_limit
  23 + result = visible_profiles.with_image.all(:limit => get_limit * 5, :order => 'profiles.updated_at DESC').sort_by{ rand }
24 24 else
25   - result = visible_profiles.with_image.sort_by{ rand } + visible_profiles.without_image.all(:limit => limit * 5, :order => 'profiles.updated_at DESC').sort_by{ rand }
  25 + result = visible_profiles.with_image.sort_by{ rand } + visible_profiles.without_image.all(:limit => get_limit * 5, :order => 'profiles.updated_at DESC').sort_by{ rand }
26 26 end
27   - result.slice(0..limit-1)
  27 + result.slice(0..get_limit-1)
28 28 end
29 29  
30 30 def profile_count
... ...
app/models/recent_documents_block.rb
... ... @@ -33,7 +33,7 @@ class RecentDocumentsBlock &lt; Block
33 33 end
34 34  
35 35 def docs
36   - self.limit.nil? ? owner.recent_documents(nil, {}, false) : owner.recent_documents(self.limit, {}, false)
  36 + self.limit.nil? ? owner.recent_documents(nil, {}, false) : owner.recent_documents(self.get_limit, {}, false)
37 37 end
38 38  
39 39 def self.expire_on
... ...
app/models/rss_feed.rb
1 1 class RssFeed < Article
2 2  
3   - attr_accessible :limit, :enabled, :language, :include
  3 + attr_accessible :limit, :enabled, :language, :include, :feed_item_description
4 4  
5 5 def self.type_name
6 6 _('RssFeed')
... ...
app/models/slideshow_block.rb
... ... @@ -6,6 +6,8 @@ class SlideshowBlock &lt; Block
6 6 settings_items :navigation, :type => 'boolean', :default => false
7 7 settings_items :image_size, :type => 'string', :default => 'thumb'
8 8  
  9 + attr_accessible :gallery_id, :image_size, :interval, :shuffle, :navigation
  10 +
9 11 def self.description
10 12 _('Slideshow')
11 13 end
... ...
app/models/user.rb
... ... @@ -5,7 +5,7 @@ require &#39;user_activation_job&#39;
5 5 # Rails generator.
6 6 class User < ActiveRecord::Base
7 7  
8   - attr_accessible :login, :email, :password, :password_confirmation
  8 + attr_accessible :login, :email, :password, :password_confirmation, :activated_at
9 9  
10 10 N_('Password')
11 11 N_('Password confirmation')
... ...
app/presenters/image.rb
... ... @@ -11,4 +11,9 @@ class FilePresenter::Image &lt; FilePresenter
11 11 def short_description
12 12 _('Image (%s)') % content_type.split('/')[1].upcase
13 13 end
  14 +
  15 + #Overwriting method from FilePresenter to allow download of images
  16 + def download?(view = nil)
  17 + view.blank? || view == 'false'
  18 + end
14 19 end
... ...
app/views/account/_signup_form.html.erb
... ... @@ -136,8 +136,6 @@
136 136 <script type="text/javascript">
137 137 jQuery(function($) {
138 138  
139   - $('#signup-form #user_login').css('width', 335 - $('#signup-domain').outerWidth());
140   -
141 139 $('#signup-form input[type=text], #signup-form textarea').each(function() {
142 140 $(this).bind('blur', function() {
143 141 if ($(this).val() == '') {
... ...
app/views/blocks/my_network.html.erb
1 1 <%= block_title(title) %>
2 2  
3   -<%= render :file => 'blocks/my_network/' + owner.class.name.underscore, :locals => { :owner => owner } %>
  3 +<%= render_profile_actions owner.class %>
4 4  
5 5 <ul>
6 6 <li><%= link_to(_('Homepage'), owner.url, :class => 'url') %></li>
... ... @@ -11,5 +11,5 @@
11 11 </ul>
12 12  
13 13 <div class="my-network-actions">
14   - <%= render :file => 'blocks/profile_info_actions/' + owner.class.name.underscore %>
  14 + <%= render 'blocks/profile_info_actions/' + owner.class.name.underscore %>
15 15 </div>
... ...
app/views/blocks/profile_image.html.erb
... ... @@ -23,6 +23,6 @@
23 23 <% end %>
24 24  
25 25 <div class="profile-info-options">
26   - <%= render :file => view_for_profile_actions(block.owner.class) %>
  26 + <%= render_profile_actions block.owner.class %>
27 27 </div>
28 28 </div><!-- end class="vcard" -->
... ...
app/views/blocks/profile_info.html.erb
... ... @@ -40,7 +40,7 @@
40 40 <% end %>
41 41  
42 42 <div class="profile-info-options">
43   - <%= render :file => view_for_profile_actions(block.owner.class) %>
  43 + <%= render_profile_actions block.owner.class %>
44 44 </div>
45 45  
46 46 </div><!-- end class="vcard" -->
... ...
app/views/blocks/profile_info_actions/_community.html.erb 0 → 100644
... ... @@ -0,0 +1,20 @@
  1 +<ul>
  2 + <li>
  3 + <%= render "blocks/profile_info_actions/join_leave_community" %>
  4 + </li>
  5 + <% if logged_in? %>
  6 + <% if profile.enable_contact? %>
  7 + <li>
  8 + <%= link_to content_tag('span', _('Send an e-mail')),
  9 + { :profile => profile.identifier,
  10 + :controller => 'contact',
  11 + :action => 'new' },
  12 + {:class => 'button with-text icon-menu-mail', :title => _('Send an e-mail to the administrators')} %>
  13 + </li>
  14 + <% end %>
  15 +
  16 + <li><%= report_abuse(profile, :button) %></li>
  17 +
  18 + <%= render_environment_features(:profile_actions) %>
  19 + <% end %>
  20 +</ul>
... ...
app/views/blocks/profile_info_actions/_enterprise.html.erb 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +<ul>
  2 + <%if logged_in? %>
  3 + <%if !user.favorite_enterprises.include?(profile) %>
  4 + <li><%= link_to content_tag('span', _('Add as favorite')), { :profile => user.identifier, :controller => 'favorite_enterprises', :action => 'add', :id => profile.id }, :class => 'button with-text icon-add', :title => _('Add enterprise as favorite') %></li>
  5 + <% end %>
  6 + <% end %>
  7 + <% if profile.enable_contact? %>
  8 + <li> <%= link_to content_tag('span', _('Send an e-mail')), {:profile => profile.identifier, :controller => 'contact', :action => 'new'}, {:id => 'enterprise-contact-button', :class => 'button with-text icon-menu-mail'} %> </li>
  9 + <% end %>
  10 +
  11 + <li><%= report_abuse(profile, :button) %></li>
  12 +</ul>
... ...
app/views/blocks/profile_info_actions/_organization.html.erb 0 → 100644
app/views/blocks/profile_info_actions/_person.html.erb 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +<ul>
  2 + <%if logged_in? && (user != profile) %>
  3 +
  4 + <% if !user.already_request_friendship?(profile) and !user.is_a_friend?(profile) %>
  5 + <li>
  6 + <%= button(:add, content_tag('span', _('Add friend')), profile.add_url, :class => 'add-friend', :title => _("Add friend"), :style => 'position: relative;') %>
  7 + </li>
  8 + <% end %>
  9 +
  10 + <% if user.is_a_friend?(profile) && profile.enable_contact? %>
  11 + <li> <%= link_to content_tag('span', _('Send an e-mail')), {:profile => profile.identifier, :controller => 'contact', :action => 'new'}, :class => 'button with-text icon-menu-mail' %> </li>
  12 + <% end %>
  13 +
  14 + <li><%= report_abuse(profile, :button) %></li>
  15 + <% end %>
  16 +</ul>
... ...
app/views/blocks/profile_info_actions/community.html.erb
... ... @@ -1,20 +0,0 @@
1   -<ul>
2   - <li>
3   - <%= render "blocks/profile_info_actions/join_leave_community" %>
4   - </li>
5   - <% if logged_in? %>
6   - <% if profile.enable_contact? %>
7   - <li>
8   - <%= link_to content_tag('span', _('Send an e-mail')),
9   - { :profile => profile.identifier,
10   - :controller => 'contact',
11   - :action => 'new' },
12   - {:class => 'button with-text icon-menu-mail', :title => _('Send an e-mail to the administrators')} %>
13   - </li>
14   - <% end %>
15   -
16   - <li><%= report_abuse(profile, :button) %></li>
17   -
18   - <%= render_environment_features(:profile_actions) %>
19   - <% end %>
20   -</ul>
app/views/blocks/profile_info_actions/enterprise.html.erb
... ... @@ -1,12 +0,0 @@
1   -<ul>
2   - <%if logged_in? %>
3   - <%if !user.favorite_enterprises.include?(profile) %>
4   - <li><%= link_to content_tag('span', _('Add as favorite')), { :profile => user.identifier, :controller => 'favorite_enterprises', :action => 'add', :id => profile.id }, :class => 'button with-text icon-add', :title => _('Add enterprise as favorite') %></li>
5   - <% end %>
6   - <% end %>
7   - <% if profile.enable_contact? %>
8   - <li> <%= link_to content_tag('span', _('Send an e-mail')), {:profile => profile.identifier, :controller => 'contact', :action => 'new'}, {:id => 'enterprise-contact-button', :class => 'button with-text icon-menu-mail'} %> </li>
9   - <% end %>
10   -
11   - <li><%= report_abuse(profile, :button) %></li>
12   -</ul>
app/views/blocks/profile_info_actions/organization.html.erb
app/views/blocks/profile_info_actions/person.html.erb
... ... @@ -1,16 +0,0 @@
1   -<ul>
2   - <%if logged_in? && (user != profile) %>
3   -
4   - <% if !user.already_request_friendship?(profile) and !user.is_a_friend?(profile) %>
5   - <li>
6   - <%= button(:add, content_tag('span', _('Add friend')), profile.add_url, :class => 'add-friend', :title => _("Add friend"), :style => 'position: relative;') %>
7   - </li>
8   - <% end %>
9   -
10   - <% if user.is_a_friend?(profile) && profile.enable_contact? %>
11   - <li> <%= link_to content_tag('span', _('Send an e-mail')), {:profile => profile.identifier, :controller => 'contact', :action => 'new'}, :class => 'button with-text icon-menu-mail' %> </li>
12   - <% end %>
13   -
14   - <li><%= report_abuse(profile, :button) %></li>
15   - <% end %>
16   -</ul>
app/views/box_organizer/_highlights_block.html.erb
  1 +<%= javascript_include_tag "highlight_block" %>
  2 +
1 3 <strong><%= _('Highlights') %></strong>
2 4  
3 5 <table class="noborder"><tbody id="highlights-data-table">
4 6 <tr><th><%= _('Image') %></th><th><%= _('Address') %></th><th><%= _('Position') %></th></tr>
5   - <% for image in @block.images do %>
6   - <%= highlights_block_config_image_fields @block, image %>
  7 + <% @block.images.each_with_index do |image, index| %>
  8 + <%= highlights_block_config_image_fields @block, image, index %>
7 9 <% end %>
8 10 </tbody></table>
9 11  
10   -<%= link_to_function(_('New highlight'), nil, :class => 'button icon-add with-text') do |page|
11   - page.insert_html :bottom, 'highlights-data-table', highlights_block_config_image_fields(@block)
12   -end %>
  12 +<table class="hidden highlight-table-row">
  13 + <tbody>
  14 + <%= highlights_block_config_image_fields(@block) %>
  15 + </tbody>
  16 +</table>
  17 +
  18 +<%= link_to(_('New highlight'), '#', :class => 'button icon-add with-text new-highlight-button')%>
13 19  
14 20 <%= labelled_form_field _('Image transition:'), select('block', 'interval', [[_('No automatic transition'), 0]] + [1, 2, 3, 4, 5, 10, 20, 30, 60].map {|item| [n_('Every 1 second', 'Every %d seconds', item) % item, item]}) %>
15 21  
... ...
app/views/box_organizer/_link_list_block.html.erb
... ... @@ -10,40 +10,15 @@
10 10 </ul>
11 11 <ul id="dropable-link-list">
12 12 <% for link in @block.links do %>
13   - <li>
14   - <ul class="link-list-row">
15   - <li>
16   - <%= icon_selector(link['icon']) %>
17   - </li>
18   - <li>
19   - <%= text_field_tag 'block[links][][name]', link[:name], :class => 'link-name', :maxlength => 20 %>
20   - </li>
21   - <li>
22   - <%= text_field_tag 'block[links][][address]', link[:address], :class => 'link-address' %>
23   - </li>
24   - <li>
25   - <%= select_tag('block[links][][target]', options_for_select(LinkListBlock::TARGET_OPTIONS, link[:target])) %>
26   - </li>
27   - <li>
28   - <%= button_without_text(:delete, _('Delete'), "#" , :class=>"delete-link-list-row") %>
29   - </li>
30   - </ul>
31   - </li>
  13 + <%= render :partial => 'link_list_item', :locals => {:link => link} %>
32 14 <% end %>
33 15 </ul>
34 16 <input type="hidden" id="page_url" value="<%=url_for(:action=>'search_autocomplete')%>" />
  17 +
  18 + <div id="new-template">
  19 + <% template_link = {'icon' => 'ok'} %>
  20 + <%= render :partial => 'link_list_item', :locals => {:link => template_link} %>
  21 + </div>
35 22 </div>
36 23  
37   -<%= link_to_function(_('New link'), nil, :class => 'button icon-add with-text') do |page|
38   - page.insert_html :bottom, 'dropable-link-list', content_tag('li',
39   - content_tag('ul',
40   - content_tag('li', icon_selector('ok')) +
41   - content_tag('li', text_field_tag('block[links][][name]', '', :maxlength => 20)) +
42   - content_tag('li', text_field_tag('block[links][][address]', nil, :class => 'link-address')) +
43   - content_tag('li', select_tag('block[links][][target]',
44   - options_for_select(LinkListBlock::TARGET_OPTIONS, '_self'))) +
45   - content_tag('li', button_without_text(:delete, _('Delete'), "#" , :class=>"delete-link-list-row")),
46   - :class=>"link-list-row new_link_row")
47   - ) +
48   - javascript_tag("new_link_action()")
49   -end %>
  24 +<%= link_to_function(_('New link'), 'add_new_link();', :class => 'button icon-add with-text') %>
... ...
app/views/box_organizer/_link_list_item.html.erb 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +<li>
  2 + <ul class="link-list-row">
  3 + <li>
  4 + <%= icon_selector(link['icon']) %>
  5 + </li>
  6 + <li>
  7 + <%= text_field_tag 'block[links][][name]', link[:name], :class => 'link-name', :maxlength => 20 %>
  8 + </li>
  9 + <li>
  10 + <%= text_field_tag 'block[links][][address]', link[:address], :class => 'link-address' %>
  11 + </li>
  12 + <li>
  13 + <%= select_tag('block[links][][target]', options_for_select(LinkListBlock::TARGET_OPTIONS, link[:target])) %>
  14 + </li>
  15 + <li>
  16 + <%= button_without_text(:delete, _('Delete'), "#" , :class=>"delete-link-list-row") %>
  17 + </li>
  18 + </ul>
  19 +</li>
... ...
app/views/categories/_category.html.erb
1 1 <li>
2 2 <div class='treeitem'>
3   - <%= display_color_for_category(category) %>
4   - <%= category.name %>
  3 + <% unless category_color_style(category).empty? %>
  4 + <span class="color_marker" style="<%= category_color_style(category) %>" ></span>
  5 + <% end %>
  6 + <span><%= category.name %></span>
  7 +
5 8 <% if category.children.count > 0 %>
6 9 <div class='button' id="category-loading-<%= category.id %>" style="position: relative;">
7 10 <a href="#" id="show-button-<%= category.id %>" class="show-button" onclick="return false;" data-category="<%= category.id %>"><%= _('Show') %></a>
... ...
app/views/categories/_form.html.erb
  1 +<%= stylesheet_link_tag 'spectrum.css' %>
  2 +<%= javascript_include_tag "spectrum.js" %>
  3 +<%= javascript_include_tag "colorpicker-noosfero.js" %>
  4 +
1 5 <%= error_messages_for 'category' %>
2 6  
3 7 <%= labelled_form_for 'category', :html => { :multipart => true} do |f| %>
... ... @@ -13,12 +17,13 @@
13 17 <% end %>
14 18 <% end %>
15 19  
16   - <%= select_color_for_category if !environment.enabled?('disable_categories_menu') %>
17   -
18 20 <%= required f.text_field('name') %>
19 21  
20 22 <%= labelled_check_box(_('Display in the menu'), 'category[display_in_menu]', '1', @category.display_in_menu) %>
21 23  
  24 + <%= labelled_colorpicker_field(_('Pick a color'), :category, 'display_color' ) unless environment.enabled?('disable_categories_menu')%>
  25 + <span id="color_preview" class = "color_marker" style="<%= category_color_style(@category) %>" ></span>
  26 +
22 27 <%= f.fields_for :image_builder, @category.image do |i| %>
23 28 <%= file_field_or_thumbnail(_('Image:'), @category.image, i) %>
24 29 <% end %>
... ...
app/views/cms/view.html.erb
... ... @@ -25,7 +25,9 @@
25 25 <div id='article-full-path'>
26 26 <strong><%= _('Current folder: ') %></strong>
27 27 <%= link_to profile.identifier, :action => 'index' %>
28   - <%= @article.hierarchy.map {|item| " / " + ((item == @article) ? item.name : link_to(item.slug, :id => item.id)) } %>
  28 + <% @article.hierarchy.each do |item| %>
  29 + <%= " / " + ((item == @article) ? item.name.html_safe : link_to(item.slug, :id => item.id).html_safe) %>
  30 + <% end %>
29 31 </div>
30 32 <% end %>
31 33  
... ...
app/views/comment/_comment_form.html.erb
... ... @@ -31,7 +31,7 @@ function check_captcha(button, confirm_action) {
31 31 return true;
32 32 <% else %>
33 33 jQuery('#recaptcha-container').show();
34   - jQuery.colorbox({ inline : true, href : '#recaptcha-container', maxWidth : '600px', maxHeight : '300px' });
  34 + jQuery.colorbox({ html: jQuery('#recaptcha-container').html(), maxWidth : '600px', maxHeight : '300px' });
35 35 jQuery('#confirm-captcha').unbind('click');
36 36 jQuery('#confirm-captcha').bind('click', function() {
37 37 jQuery.colorbox.close();
... ... @@ -81,7 +81,7 @@ function check_captcha(button, confirm_action) {
81 81 <%= hidden_field_tag(:view, params[:view])%>
82 82 <%= f.hidden_field(:reply_of_id) %>
83 83  
84   - <%= @plugins.dispatch(:comment_form_extra_contents, local_assigns).collect { |content| instance_exec(&content) }.join("") %>
  84 + <%= @plugins.dispatch(:comment_form_extra_contents, local_assigns.merge(:comment => @comment)).collect { |content| instance_exec(&content) }.join("") %>
85 85  
86 86 <% button_bar do %>
87 87 <%= submit_button('add', _('Post comment'), :onclick => "if(check_captcha(this)) { save_comment(this) } else { check_captcha(this, save_comment)};return false;") %>
... ...
app/views/comment/notifier/notification.html.erb
... ... @@ -1,19 +0,0 @@
1   -<%= _('Hi, %{recipient}!') % { :recipient => @recipient } %>
2   -
3   -<%= word_wrap(_('%{sender} (%{sender_link}) created a new comment on your article "%{article_title}".') % { :sender => @sender, :sender_link => url_for(@sender_link), :article_title => @article_title }) %>
4   -
5   -<%= word_wrap(_('Title: %s') % @comment_title) %>
6   -
7   -<%= _("Comment:") %>
8   --------------------------------------------------------------------------------
9   -<%= word_wrap(@comment_body) %>
10   --------------------------------------------------------------------------------
11   -
12   -<%= _('Access the address below to view this comment:') %>
13   -<%= url_for @comment_url %>
14   -
15   -<%= _("Greetings,") %>
16   -
17   ---
18   -<%= _('%s team.') % @environment %>
19   -<%= url_for @url %>
app/views/comment/notifier/notification.text.erb 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +<%= _('Hi, %{recipient}!') % { :recipient => @recipient } %>
  2 +
  3 +<%= word_wrap(_('%{sender} (%{sender_link}) created a new comment on your article "%{article_title}".') % { :sender => @sender, :sender_link => url_for(@sender_link), :article_title => @article_title }) %>
  4 +
  5 +<%= word_wrap(_('Title: %s') % @comment_title) %>
  6 +
  7 +<%= _("Comment:") %>
  8 +-------------------------------------------------------------------------------
  9 +<%= word_wrap(@comment_body) %>
  10 +-------------------------------------------------------------------------------
  11 +
  12 +<%= _('Access the address below to view this comment:') %>
  13 +<%= url_for @comment_url %>
  14 +
  15 +<%= _("Greetings,") %>
  16 +
  17 +--
  18 +<%= _('%s team.') % @environment %>
  19 +<%= url_for @url %>
... ...
app/views/content_viewer/article_versions.html.erb
1 1 <div class="article-versions">
2   - <%= button(:back, _('Go back to latest version'), {:action => 'view_page'}) %>
  2 + <%= button(:back, _('Go back to latest version'), @page.url) %>
3 3 </div>
4 4  
5 5 <%= article_title(@page, :no_link => true) %>
6 6  
7 7 <p><%= _('This is the list of all versions of this content. Select a version to see it and then revert to it.') %>.</p>
8 8  
9   -<%= form_tag({:controller => 'content_viewer', :action => 'versions_diff', :profile => profile.identifier, :page => @page.path.split('/')}, :method => 'get') do %>
  9 +<%= form_tag({:controller => 'content_viewer', :action => 'versions_diff', :profile => profile.identifier, :page => @page.path}, :method => 'get') do %>
10 10 <ul id="article-versions">
11 11 <% @versions.each do |v| %>
12 12 <li>
... ...
app/views/content_viewer/blog_page.html.erb
... ... @@ -9,13 +9,15 @@
9 9 </div>
10 10 <hr class="pre-posts"/>
11 11 <div class="blog-posts">
  12 + <% paginate = true %>
12 13 <%=
13 14 posts = @posts
14 15 format = blog.visualization_format
15 16 if inside_block
16 17 posts = blog.posts.paginate(:page=>1, :per_page=>inside_block.posts_per_page)
17 18 format = inside_block.visualization_format
  19 + paginate = false
18 20 end
19   - (blog.empty? ? content_tag('em', _('(no posts)')) : list_posts(posts, format))
  21 + (blog.empty? ? content_tag('em', _('(no posts)')) : list_posts(posts, format, paginate))
20 22 %>
21 23 </div>
... ...
app/views/content_viewer/folder.html.erb
... ... @@ -8,5 +8,5 @@
8 8 <% if folder.children.empty? %>
9 9 <em><%= _('(empty folder)') %></em>
10 10 <% else %>
11   - <%= list_articles(folder.children) %>
  11 + <%= list_contents(:contents=>folder.children) %>
12 12 <% end %>
... ...
app/views/content_viewer/versioned_article.html.erb
... ... @@ -23,7 +23,6 @@
23 23 <p id="no-current-version">
24 24 <%= _('This is not the latest version of this content.') %>
25 25 </p>
26   -</div>
27 26  
28 27 <% version_license = @page.version_license(@version) %>
29 28 <%# This seemingly doubled verification exists because the article-sub-header
... ...
app/views/content_viewer/view_page.html.erb
... ... @@ -40,8 +40,6 @@
40 40 </div>
41 41 <% end %>
42 42  
43   -<%= render :partial => 'shared/disabled_enterprise' %>
44   -
45 43 <% if NOOSFERO_CONF['addthis_enabled'] %>
46 44 <%= render :partial => 'addthis' %>
47 45 <% end %>
... ... @@ -80,8 +78,8 @@
80 78 </h3>
81 79 <% end %>
82 80  
83   - <% if @page.accept_comments? && @comments.present? && @comments.count > 1 %>
84   - <%= link_to(_('Post a comment'), '#', :class => 'display-comment-form', :id => 'top-post-comment-button', :onclick => "jQuery('#page-comment-form .display-comment-form').first().click();") %>
  81 + <% if @comments.present? && @comments.count > 1 %>
  82 + <%= link_to(_('Post a comment'), '#', :class => 'display-comment-form', :id => 'top-post-comment-button', :onclick => "jQuery('#page-comment-form .display-comment-form').first().click();") if @page.accept_comments? %>
85 83  
86 84 <%= hidden_field_tag("page_url", url_for(:controller=>'content_viewer', :action=>'view_page', :profile=>profile.identifier, :page => @page.explode_path)) %>
87 85 <%= javascript_include_tag "comment_order.js" %>
... ... @@ -90,12 +88,14 @@
90 88 <%= select_tag 'comment_order', options_for_select({_('Oldest first')=>'oldest', _('Newest first')=>'newest'}, @comment_order) %>
91 89 <% end %>
92 90 </div>
  91 + <% end %>
93 92  
94   - <ul class="article-comments-list">
  93 + <ul class="article-comments-list">
  94 + <% if @comments.present? %>
95 95 <%= render :partial => 'comment/comment', :collection => @comments %>
96 96 <%= pagination_links @comments, :param_name => 'comment_page' %>
97   - </ul>
98   - <% end %>
  97 + <% end %>
  98 + </ul>
99 99  
100 100 <% if @page.accept_comments? %>
101 101 <div id='page-comment-form' class='page-comment-form'><%= render :partial => 'comment/comment_form', :locals =>{:url => {:controller => :comment, :action => :create}, :display_link => true, :cancel_triggers_hide => true}%></div>
... ...
app/views/memberships/index.html.erb
... ... @@ -8,11 +8,12 @@
8 8 <%= button :back, _('Go back'), :controller => 'profile_editor' %>
9 9 <% end %>
10 10  
11   -<% type_collection = [[nil, _('All')]] %>
  11 +<% type_collection = [[0, _('All')]] %>
12 12 <% type_collection += @roles.sort_by {|role| role.id}.map{|r| ["#{r.id}", r.name]} %>
13 13  
  14 +<%= javascript_include_tag "memberships_filter.js" %>
14 15 <p>
15   - <%= labelled_select(_('Filter')+': ', :filter_type, :first, :last, @filter, type_collection, :onchange => 'document.location.href = "?filter_type="+this.value')%>
  16 + <%= labelled_select(_('Filter')+': ', :filter_type, :first, :last, @filter, type_collection, :id => 'memberships_filter')%>
16 17 </p>
17 18  
18 19 <% if @memberships.empty? %>
... ...
app/views/pending_task_notifier/notification.html.erb
... ... @@ -1,25 +0,0 @@
1   -<%= _("Dear %s") % @person.name %>,
2   -
3   -<%= _("You have %d pending task(s).") % @tasks.size %>
4   -
5   -<%= @tasks.map{|i| " * #{i.description}"}.join("\n") %>
6   -
7   -<%= _("Click in address below to process task(s):") %>
8   -
9   -<%= @url_for_pending_tasks %>
10   -<% @organizations_with_pending_tasks.each do |organization| %>
11   -<% pending_tasks = @person.pending_tasks_for_organization(organization) %>
12   -<%= _("%s has %d pending task(s).") % [organization.name, pending_tasks.size] %>
13   -
14   -<%= pending_tasks.map{|i| " * #{i.information}"}.join("\n") %>
15   -
16   -<%= _("Click in address below to process task(s):") %>
17   -
18   -<%= url_for(:host => @default_hostname, :controller => 'tasks', :profile => organization.identifier) %>
19   -<% end %>
20   -
21   -<%= _('Greetings,') %>
22   -
23   ---
24   -<%= _('%s team.') % @environment %>
25   -<%= @url %>
app/views/pending_task_notifier/notification.text.erb 0 → 100644
... ... @@ -0,0 +1,25 @@
  1 +<%= _("Dear %s") % @person.name %>,
  2 +
  3 +<%= _("You have %d pending task(s).") % @tasks.size %>
  4 +
  5 +<%= @tasks.map{|i| " * #{i.description}"}.join("\n") %>
  6 +
  7 +<%= _("Click in address below to process task(s):") %>
  8 +
  9 +<%= @url_for_pending_tasks %>
  10 +<% @organizations_with_pending_tasks.each do |organization| %>
  11 +<% pending_tasks = @person.pending_tasks_for_organization(organization) %>
  12 +<%= _("%s has %d pending task(s).") % [organization.name, pending_tasks.size] %>
  13 +
  14 +<%= pending_tasks.map{|i| " * #{i.information}"}.join("\n") %>
  15 +
  16 +<%= _("Click in address below to process task(s):") %>
  17 +
  18 +<%= url_for(:host => @default_hostname, :controller => 'tasks', :profile => organization.identifier) %>
  19 +<% end %>
  20 +
  21 +<%= _('Greetings,') %>
  22 +
  23 +--
  24 +<%= _('%s team.') % @environment %>
  25 +<%= @url %>
... ...
app/views/profile/index.html.erb
1   -<%= render :partial => 'shared/disabled_enterprise' %>
2   -
3 1 <h1><%= h profile.name %></h1>
4 2  
5 3 <% if @action %>
... ... @@ -19,7 +17,7 @@
19 17 <table class='profile'>
20 18 <tr>
21 19 <td colspan='2'>
22   - <% plugins_tabs = @plugins.dispatch(:profile_tabs).map { |tab| {:title => tab[:title], :id => tab[:id], :content => instance_exec(&tab[:content]), :start => tab[:title]} }%>
  20 + <% plugins_tabs = @plugins.dispatch(:profile_tabs).map { |tab| {:title => tab[:title], :id => tab[:id], :content => instance_exec(&tab[:content]), :start => tab[:start]} }%>
23 21  
24 22 <% tabs = plugins_tabs.select { |tab| tab[:start] } %>
25 23  
... ...
app/views/profile/sitemap.html.erb
1 1 <h1><%= _("%s: site map") % profile.name %></h1>
2 2  
3   -<%= list_articles(available_articles(@articles, user), false) %>
  3 +<%= list_contents :contents=>available_articles(@articles, user), :list_type=>:sitemap %>
... ...
app/views/profile_editor/index.html.erb
... ... @@ -24,7 +24,7 @@
24 24  
25 25 <%= control_panel_button(_('Edit Appearance'), 'design-editor', :controller => 'profile_themes', :action => 'index') %>
26 26  
27   - <%= control_panel_button(_('Edit Header and Footer'), 'header-and-footer', :controller => 'profile_editor', :action => 'header_footer') unless profile.enterprise? && environment.enabled?('disable_header_and_footer') && !user.is_admin?(environment) %>
  27 + <%= control_panel_button(_('Edit Header and Footer'), 'header-and-footer', :controller => 'profile_editor', :action => 'header_footer') if user.is_admin?(environment) || (!profile.enterprise? && !environment.enabled?('disable_header_and_footer')) %>
28 28  
29 29 <%= control_panel_button(_('Manage Content'), 'cms', :controller => 'cms') %>
30 30  
... ...
app/views/scrap/notifier/notification.html.erb
... ... @@ -1,16 +0,0 @@
1   -<%= _('Hi, %{recipient}!') % { :recipient => @recipient } %>
2   -
3   -<%= word_wrap(_('%{sender} (%{sender_link}) has left the following scrap for you:') % { :sender => @sender, :sender_link => url_for(@sender_link) }) %>
4   -
5   --------------------------------------------------------------------------------
6   -<%= word_wrap(@scrap_content) %>
7   --------------------------------------------------------------------------------
8   -
9   -<%= _('View this scrap on the wall') %>:
10   -<%= url_for @wall_url %>
11   -
12   -<%= _("Greetings,") %>
13   -
14   ---
15   -<%= _('%s team.') % @environment %>
16   -<%= url_for @url %>
app/views/scrap/notifier/notification.text.erb 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +<%= _('Hi, %{recipient}!') % { :recipient => @recipient } %>
  2 +
  3 +<%= word_wrap(_('%{sender} (%{sender_link}) has left the following scrap for you:') % { :sender => @sender, :sender_link => url_for(@sender_link) }) %>
  4 +
  5 +-------------------------------------------------------------------------------
  6 +<%= word_wrap(@scrap_content) %>
  7 +-------------------------------------------------------------------------------
  8 +
  9 +<%= _('View this scrap on the wall') %>:
  10 +<%= url_for @wall_url %>
  11 +
  12 +<%= _("Greetings,") %>
  13 +
  14 +--
  15 +<%= _('%s team.') % @environment %>
  16 +<%= url_for @url %>
... ...
app/views/shared/_disabled_enterprise.html.erb
... ... @@ -1,10 +0,0 @@
1   -<% if profile.enterprise? && !profile.enabled? && !profile.blocks.select {|b| b.class == DisabledEnterpriseMessageBlock}.any? %>
2   - <div id='profile-disabled'>
3   - <%= environment.message_for_disabled_enterprise %>
4   - <% if profile.blocked? && user && user.is_admin?(profile.environment) %>
5   - <div class='unlock-button'>
6   - <%= button :lock, _('Unblock'), {:controller => 'profile', :action => 'unblock'} %>
7   - </div>
8   - <% end %>
9   - </div>
10   -<% end %>
app/views/shared/_manage_link.html.erb
1 1 <div id=<%= "manage-#{kind}" %> class="manage-groups">
2   - <a href="#" id=<%= "manage-#{kind}-link" %> class="simplemenu-trigger" title="<%= _('Manage %s') % kind %>"><i class=<%= "icon-menu-#{kind.singularize}" %>></i><strong><%= ui_icon('ui-icon-triangle-1-s') + _('My %s') % kind %></strong></a>
  2 + <a href="#" id=<%= "manage-#{kind}-link" %> class="simplemenu-trigger" title="<%= _('Manage %s') % _(kind) %>"><i class=<%= "icon-menu-#{kind.singularize}" %>></i><strong><%= ui_icon('ui-icon-triangle-1-s') + title %></strong></a>
3 3 <ul class="simplemenu-submenu">
4 4 <% link.each do |link| %>
5 5 <li class="simplemenu-item"><%= link %></li>
... ...
app/views/shared/articles_list.html.erb
... ... @@ -1,14 +0,0 @@
1   -<table>
2   -
3   - <tr>
4   - <th><%= _('Title') %></th>
5   - <th><%= _('Last update') %></th>
6   - </tr>
7   - <% articles.each do |article| %>
8   - <% if article.display_to?(user) %>
9   - <%= display_article_in_listing(article, recursive, 0) %>
10   - <% end %>
11   - <% end %>
12   -</table>
13   -
14   -<p><%= pagination_links(articles, {:param_name => 'npage', :page_links => true}) %></p>
app/views/shared/content_list.html.erb 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +<table class="<%= list_type %>-content">
  2 + <tr>
  3 + <th><%= _('Title') %></th>
  4 + <th><%= _('Last update') %></th>
  5 + </tr>
  6 + <% contents.each do |content| %>
  7 + <% if content.display_to?(user) %>
  8 + <%= display_content_in_listing :content=>content, :list_type=>list_type, :recursive=>recursive %>
  9 + <% end %>
  10 + <% end %>
  11 +</table>
  12 +
  13 +<p><%= pagination_links contents, :param_name => 'npage', :page_links => true %></p>
... ...
app/views/shared/update_categories.js.erb
1 1 <%
2 2 content = render :partial => 'shared/select_categories',
3   - :locals => {:object_name => 'article', :multiple => true}, :layout => false
  3 + :locals => {:object_name => object_name, :multiple => true}, :layout => false
4 4 %>
5 5 jQuery('#select-categories').html('<%= j(content) %>');
... ...
app/views/task_mailer/invitation_notification.html.erb
... ... @@ -1 +0,0 @@
1   -<%= @message %>
2 0 \ No newline at end of file
app/views/task_mailer/invitation_notification.text.erb 0 → 100644
... ... @@ -0,0 +1 @@
  1 +<%= @message %>
0 2 \ No newline at end of file
... ...
app/views/task_mailer/target_notification.html.erb
... ... @@ -1,10 +0,0 @@
1   -<%= _('Hello %s,') % @target %>
2   -
3   -<%= word_wrap(@message) %>
4   -
5   -<%= word_wrap(_('Access your list of tasks or your control panel to see this and other pending actions that need your attention.')) %>
6   -<%= @tasks_url %>
7   -
8   ---
9   -<%= _('%s team.') % @environment %>
10   -<%= @url %>
app/views/task_mailer/target_notification.text.erb 0 → 100644
... ... @@ -0,0 +1,10 @@
  1 +<%= _('Hello %s,') % @target %>
  2 +
  3 +<%= word_wrap(@message) %>
  4 +
  5 +<%= word_wrap(_('Access your list of tasks or your control panel to see this and other pending actions that need your attention.')) %>
  6 +<%= @tasks_url %>
  7 +
  8 +--
  9 +<%= _('%s team.') % @environment %>
  10 +<%= @url %>
... ...
app/views/task_mailer/task_activated.text.erb 0 → 120000
... ... @@ -0,0 +1 @@
  1 +task_cancelled.text.erb
0 2 \ No newline at end of file
... ...
app/views/task_mailer/task_activated.text.plain.html.erb
... ... @@ -1 +0,0 @@
1   -task_cancelled.text.plain.html.erb
2 0 \ No newline at end of file
app/views/task_mailer/task_cancelled.text.erb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +<%= _('Dear %s,') % @requestor %>
  2 +
  3 +<%= word_wrap(@message) %>
  4 +
  5 +<%= _('Greetings,') %>
  6 +
  7 +--
  8 +<%= _('%s team.') % @environment %>
  9 +<%= @url %>
... ...
app/views/task_mailer/task_cancelled.text.plain.html.erb
... ... @@ -1,9 +0,0 @@
1   -<%= _('Dear %s,') % @requestor %>
2   -
3   -<%= word_wrap(@message) %>
4   -
5   -<%= _('Greetings,') %>
6   -
7   ---
8   -<%= _('%s team.') % @environment %>
9   -<%= @url %>
app/views/task_mailer/task_created.text.erb 0 → 120000
... ... @@ -0,0 +1 @@
  1 +task_cancelled.text.erb
0 2 \ No newline at end of file
... ...
app/views/task_mailer/task_created.text.plain.html.erb
... ... @@ -1 +0,0 @@
1   -task_cancelled.text.plain.html.erb
2 0 \ No newline at end of file
app/views/task_mailer/task_finished.text.erb 0 → 120000
... ... @@ -0,0 +1 @@
  1 +task_cancelled.text.erb
0 2 \ No newline at end of file
... ...
app/views/task_mailer/task_finished.text.plain.html.erb
... ... @@ -1 +0,0 @@
1   -task_cancelled.text.plain.html.erb
2 0 \ No newline at end of file
app/views/user_mailer/activation_code.html.erb
... ... @@ -1,9 +0,0 @@
1   -<%= _('Hi, %{recipient}!') % { :recipient => @recipient } %>
2   -
3   -<%= word_wrap(_('Welcome to %{environment}! To activate your account, follow the link: %{activation_url}') % { :environment => @environment, :activation_url => @url + url_for(:controller => :account, :action => :activate, :activation_code => @activation_code, :redirection => @redirection, :join => @join) }) %>
4   -
5   -<%= _("Greetings,") %>
6   -
7   ---
8   -<%= _('%s team.') % @environment %>
9   -<%= url_for @url %>
app/views/user_mailer/activation_code.text.erb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +<%= _('Hi, %{recipient}!') % { :recipient => @recipient } %>
  2 +
  3 +<%= word_wrap(_('Welcome to %{environment}! To activate your account, follow the link: %{activation_url}') % { :environment => @environment, :activation_url => @url + url_for(:controller => :account, :action => :activate, :activation_code => @activation_code, :redirection => @redirection, :join => @join) }) %>
  4 +
  5 +<%= _("Greetings,") %>
  6 +
  7 +--
  8 +<%= _('%s team.') % @environment %>
  9 +<%= url_for @url %>
... ...
app/views/user_mailer/activation_email_notify.html.erb
... ... @@ -1,12 +0,0 @@
1   -<%= _('Hello %s,') % @name %>
2   -
3   -<%= _('Your email %s was just activated.') % [@email] %>
4   -
5   -<%= _('You can access your e-mail from anywhere, using the following address:') %>
6   -<%= @webmail %>
7   -
8   -<%= _('Greetings,') %>
9   -
10   ---
11   -<%= _('%s team.') % @environment %>
12   -<%= @url %>