Commit 1f0194be42835a51ee86741bb9f56a1a0f297c5d
Exists in
master
and in
29 other branches
Merge branch 'master' into rails3-merge
Conflicts: app/views/profile_themes/add_css.rhtml app/views/profile_themes/add_image.rhtml app/views/profile_themes/css_editor.rhtml app/views/profile_themes/edit.rhtml app/views/profile_themes/new.rhtml app/views/themes/add_css.html.erb app/views/themes/add_css.rhtml app/views/themes/add_image.html.erb app/views/themes/add_image.rhtml app/views/themes/css_editor.html.erb app/views/themes/css_editor.rhtml app/views/themes/edit.html.erb app/views/themes/edit.rhtml app/views/themes/index.html.erb app/views/themes/new.html.erb app/views/themes/new.rhtml test/factories.rb test/functional/profile_themes_controller_test.rb
Showing
40 changed files
with
1132 additions
and
642 deletions
Show diff stats
@@ -0,0 +1,231 @@ | @@ -0,0 +1,231 @@ | ||
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 | +Alan Freihof Tygel <alantygel@gmail.com> | ||
10 | +Alessandro Palmeira <alessandro.palmeira@gmail.com> | ||
11 | +Alessandro Palmeira + Caio C. Salgado <alessandro.palmeira@gmail.com> | ||
12 | +Alessandro Palmeira + Caio Salgado <alessandro.palmeira@gmail.com> | ||
13 | +Alessandro Palmeira + Caio Salgado <caio.csalgado@gmail.com> | ||
14 | +Alessandro Palmeira + Caio Salgado + Diego Araújo + João M. M. da Silva <diegoamc90@gmail.com> | ||
15 | +Alessandro Palmeira + Carlos Morais <alessandro.palmeira@gmail.com> | ||
16 | +Alessandro Palmeira + Daniel Alves <alessandro.palmeira@gmail.com> | ||
17 | +Alessandro Palmeira + Daniel Alves + Diego Araújo <diegoamc90@gmail.com> | ||
18 | +Alessandro Palmeira + Daniel Alves + Diego Araújo + Guilherme Rojas <danpaulalves@gmail.com> | ||
19 | +Alessandro Palmeira + Diego Araujo <alessandro.palmeira@gmail.com> | ||
20 | +Alessandro Palmeira + Diego Araújo <alessandro.palmeira@gmail.com> | ||
21 | +Alessandro Palmeira + Diego Araujo + Daniela Feitosa <alessandro.palmeira@gmail.com> | ||
22 | +Alessandro Palmeira + Diego Araujo <diegoamc90@gmail.com> | ||
23 | +Alessandro Palmeira + Diego Araújo <diegoamc90@gmail.com> | ||
24 | +Alessandro Palmeira + Diego Araujo + Eduardo Morais <alessandro.palmeira@gmail.com> | ||
25 | +Alessandro Palmeira + Diego Araújo + João M. M. da Silva <alessandro.palmeira@gmail.com> | ||
26 | +Alessandro Palmeira + Diego Araújo + João M. M. da Silva <diegoamc90@gmail.com> | ||
27 | +Alessandro Palmeira + Diego Araujo + João M. M. da Silva + Paulo Meirelles <alessandro.palmeira@gmail.com> | ||
28 | +Alessandro Palmeira + Diego Araújo + Pedro Leal <diegoamc90@gmail.com> | ||
29 | +Alessandro Palmeira + Diego Araújo + Pedro Leal + João M. M. da Silva <diegoamc90@gmail.com> | ||
30 | +Alessandro Palmeira + Diego Araujo + Rafael Manzo <alessandro.palmeira@gmail.com> | ||
31 | +Alessandro Palmeira + Eduardo Morais <alessandro.palmeira@gmail.com> | ||
32 | +Alessandro Palmeira + Guilherme Rojas <alessandro.palmeira@gmail.com> | ||
33 | +Alessandro Palmeira + Jefferson Fernandes <alessandro.palmeira@gmail.com> | ||
34 | +Alessandro Palmeira + João M. M. da Silva <alessandro.palmeira@gmail.com> | ||
35 | +Alessandro Palmeira + Joao M. M. da Silva + Diego Araujo <alessandro.palmeira@gmail.com> | ||
36 | +Alessandro Palmeira + João M. M. da Silva + Renan Teruo <alessandro.palmeira@gmail.com> | ||
37 | +Alessandro Palmeira + João M. M. Silva <alessandro.palmeira@gmail.com> | ||
38 | +Alessandro Palmeira + Paulo Meirelles <alessandro.palmeira@gmail.com> | ||
39 | +Alessandro Palmeira + Paulo Meirelles + João M. M. da Silva <alessandro.palmeira@gmail.com> | ||
40 | +Alessandro Palmeira + Rafael Manzo <alessandro.palmeira@gmail.com> | ||
41 | +Antonio Terceiro + Carlos Morais <terceiro@colivre.coop.br> | ||
42 | +Antonio Terceiro + Paulo Meirelles <terceiro@colivre.coop.br> | ||
43 | +Antonio Terceiro <terceiro@colivre.coop.br> | ||
44 | +Arthur Del Esposte <arthurmde@yahoo.com.br> | ||
45 | +Aurelio A. Heckert <aurelio@colivre.coop.br> | ||
46 | +Braulio Bhavamitra <brauliobo@gmail.com> | ||
47 | +Bráulio Bhavamitra <brauliobo@gmail.com> | ||
48 | +Braulio Bhavamitra <braulio@eita.org.br> | ||
49 | +Caio <caio.csalgado@gmail.com> | ||
50 | +Caio + Diego + Pedro + João <caio.csalgado@gmail.com> | ||
51 | +Caio Formiga <caio.formiga@gmail.com> | ||
52 | +Caio, Pedro <caio.csalgado@gmail.com> | ||
53 | +Caio Salgado + Alessandro Palmeira <caio.csalgado@gmail.com> | ||
54 | +Caio Salgado <caio.csalgado@gmail.com> | ||
55 | +Caio Salgado + Carlos Morais + Diego Araújo + Pedro Leal <diegoamc90@gmail.com> | ||
56 | +Caio Salgado + Diego Araujo <caio.csalgado@gmail.com> | ||
57 | +Caio Salgado + Diego Araújo <caio.csalgado@gmail.com> | ||
58 | +Caio Salgado + Diego Araújo <diegoamc90@gmail.com> | ||
59 | +Caio Salgado + Diego Araújo + Jefferson Fernandes <caio.csalgado@gmail.com> | ||
60 | +Caio Salgado + Diego Araújo + João M. M. da Silva <caio.csalgado@gmail.com> | ||
61 | +Caio Salgado + Diego Araújo + Pedro Leal <caio.csalgado@gmail.com> | ||
62 | +Caio Salgado + Diego Araújo + Pedro Leal <diegoamc90@gmail.com> | ||
63 | +Caio Salgado + Diego Araújo + Rafael Manzo <diegoamc90@gmail.com> | ||
64 | +Caio Salgado + Jefferson Fernandes <caio.csalgado@gmail.com> | ||
65 | +Caio Salgado + Jefferson Fernandes <jeffs.fernandes@gmail.com> | ||
66 | +Caio Salgado + Rafael Manzo <caio.csalgado@gmail.com> | ||
67 | +Caio Salgado + Renan Teruo <caio.csalgado@gmail.com> | ||
68 | +Caio Salgado + Renan Teruo <caio.salgado@gmail.com> | ||
69 | +Caio Salgado + Renan Teruo + Jefferson Fernandes <jeffs.fernandes@gmail.com> | ||
70 | +Caio Salgado + Renan Teruo <renanteruoc@gmail.com> | ||
71 | +Caio SBA <caio@colivre.coop.br> | ||
72 | +Carlos Andre de Souza <carlos.andre.souza@msn.com> | ||
73 | +Carlos Morais <carlos88morais@gmail.com> | ||
74 | +Carlos Morais + Diego Araújo <diegoamc90@gmail.com> | ||
75 | +Carlos Morais + Eduardo Morais <carlos88morais@gmail.com> | ||
76 | +Carlos Morais + Paulo Meirelles <carlos88morais@gmail.com> | ||
77 | +Carlos Morais + Pedro Leal <carlos88morais@gmail.com> | ||
78 | +Daniel Alves + Diego Araújo <danpaulalves@gmail.com> | ||
79 | +Daniel Alves + Diego Araújo <diegoamc90@gmail.com> | ||
80 | +Daniel Alves + Diego Araújo + Guilherme Rojas <danpaulalves@gmail.com> | ||
81 | +Daniel Alves + Diego Araújo + Guilherme Rojas <diegoamc90@gmail.com> | ||
82 | +Daniel Alves + Diego Araújo + Guilherme Rojas <guilhermehrojas@gmail.com> | ||
83 | +Daniel Alves + Guilherme Rojas <danpaulalves@gmail.com> | ||
84 | +Daniel Alves + Rafael Manzo <rr.manzo@gmail.com> | ||
85 | +Daniela Soares Feitosa <danielafeitosa@colivre.coop.br> | ||
86 | +Daniel Bucher <daniel.bucher88@gmail.com> | ||
87 | +Daniel Cunha <daniel@colivre.coop.br> | ||
88 | +diegoamc <diegoamc90@gmail.com> | ||
89 | +Diego Araújo + Alessandro Palmeira <diegoamc90@gmail.com> | ||
90 | +Diego Araújo + Alessandro Palmeira + João M. M. da Silva <diegoamc90@gmail.com> | ||
91 | +Diego Araújo + Alessandro Palmeira + Rafael Manzo <rr.manzo@gmail.com> | ||
92 | +Diego Araujo + Caio Salgado <diegoamc90@gmail.com> | ||
93 | +Diego Araújo + Daniel Alves + Rafael Manzo <rr.manzo@gmail.com> | ||
94 | +Diego Araújo <diegoamc90@gmail.com> | ||
95 | +Diego Araújo + Eduardo Morais + Paulo Meirelles <diegoamc90@gmail.com> | ||
96 | +Diego Araújo + Guilherme Rojas <diegoamc90@gmail.com> | ||
97 | +Diego Araújo + Jefferson Fernandes <diegoamc90@gmail.com> | ||
98 | +Diego Araujo + Jefferson Fernandes <jeffs.fernandes@gmail.com> | ||
99 | +Diego Araújo + João Machini <diegoamc90@gmail.com> | ||
100 | +Diego Araújo + João Machini <digoamc90@gmail.com> | ||
101 | +Diego Araújo + João M. M. da Silva + Alessandro Palmeira <jaodsilv@linux.ime.usp.br> | ||
102 | +Diego Araújo + João M. M. da Silva <diegoamc90@gmail.com> | ||
103 | +Diego Araújo + João M. M. da Silva + João Machini <diegoamc90@gmail.com> | ||
104 | +Diego Araújo + João M. M. da Silva + Pedro Leal <diegoamc90@gmail.com> | ||
105 | +Diego Araújo + Paulo Meirelles <diegoamc90@gmail.com> | ||
106 | +Diego Araújo + Pedro Leal <diegoamc90@gmail.com> | ||
107 | +Diego Araujo + Rafael Manzo <diegoamc90@gmail.com> | ||
108 | +Diego Araújo + Rafael Manzo <diegoamc90@gmail.com> | ||
109 | +Diego Araújo + Renan Teruo + Alessandro Palmeira <diegoamc90@gmail.com> | ||
110 | +Diego Araújo + Renan Teruo <diegoamc90@gmail.com> | ||
111 | +Diego Araujo + Rodrigo Souto + Rafael Manzo <rr.manzo@gmail.com> | ||
112 | +Diego + Jefferson <diegoamc90@gmail.com> | ||
113 | +Diego Martinez <diegoamc90@gmail.com> | ||
114 | +Diego Martinez <diego@diego-K55A.(none)> | ||
115 | +Diego + Renan <renanteruoc@gmail.com> | ||
116 | +Eduardo Tourinho Edington <eduardo.edington@serpro.gov.br> | ||
117 | +Fernanda Lopes <nanda.listas+psl@gmail.com> | ||
118 | +Francisco Marcelo A. Lima Júnior <francisco.lima-junior@serpro.gov.br> | ||
119 | +Francisco Marcelo de Araujo Lima Junior <79350259591@serpro-1457614.(none)> | ||
120 | +Francisco Marcelo de Araújo Lima Júnior <francisco.lima-junior@serpro.gov.br> | ||
121 | +Francisco Marcelo de Araújo Lima Júnior <maljunior@gmail.com> | ||
122 | +Grazieno Pellegrino <grazieno@gmail.com> | ||
123 | +Isaac Canan <isaac@intelletto.com.br> | ||
124 | +Italo Valcy <italo@dcc.ufba.br> | ||
125 | +Jefferson Fernandes + Diego Araujo + Rafael Manzo <jeffs.fernandes@gmail.com> | ||
126 | +Jefferson Fernandes + Joao M. M. da Silva <jeffs.fernandes@gmail.com> | ||
127 | +Jefferson Fernandes + Joao M. M. Silva <jeffs.fernandes@gmail.com> | ||
128 | +João da Silva <jaodsilv@linux.ime.usp.br> | ||
129 | +João Marco Maciel da Silva + Rafael Manzo + Renan Teruo <jaodsilv@linux.ime.usp.br> | ||
130 | +João M. M. da Silva + Alessandro Palmeira + Diego Araújo + Caio Salgado <jaodsilv@linux.ime.usp.br> | ||
131 | +João M. M. da Silva + Alessandro Palmeira + Diego Araújo <jaodsilv@linux.ime.usp.br> | ||
132 | +Joao M. M. da Silva + Alessandro Palmeira <jaodsilv@linux.ime.usp.br> | ||
133 | +João M. M. da Silva + Alessandro Palmeira <jaodsilv@linux.ime.usp.br> | ||
134 | +João M. M. da Silva + Alessandro Palmeira + João Machini <jaodsilv@linux.ime.usp.br> | ||
135 | +João M. M. da Silva + Caio Salgado + Alessandro Palmeira <jaodsilv@linux.ime.usp.br> | ||
136 | +João M. M. da Silva + Caio Salgado <jaodsilv@linux.ime.usp.br> | ||
137 | +João M. M. da Silva + Carlos Morais <jaodsilv@linux.ime.usp.br> | ||
138 | +João M. M. da Silva + Diego Araújo <diegoamc90@gmail.com> | ||
139 | +João M. M. da Silva + Diego Araújo <jaodsilv@linux.ime.usp.br> | ||
140 | +João M. M. da Silva + Diego Araújo + Pedro Leal <jaodsilv@linux.ime.usp.br> | ||
141 | +João M. M. da Silva <jaodsilv@linux.ime.usp.br> | ||
142 | +Joao M. M. da Silva + Jefferson Fernandes <jaodsilv@linux.ime.usp.br> | ||
143 | +João M. M. da Silva + Jefferson Fernandes <jaodsilv@linux.ime.usp.br> | ||
144 | +João M. M. da Silva + João M. Miranda <jaodsilv@linux.ime.usp.br> | ||
145 | +João M. M. da Silva + Paulo Meirelles <jaodsilv@linux.ime.usp.br> | ||
146 | +João M. M. da Silva + Pedro Leal <jaodsilv@linux.ime.usp.br> | ||
147 | +João M. M. da Silva + Rafael Manzo + Diego Araújo <jaodsilv@linux.ime.usp.br> | ||
148 | +João M. M. da Silva + Rafael Manzo <jaodsilv@linux.ime.usp.br> | ||
149 | +João M. M. da Silva + Renan Teruo <jaodsilv@linux.ime.usp.br> | ||
150 | +João M. M. Silva + Caio Salgado <jaodsilv@linux.ime.usp.br> | ||
151 | +João M. M. Silva + Diego Araújo <jaodsilv@linux.ime.usp.br> | ||
152 | +Joao M. M. Silva + Jefferson Fernandes <jaodsilv@linux.ime.usp.br> | ||
153 | +João M. M. Silva + Paulo Meirelles <jaodsilv@linux.ime.usp.br> | ||
154 | +João M. M. Silva + Rafael Manzo <jaodsilv@linux.ime.usp.br> | ||
155 | +João M. M. Silva + Renan Teruo <jaodsilv@linux.ime.usp.br> | ||
156 | +Joenio Costa <joenio@colivre.coop.br> | ||
157 | +Josef Spillner <josef.spillner@tu-dresden.de> | ||
158 | +Junior Silva <juniorsilva1001@gmail.com> | ||
159 | +Junior Silva <juniorsilva7@juniorsilva-Aspire-5750Z.(none)> | ||
160 | +Junior Silva <juniorsilva@colivre.coop.br> | ||
161 | +Keilla Menezes <keilla@colivre.coop.br> | ||
162 | +Larissa Reis <larissa@colivre.coop.br> | ||
163 | +Larissa Reis <reiss.larissa@gmail.com> | ||
164 | +Leandro Nunes dos Santos <81665687568@serpro-1541727.Home> | ||
165 | +Leandro Nunes dos Santos <81665687568@serpro-1541727.(none)> | ||
166 | +Leandro Nunes dos Santos <leandronunes@gmail.com> | ||
167 | +Leandro Nunes dos Santos <leandro.santos@serpro.gov.br> | ||
168 | +LinguÁgil 2010 <linguagil.bahia@gmail.com> | ||
169 | +Lucas Melo <lucas@colivre.coop.br> | ||
170 | +Lucas Melo <lucaspradomelo@gmail.com> | ||
171 | +Luis David Aguilar Carlos <ludwig9003@gmail.com> | ||
172 | +Marcos Ramos <ms.ramos@outlook.com> | ||
173 | +Martín Olivera <molivera@solar.org.ar> | ||
174 | +Moises Machado <moises@colivre.coop.br> | ||
175 | +Naíla Alves <naila@colivre.coop.br> | ||
176 | +Nanda Lopes <nanda.listas+psl@gmail.com> | ||
177 | +Paulo Meirelles + Alessandro Palmeira + João M. M. da Silva <paulo@softwarelivre.org> | ||
178 | +Paulo Meirelles + Alessandro Palmeira <paulo@softwarelivre.org> | ||
179 | +Paulo Meirelles + Carlos Morais <paulo@softwarelivre.org> | ||
180 | +Paulo Meirelles + Diego Araújo <paulo@softwarelivre.org> | ||
181 | +Paulo Meirelles + João M. M. da Silva <paulo@softwarelivre.org> | ||
182 | +Paulo Meirelles <paulo@softwarelivre.org> | ||
183 | +Paulo Meirelles + Rafael Manzo <paulo@softwarelivre.org> | ||
184 | +Rafael Gomes <rafaelgomes@techfree.com.br> | ||
185 | +Rafael Manzo + Alessandro Palmeira <rr.manzo@gmail.com> | ||
186 | +Rafael Manzo + Daniel Alves <danpaulalves@gmail.com> | ||
187 | +Rafael Manzo + Diego Araújo <rr.manzo@gmail.com> | ||
188 | +Rafael Manzo + João M. M. Silva <rr.manzo@gmail.com> | ||
189 | +Rafael Manzo + Paulo Meirelles <rr.manzo@gmail.com> | ||
190 | +Rafael Martins <rmmartins@gmail.com> | ||
191 | +Rafael Reggiani Manzo + Caio Salgado + Jefferson Fernandes <rr.manzo@gmail.com> | ||
192 | +Rafael Reggiani Manzo + Diego Araujo <diegoamc90@gmail.com> | ||
193 | +Rafael Reggiani Manzo + Diego Araujo <rr.manzo@gmail.com> | ||
194 | +Rafael Reggiani Manzo + Diego Araújo <rr.manzo@gmail.com> | ||
195 | +Rafael Reggiani Manzo + João M. M. da Silva <rr.manzo@gmail.com> | ||
196 | +Rafael Reggiani Manzo <rr.manzo@gmail.com> | ||
197 | +Raphaël Rousseau <raph@r4f.org> | ||
198 | +Raquel Lira <raquel.lira@gmail.com> | ||
199 | +Renan Teruo + Caio Salgado <renanteruoc@gmail.com> | ||
200 | +Renan Teruoc + Diego Araujo <renanteruoc@gmail.com> | ||
201 | +Renan Teruo + Diego Araujo <renanteruoc@gmail.com> | ||
202 | +Renan Teruo + Diego Araújo <renanteruoc@gmail.com> | ||
203 | +Renan Teruo + Paulo Meirelles <renanteruoc@gmail.com> | ||
204 | +Renan Teruo + Rafael Manzo <renanteruoc@gmail.com> | ||
205 | +Rodrigo Souto <diguliu@gmail.com> | ||
206 | +Rodrigo Souto <rodrigo@colivre.coop.br> | ||
207 | +Ronny Kursawe <kursawe.ronny@googlemail.com> | ||
208 | +root <root@debian.sdr.serpro> | ||
209 | +Samuel R. C. Vale <srcvale@holoscopio.com> | ||
210 | +Valessio Brito <contato@valessiobrito.com.br> | ||
211 | +Valessio Brito <contato@valessiobrito.info> | ||
212 | +Valessio Brito <valessio@gmail.com> | ||
213 | +vfcosta <vfcosta@gmail.com> | ||
214 | +Victor Carvalho <victorhugodf.ac@gmail.com> | ||
215 | +Victor Costa <vfcosta@gmail.com> | ||
216 | +Victor Hugo Alves de Carvalho <victorhugodf.ac@gmail.com> | ||
217 | +Vinicius Cubas Brand <viniciuscb@gmail.com> | ||
218 | +Visita <visita@debian.(none)> | ||
219 | +Yann Lugrin <yann.lugrin@liquid-concept.ch> | ||
220 | + | ||
221 | +Ideas, specifications and incentive | ||
222 | +=================================== | ||
223 | +Daniel Tygel <dtygel@fbes.org.br> | ||
224 | +Guilherme Rocha <guilherme@gf7.com.br> | ||
225 | +Raphael Rousseau <raph@r4f.org> | ||
226 | +Théo Bondolfi <move@cooperation.net> | ||
227 | +Vicente Aguiar <vicenteaguiar@colivre.coop.br> | ||
228 | + | ||
229 | +Arts | ||
230 | +=================================== | ||
231 | +Nara Oliveira <narananet@gmail.com> |
@@ -0,0 +1,75 @@ | @@ -0,0 +1,75 @@ | ||
1 | +class ProfileThemesController < ThemesController | ||
2 | + | ||
3 | + needs_profile | ||
4 | + | ||
5 | + protect 'edit_appearance', :profile | ||
6 | + | ||
7 | + no_design_blocks | ||
8 | + | ||
9 | + def target | ||
10 | + @target = profile | ||
11 | + end | ||
12 | + | ||
13 | + def new | ||
14 | + if !request.xhr? | ||
15 | + id = params[:name] ? params[:name].to_slug : 'my-theme' | ||
16 | + t = Theme.new(id, :name => params[:name], :owner => profile, :public => false) | ||
17 | + t.save | ||
18 | + redirect_to :action => 'index' | ||
19 | + else | ||
20 | + render :action => 'new', :layout => false | ||
21 | + end | ||
22 | + end | ||
23 | + | ||
24 | + def edit | ||
25 | + @theme = profile.find_theme(params[:id]) | ||
26 | + @css_files = @theme.css_files | ||
27 | + @image_files = @theme.image_files | ||
28 | + end | ||
29 | + | ||
30 | + def add_css | ||
31 | + @theme = profile.find_theme(params[:id]) | ||
32 | + if request.xhr? | ||
33 | + render :action => 'add_css', :layout => false | ||
34 | + else | ||
35 | + @theme.add_css(params[:css]) | ||
36 | + redirect_to :action => 'edit', :id => @theme.id | ||
37 | + end | ||
38 | + end | ||
39 | + | ||
40 | + def css_editor | ||
41 | + @theme = profile.find_theme(params[:id]) | ||
42 | + @css = params[:css] | ||
43 | + | ||
44 | + @code = @theme.read_css(@css) | ||
45 | + render :action => 'css_editor', :layout => false | ||
46 | + end | ||
47 | + | ||
48 | + post_only :update_css | ||
49 | + def update_css | ||
50 | + @theme = profile.find_theme(params[:id]) | ||
51 | + @theme.update_css(params[:css], params[:csscode]) | ||
52 | + redirect_to :action => 'edit', :id => @theme.id | ||
53 | + end | ||
54 | + | ||
55 | + def add_image | ||
56 | + @theme = profile.find_theme(params[:id]) | ||
57 | + if request.xhr? | ||
58 | + render :action => 'add_image', :layout => false | ||
59 | + else | ||
60 | + @theme.add_image(params[:image].original_filename, params[:image].read) | ||
61 | + redirect_to :action => 'edit', :id => @theme.id | ||
62 | + end | ||
63 | + end | ||
64 | + | ||
65 | + def start_test | ||
66 | + session[:theme] = params[:id] | ||
67 | + redirect_to :controller => 'content_viewer', :profile => profile.identifier, :action => 'view_page' | ||
68 | + end | ||
69 | + | ||
70 | + def stop_test | ||
71 | + session[:theme] = nil | ||
72 | + redirect_to :action => 'index' | ||
73 | + end | ||
74 | + | ||
75 | +end |
app/controllers/my_profile/themes_controller.rb
@@ -1,91 +0,0 @@ | @@ -1,91 +0,0 @@ | ||
1 | -class ThemesController < MyProfileController | ||
2 | - | ||
3 | - protect 'edit_appearance', :profile | ||
4 | - no_design_blocks | ||
5 | - | ||
6 | - def set | ||
7 | - profile.update_theme(params[:id]) | ||
8 | - redirect_to :action => 'index' | ||
9 | - end | ||
10 | - | ||
11 | - def unset | ||
12 | - profile.update_theme(nil) | ||
13 | - redirect_to :action => 'index' | ||
14 | - end | ||
15 | - | ||
16 | - def index | ||
17 | - @themes = profile.environment.themes + Theme.approved_themes(profile) | ||
18 | - @current_theme = profile.theme | ||
19 | - | ||
20 | - @layout_templates = LayoutTemplate.all | ||
21 | - @current_template = profile.layout_template | ||
22 | - end | ||
23 | - | ||
24 | - def new | ||
25 | - if !request.xhr? | ||
26 | - id = params[:name] ? params[:name].to_slug : 'my-theme' | ||
27 | - t = Theme.new(id, :name => params[:name], :owner => profile, :public => false) | ||
28 | - t.save | ||
29 | - redirect_to :action => 'index' | ||
30 | - else | ||
31 | - render :action => 'new', :layout => false | ||
32 | - end | ||
33 | - end | ||
34 | - | ||
35 | - def edit | ||
36 | - @theme = profile.find_theme(params[:id]) | ||
37 | - @css_files = @theme.css_files | ||
38 | - @image_files = @theme.image_files | ||
39 | - end | ||
40 | - | ||
41 | - def add_css | ||
42 | - @theme = profile.find_theme(params[:id]) | ||
43 | - if request.xhr? | ||
44 | - render :action => 'add_css', :layout => false | ||
45 | - else | ||
46 | - @theme.add_css(params[:css]) | ||
47 | - redirect_to :action => 'edit', :id => @theme.id | ||
48 | - end | ||
49 | - end | ||
50 | - | ||
51 | - def css_editor | ||
52 | - @theme = profile.find_theme(params[:id]) | ||
53 | - @css = params[:css] | ||
54 | - | ||
55 | - @code = @theme.read_css(@css) | ||
56 | - render :action => 'css_editor', :layout => false | ||
57 | - end | ||
58 | - | ||
59 | - post_only :update_css | ||
60 | - def update_css | ||
61 | - @theme = profile.find_theme(params[:id]) | ||
62 | - @theme.update_css(params[:css], params[:csscode]) | ||
63 | - redirect_to :action => 'edit', :id => @theme.id | ||
64 | - end | ||
65 | - | ||
66 | - def add_image | ||
67 | - @theme = profile.find_theme(params[:id]) | ||
68 | - if request.xhr? | ||
69 | - render :action => 'add_image', :layout => false | ||
70 | - else | ||
71 | - @theme.add_image(params[:image].original_filename, params[:image].read) | ||
72 | - redirect_to :action => 'edit', :id => @theme.id | ||
73 | - end | ||
74 | - end | ||
75 | - | ||
76 | - def start_test | ||
77 | - session[:theme] = params[:id] | ||
78 | - redirect_to :controller => 'content_viewer', :profile => profile.identifier, :action => 'view_page' | ||
79 | - end | ||
80 | - | ||
81 | - def stop_test | ||
82 | - session[:theme] = nil | ||
83 | - redirect_to :action => 'index' | ||
84 | - end | ||
85 | - | ||
86 | - def set_layout_template | ||
87 | - profile.update_layout_template(params[:id]) | ||
88 | - redirect_to :action => 'index' | ||
89 | - end | ||
90 | - | ||
91 | -end |
app/controllers/public/comment_controller.rb
@@ -71,7 +71,9 @@ class CommentController < ApplicationController | @@ -71,7 +71,9 @@ class CommentController < ApplicationController | ||
71 | return | 71 | return |
72 | end | 72 | end |
73 | 73 | ||
74 | - @comment.save | 74 | + if @comment.save |
75 | + @plugins.dispatch(:process_extra_comment_params, [@comment,params]) | ||
76 | + end | ||
75 | 77 | ||
76 | respond_to do |format| | 78 | respond_to do |format| |
77 | format.js do | 79 | format.js do |
@@ -113,6 +115,8 @@ class CommentController < ApplicationController | @@ -113,6 +115,8 @@ class CommentController < ApplicationController | ||
113 | 115 | ||
114 | def update | 116 | def update |
115 | if @comment.update_attributes(params[:comment]) | 117 | if @comment.update_attributes(params[:comment]) |
118 | + @plugins.dispatch(:process_extra_comment_params, [@comment,params]) | ||
119 | + | ||
116 | respond_to do |format| | 120 | respond_to do |format| |
117 | format.js do | 121 | format.js do |
118 | comment_to_render = @comment.comment_root | 122 | comment_to_render = @comment.comment_root |
@@ -0,0 +1,42 @@ | @@ -0,0 +1,42 @@ | ||
1 | +class ThemesController < ApplicationController | ||
2 | + | ||
3 | + before_filter :login_required | ||
4 | + | ||
5 | + no_design_blocks | ||
6 | + | ||
7 | + # attr_reader :target | ||
8 | + | ||
9 | + def target | ||
10 | + @target | ||
11 | + end | ||
12 | + | ||
13 | + def index | ||
14 | + @environment = environment | ||
15 | + @themes = environment.themes + Theme.approved_themes(target) | ||
16 | + | ||
17 | + @current_theme = target.theme | ||
18 | + | ||
19 | + @layout_templates = LayoutTemplate.all | ||
20 | + @current_template = target.layout_template | ||
21 | + end | ||
22 | + | ||
23 | + def set | ||
24 | + target.update_theme(params[:id]) | ||
25 | + redirect_to :action => 'index' | ||
26 | + end | ||
27 | + | ||
28 | + def unset | ||
29 | + if target.kind_of?(Environment) | ||
30 | + target.update_theme('default') | ||
31 | + else | ||
32 | + target.update_theme(nil) | ||
33 | + end | ||
34 | + redirect_to :action => 'index' | ||
35 | + end | ||
36 | + | ||
37 | + def set_layout_template | ||
38 | + target.update_layout_template(params[:id]) | ||
39 | + redirect_to :action => 'index' | ||
40 | + end | ||
41 | + | ||
42 | +end |
app/models/box.rb
@@ -10,7 +10,7 @@ class Box < ActiveRecord::Base | @@ -10,7 +10,7 @@ class Box < ActiveRecord::Base | ||
10 | end | 10 | end |
11 | 11 | ||
12 | def acceptable_blocks | 12 | def acceptable_blocks |
13 | - blocks_classes = central? ? Box.acceptable_center_blocks + plugins.dispatch(:extra_blocks, :position => 1) : Box.acceptable_side_blocks + plugins.dispatch(:extra_blocks, :position => [2, 3]) | 13 | + blocks_classes = central? ? Box.acceptable_center_blocks + plugins.dispatch(:extra_blocks, :type => owner.class, :position => 1) : Box.acceptable_side_blocks + plugins.dispatch(:extra_blocks, :type => owner.class, :position => [2, 3]) |
14 | to_css_class_name(blocks_classes) | 14 | to_css_class_name(blocks_classes) |
15 | end | 15 | end |
16 | 16 |
app/models/environment.rb
@@ -28,7 +28,8 @@ class Environment < ActiveRecord::Base | @@ -28,7 +28,8 @@ class Environment < ActiveRecord::Base | ||
28 | 'manage_environment_users' => N_('Manage environment users'), | 28 | 'manage_environment_users' => N_('Manage environment users'), |
29 | 'manage_environment_templates' => N_('Manage environment templates'), | 29 | 'manage_environment_templates' => N_('Manage environment templates'), |
30 | 'manage_environment_licenses' => N_('Manage environment licenses'), | 30 | 'manage_environment_licenses' => N_('Manage environment licenses'), |
31 | - 'manage_environment_trusted_sites' => N_('Manage environment trusted sites') | 31 | + 'manage_environment_trusted_sites' => N_('Manage environment trusted sites'), |
32 | + 'edit_appearance' => N_('Edit appearance'), | ||
32 | } | 33 | } |
33 | 34 | ||
34 | module Roles | 35 | module Roles |
@@ -666,6 +667,16 @@ class Environment < ActiveRecord::Base | @@ -666,6 +667,16 @@ class Environment < ActiveRecord::Base | ||
666 | end | 667 | end |
667 | end | 668 | end |
668 | 669 | ||
670 | + def update_theme(theme) | ||
671 | + self.theme = theme | ||
672 | + self.save! | ||
673 | + end | ||
674 | + | ||
675 | + def update_layout_template(template) | ||
676 | + self.layout_template = template | ||
677 | + self.save! | ||
678 | + end | ||
679 | + | ||
669 | before_create do |env| | 680 | before_create do |env| |
670 | env.settings[:themes] ||= %w[ | 681 | env.settings[:themes] ||= %w[ |
671 | aluminium | 682 | aluminium |
app/views/admin_panel/index.html.erb
@@ -6,6 +6,7 @@ | @@ -6,6 +6,7 @@ | ||
6 | <tr><td><%= link_to _('Environment settings'), :action => 'site_info' %></td></tr> | 6 | <tr><td><%= link_to _('Environment settings'), :action => 'site_info' %></td></tr> |
7 | <tr><td><%= link_to _('Features'), :controller => 'features' %></td></tr> | 7 | <tr><td><%= link_to _('Features'), :controller => 'features' %></td></tr> |
8 | <tr><td><%= link_to _('Plugins'), :controller => 'plugins' %></td></tr> | 8 | <tr><td><%= link_to _('Plugins'), :controller => 'plugins' %></td></tr> |
9 | + <tr><td><%= link_to _('Appearance'), :controller =>'environment_themes' %></td></tr> | ||
9 | <tr><td><%= link_to _('Sideboxes'), :controller => 'environment_design'%></td></tr> | 10 | <tr><td><%= link_to _('Sideboxes'), :controller => 'environment_design'%></td></tr> |
10 | <tr><td><%= link_to _('Homepage'), :action => 'set_portal_community' %></td></tr> | 11 | <tr><td><%= link_to _('Homepage'), :action => 'set_portal_community' %></td></tr> |
11 | <tr><td><%= link_to _('Licenses'), :controller =>'licenses' %></td></tr> | 12 | <tr><td><%= link_to _('Licenses'), :controller =>'licenses' %></td></tr> |
app/views/cms/edit.html.erb
1 | <%= error_messages_for 'article' %> | 1 | <%= error_messages_for 'article' %> |
2 | -<%= javascript_include_tag "article.js" %> | ||
3 | 2 | ||
4 | <div class='<%= (environment.enabled?('media_panel') ? 'with_media_panel' : 'no_media_panel') %>'> | 3 | <div class='<%= (environment.enabled?('media_panel') ? 'with_media_panel' : 'no_media_panel') %>'> |
5 | <%= labelled_form_for 'article', @article, :html => { :multipart => true, :class => @type } do |f| %> | 4 | <%= labelled_form_for 'article', @article, :html => { :multipart => true, :class => @type } do |f| %> |
@@ -63,3 +62,5 @@ | @@ -63,3 +62,5 @@ | ||
63 | <% end %> | 62 | <% end %> |
64 | 63 | ||
65 | <br style='clear: both'/> | 64 | <br style='clear: both'/> |
65 | + | ||
66 | +<%= javascript_include_tag "article.js" %> |
app/views/comment/_comment.html.erb
@@ -43,6 +43,7 @@ | @@ -43,6 +43,7 @@ | ||
43 | <p/> | 43 | <p/> |
44 | <%= txt2html comment.body %> | 44 | <%= txt2html comment.body %> |
45 | </div> | 45 | </div> |
46 | + <%= @plugins.dispatch(:comment_extra_contents, local_assigns).collect { |content| instance_eval(&content) }.join("") %> | ||
46 | </div> | 47 | </div> |
47 | 48 | ||
48 | <div class="comment_reply post_comment_box closed" id="comment_reply_to_<%= comment.id %>"> | 49 | <div class="comment_reply post_comment_box closed" id="comment_reply_to_<%= comment.id %>"> |
app/views/profile_editor/index.html.erb
@@ -22,7 +22,7 @@ | @@ -22,7 +22,7 @@ | ||
22 | 22 | ||
23 | <%= control_panel_button(_('Edit sideboxes'), 'blocks', :controller => 'profile_design', :action => 'index') %> | 23 | <%= control_panel_button(_('Edit sideboxes'), 'blocks', :controller => 'profile_design', :action => 'index') %> |
24 | 24 | ||
25 | - <%= control_panel_button(_('Edit Appearance'), 'design-editor', :controller => 'themes', :action => 'index') %> | 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') unless profile.enterprise? && environment.enabled?('disable_header_and_footer') && !user.is_admin?(environment) %> |
28 | 28 |
@@ -0,0 +1,11 @@ | @@ -0,0 +1,11 @@ | ||
1 | +<h2><%= _('Add a CSS file') %></h2> | ||
2 | + | ||
3 | +<%= form_tag do %> | ||
4 | + <%= labelled_form_field(_('File name'), text_field_tag('css')) %> | ||
5 | + | ||
6 | + <% button_bar do %> | ||
7 | + <%= submit_button(:add, _('Add')) %> | ||
8 | + <%= lightbox_close_button(_('Cancel')) %> | ||
9 | + <% end %> | ||
10 | + | ||
11 | +<% end %> |
@@ -0,0 +1,13 @@ | @@ -0,0 +1,13 @@ | ||
1 | +<h2><%= _('CSS code: "%s"') % @css %></h2> | ||
2 | + | ||
3 | +<%= form_tag({:action => 'update_css', :id => @theme.id }, :name => 'csscode_form') do %> | ||
4 | + <%= hidden_field_tag('css', @css) %> | ||
5 | + <%= text_area_tag('csscode', @code, :id => "codepressWindow", :class => 'codepress css') %> | ||
6 | + <% button_bar do %> | ||
7 | + <%= submit_button(:save, _('Save')) %> | ||
8 | + <% end %> | ||
9 | +<% end %> | ||
10 | + | ||
11 | +<!--<script type='text/javascript'>--> | ||
12 | + <!--CodePress.run();--> | ||
13 | +<!--</script>--> |
@@ -0,0 +1,41 @@ | @@ -0,0 +1,41 @@ | ||
1 | +<form> | ||
2 | + <%# FIXME %> | ||
3 | + <h1 id='theme-name'> | ||
4 | + <%= _('Editing theme "%s"') % @theme.name %> | ||
5 | + <%= button(:eyes, _('Preview this theme'), :action => 'start_test', :id => @theme.id) %> | ||
6 | + <%= button(:back, _('Back'), :action => 'index') %> | ||
7 | + </h1> | ||
8 | +</form> | ||
9 | + | ||
10 | + | ||
11 | +<div id='css-files-list'> | ||
12 | + <h2><%= _('CSS files') %></h2> | ||
13 | + <ul> | ||
14 | + <% for css in @css_files %> | ||
15 | + <li><%= link_to_remote(css, :url => { :action => 'css_editor', :id => @theme.id, :css => css }, :update => { :success => 'css-code' }) %></li> | ||
16 | + <% end %> | ||
17 | + </ul> | ||
18 | + <% button_bar do %> | ||
19 | + <%= lightbox_button(:add, _('New CSS'), :action => 'add_css', :id => @theme.id) %> | ||
20 | + <% end %> | ||
21 | +</div> | ||
22 | + | ||
23 | +<div id='image-files-list'> | ||
24 | + <h2><%= _('Images') %></h2> | ||
25 | + <ul> | ||
26 | + <% for image in @image_files %> | ||
27 | + <li><%= image_tag("/user_themes/#{@theme.id}/images/#{image}") %></li> | ||
28 | + <% end %> | ||
29 | + </ul> | ||
30 | + <% button_bar do %> | ||
31 | + <%= lightbox_button(:add, _('Add image'), :action => 'add_image', :id => @theme.id) %> | ||
32 | + <% end %> | ||
33 | +</div> | ||
34 | + | ||
35 | +<div id='css-code'> | ||
36 | + <center style='padding-top: 5em;'> | ||
37 | + <em><%= _('Select a CSS file to edit') %></em> | ||
38 | + </center> | ||
39 | +</div> | ||
40 | + | ||
41 | +<%# javascript_include_tag 'codepress/codepress' %> |
@@ -0,0 +1,48 @@ | @@ -0,0 +1,48 @@ | ||
1 | +<%= render :partial => 'themes/select_template' %> | ||
2 | +<%= render :partial => 'themes/select_theme' %> | ||
3 | + | ||
4 | +<% if environment.enabled?('user_themes') %> | ||
5 | + <div id="user-themes" class="list-options"> | ||
6 | + | ||
7 | + <h2><%= _('My themes') %></h2> | ||
8 | + | ||
9 | + <% for themes in profile.themes.in_groups_of(3) %> | ||
10 | + <div class="list-group"> | ||
11 | + <% for theme in themes %><%= | ||
12 | + if theme | ||
13 | + | ||
14 | + selected = theme.id == @current_theme | ||
15 | + sel_html = selected ? | ||
16 | + content_tag('big', _('(current)') ) : | ||
17 | + link_to(_('Use this theme'), :action => 'set', :id => theme.id) | ||
18 | + | ||
19 | + content_tag( 'div', | ||
20 | + image_tag( | ||
21 | + '/images/icons-app/design-editor.png', | ||
22 | + :alt => (_('The "%s" theme.') % theme.name)) + | ||
23 | + '<div class="opt-info">' + | ||
24 | + content_tag('strong', theme.name, :class => 'name') + | ||
25 | + ' <br/> '+ sel_html +' <br/> ' + | ||
26 | + link_to(_('Edit this theme'), :action => 'edit', :id => theme.id) + | ||
27 | + ' <br/> ' + | ||
28 | + link_to(_('Test this theme'), :action => 'start_test', :id => theme.id) + | ||
29 | + '</div>', | ||
30 | + :class => 'theme-opt list-opt' + (selected ? ' selected' : '') | ||
31 | + ) | ||
32 | + | ||
33 | + end | ||
34 | + %><% end %> | ||
35 | + </div> | ||
36 | + <% end %> | ||
37 | + | ||
38 | + </div><!-- end id="user-themes" --> | ||
39 | +<% end %> | ||
40 | + | ||
41 | +<br style="clear:both" /> | ||
42 | + | ||
43 | +<% button_bar do %> | ||
44 | + <% if environment.enabled?('user_themes') %> | ||
45 | + <%= lightbox_button(:add, _('New theme ...'), :action => 'new') %> | ||
46 | + <% end %> | ||
47 | + <%= button(:back, _('Back'), :controller => 'profile_editor', :action => 'index') %> | ||
48 | +<% end %> |
@@ -0,0 +1,10 @@ | @@ -0,0 +1,10 @@ | ||
1 | +<h2><%= _('Create new theme') %></h2> | ||
2 | + | ||
3 | +<%= form_tag(:action => 'new') do %> | ||
4 | + | ||
5 | + <%= labelled_form_field(_('Name of the new theme:'), text_field_tag(:name)) %> | ||
6 | + | ||
7 | + <% button_bar do %> | ||
8 | + <%= submit_button(:save, _('Create')) %> | ||
9 | + <% end %> | ||
10 | +<% end %> |
app/views/shared/_lead_and_body.html.erb
app/views/shared/theme_test_panel.html.erb
@@ -6,8 +6,8 @@ | @@ -6,8 +6,8 @@ | ||
6 | <p><small><em><%= _('You can move this window away to have a better visualization of specific parts of screen.') %></em></small></p> | 6 | <p><small><em><%= _('You can move this window away to have a better visualization of specific parts of screen.') %></em></small></p> |
7 | 7 | ||
8 | <% button_bar do %> | 8 | <% button_bar do %> |
9 | - <%= button(:ok, _('Finished testing'), :controller => 'themes', :profile => theme_owner, :action => 'stop_test', :id => current_theme) %> | ||
10 | - <%= button(:edit, _('Edit theme'), :controller => 'themes', :profile => theme_owner, :action => 'edit', :id => current_theme) %> | 9 | + <%= button(:ok, _('Finished testing'), :controller => 'profile_themes', :profile => theme_owner, :action => 'stop_test', :id => current_theme) %> |
10 | + <%= button(:edit, _('Edit theme'), :controller => 'profile_themes', :profile => theme_owner, :action => 'edit', :id => current_theme) %> | ||
11 | <% end %> | 11 | <% end %> |
12 | </div> | 12 | </div> |
13 | <%= draggable_element('theme-test-panel') %> | 13 | <%= draggable_element('theme-test-panel') %> |
@@ -0,0 +1,35 @@ | @@ -0,0 +1,35 @@ | ||
1 | +<h1><%= _('Editing Appearance') %></h1> | ||
2 | + | ||
3 | +<div id="template-options" class="list-options"> | ||
4 | + | ||
5 | +<h2><%= _('Select template') %></h2> | ||
6 | + | ||
7 | +<% for templates in @layout_templates.in_groups_of(3) %> | ||
8 | + <div class="list-group"> | ||
9 | + <% for template in templates %><%= | ||
10 | + if template | ||
11 | + base_content = image_tag( | ||
12 | + "/designs/templates/#{template.id}/thumbnail.png", | ||
13 | + :alt => _('The "%s" template')) + | ||
14 | + '<div class="opt-info">'.html_safe + | ||
15 | + content_tag('strong', template.name, :class => 'name') + | ||
16 | + ' <br/> '.html_safe | ||
17 | + | ||
18 | + if @current_template == template.id # selected | ||
19 | + content_tag( 'div', | ||
20 | + base_content + content_tag('big', _('(current)') ) +'</div>'.html_safe, | ||
21 | + :class => 'template-opt list-opt selected') | ||
22 | + else # Not selected | ||
23 | + link_to( | ||
24 | + base_content +'</div>'.html_safe, | ||
25 | + { :action => 'set_layout_template', :id => template.id }, | ||
26 | + :class => 'template-opt list-opt') | ||
27 | + end | ||
28 | + | ||
29 | + end | ||
30 | + %><% end %> | ||
31 | + </div> | ||
32 | +<% end %> | ||
33 | + | ||
34 | +</div><!-- end id="template-options" --> | ||
35 | + |
@@ -0,0 +1,37 @@ | @@ -0,0 +1,37 @@ | ||
1 | +<% if !@themes.empty? %> | ||
2 | +<div id="theme-options" class="list-options"> | ||
3 | + | ||
4 | +<h2><%= _('Select theme') %></h2> | ||
5 | +<%= button :home, _('Use the default theme'), { :action => 'unset'}, :method => 'post', :confirm => _('Are you sure you want to use the environment default theme?') %> | ||
6 | + | ||
7 | +<% for themes in @themes.in_groups_of(3) %> | ||
8 | + <div class="list-group"> | ||
9 | + <% for theme in themes %><%= | ||
10 | + if theme | ||
11 | + | ||
12 | + base_content = image_tag( | ||
13 | + "/designs/themes/#{theme.id}/preview.png", | ||
14 | + :alt => (_('The "%s" theme.') % theme.name)) + | ||
15 | + '<div class="opt-info">'.html_safe + | ||
16 | + content_tag('strong', theme.name, :class => 'name') + | ||
17 | + ' <br/> '.html_safe | ||
18 | + | ||
19 | + if theme.id == @current_theme # selected | ||
20 | + content_tag( 'div', | ||
21 | + base_content + content_tag('big', _('(current)') ) +'</div>'.html_safe, | ||
22 | + :class => 'theme-opt list-opt selected') | ||
23 | + else # Not selected | ||
24 | + link_to( | ||
25 | + base_content + '</div>'.html_safe, | ||
26 | + { :action => 'set', :id => theme.id }, | ||
27 | + :class => 'theme-opt list-opt') | ||
28 | + end | ||
29 | + | ||
30 | + end | ||
31 | + %><% end %> | ||
32 | + </div> | ||
33 | +<% end %> | ||
34 | + | ||
35 | +</div><!-- end id="theme-options" --> | ||
36 | +<% end %> | ||
37 | + |
app/views/themes/add_css.html.erb
@@ -1,11 +0,0 @@ | @@ -1,11 +0,0 @@ | ||
1 | -<h2><%= _('Add a CSS file') %></h2> | ||
2 | - | ||
3 | -<%= form_tag do %> | ||
4 | - <%= labelled_form_field(_('File name'), text_field_tag('css')) %> | ||
5 | - | ||
6 | - <% button_bar do %> | ||
7 | - <%= submit_button(:add, _('Add')) %> | ||
8 | - <%= lightbox_close_button(_('Cancel')) %> | ||
9 | - <% end %> | ||
10 | - | ||
11 | -<% end %> |
app/views/themes/add_image.html.erb
app/views/themes/css_editor.html.erb
@@ -1,13 +0,0 @@ | @@ -1,13 +0,0 @@ | ||
1 | -<h2><%= _('CSS code: "%s"') % @css %></h2> | ||
2 | - | ||
3 | -<%= form_tag({:action => 'update_css', :id => @theme.id }, :name => 'csscode_form') do %> | ||
4 | - <%= hidden_field_tag('css', @css) %> | ||
5 | - <%= text_area_tag('csscode', @code, :id => "codepressWindow", :class => 'codepress css') %> | ||
6 | - <% button_bar do %> | ||
7 | - <%= submit_button(:save, _('Save')) %> | ||
8 | - <% end %> | ||
9 | -<% end %> | ||
10 | - | ||
11 | -<!--<script type='text/javascript'>--> | ||
12 | - <!--CodePress.run();--> | ||
13 | -<!--</script>--> |
app/views/themes/edit.html.erb
@@ -1,41 +0,0 @@ | @@ -1,41 +0,0 @@ | ||
1 | -<form> | ||
2 | - <%# FIXME %> | ||
3 | - <h1 id='theme-name'> | ||
4 | - <%= _('Editing theme "%s"') % @theme.name %> | ||
5 | - <%= button(:eyes, _('Preview this theme'), :action => 'start_test', :id => @theme.id) %> | ||
6 | - <%= button(:back, _('Back'), :action => 'index') %> | ||
7 | - </h1> | ||
8 | -</form> | ||
9 | - | ||
10 | - | ||
11 | -<div id='css-files-list'> | ||
12 | - <h2><%= _('CSS files') %></h2> | ||
13 | - <ul> | ||
14 | - <% for css in @css_files %> | ||
15 | - <li><%= link_to_remote(css, :url => { :action => 'css_editor', :id => @theme.id, :css => css }, :update => { :success => 'css-code' }) %></li> | ||
16 | - <% end %> | ||
17 | - </ul> | ||
18 | - <% button_bar do %> | ||
19 | - <%= lightbox_button(:add, _('New CSS'), :action => 'add_css', :id => @theme.id) %> | ||
20 | - <% end %> | ||
21 | -</div> | ||
22 | - | ||
23 | -<div id='image-files-list'> | ||
24 | - <h2><%= _('Images') %></h2> | ||
25 | - <ul> | ||
26 | - <% for image in @image_files %> | ||
27 | - <li><%= image_tag("/user_themes/#{@theme.id}/images/#{image}") %></li> | ||
28 | - <% end %> | ||
29 | - </ul> | ||
30 | - <% button_bar do %> | ||
31 | - <%= lightbox_button(:add, _('Add image'), :action => 'add_image', :id => @theme.id) %> | ||
32 | - <% end %> | ||
33 | -</div> | ||
34 | - | ||
35 | -<div id='css-code'> | ||
36 | - <center style='padding-top: 5em;'> | ||
37 | - <em><%= _('Select a CSS file to edit') %></em> | ||
38 | - </center> | ||
39 | -</div> | ||
40 | - | ||
41 | -<%# javascript_include_tag 'codepress/codepress' %> |
app/views/themes/index.html.erb
@@ -1,120 +0,0 @@ | @@ -1,120 +0,0 @@ | ||
1 | -<h1><%= _('Editing Appearance') %></h1> | ||
2 | - | ||
3 | -<div id="template-options" class="list-options"> | ||
4 | - | ||
5 | -<h2><%= _('Select template') %></h2> | ||
6 | - | ||
7 | -<% for templates in @layout_templates.in_groups_of(3) %> | ||
8 | - <div class="list-group"> | ||
9 | - <% for template in templates %><%= | ||
10 | - if template | ||
11 | - base_content = image_tag( | ||
12 | - "/designs/templates/#{template.id}/thumbnail.png", | ||
13 | - :alt => _('The "%s" template')) + | ||
14 | - '<div class="opt-info">'.html_safe + | ||
15 | - content_tag('strong', template.name, :class => 'name') + | ||
16 | - ' <br/> '.html_safe | ||
17 | - | ||
18 | - if @current_template == template.id # selected | ||
19 | - content_tag( 'div', | ||
20 | - base_content + content_tag('big', _('(current)') ) +'</div>'.html_safe, | ||
21 | - :class => 'template-opt list-opt selected') | ||
22 | - else # Not selected | ||
23 | - link_to( | ||
24 | - base_content +'</div>'.html_safe, | ||
25 | - { :action => 'set_layout_template', :id => template.id }, | ||
26 | - :class => 'template-opt list-opt') | ||
27 | - end | ||
28 | - | ||
29 | - end | ||
30 | - %><% end %> | ||
31 | - </div> | ||
32 | -<% end %> | ||
33 | - | ||
34 | -</div><!-- end id="template-options" --> | ||
35 | - | ||
36 | - | ||
37 | -<% if !@themes.empty? %> | ||
38 | -<div id="theme-options" class="list-options"> | ||
39 | - | ||
40 | -<h2><%= _('Select theme') %></h2> | ||
41 | -<%= button :home, _('Use the default theme'), { :action => 'unset'}, :method => 'post', :confirm => _('Are you sure you want to use the environment default theme?') %> | ||
42 | - | ||
43 | -<% for themes in @themes.in_groups_of(3) %> | ||
44 | - <div class="list-group"> | ||
45 | - <% for theme in themes %><%= | ||
46 | - if theme | ||
47 | - | ||
48 | - base_content = image_tag( | ||
49 | - "/designs/themes/#{theme.id}/preview.png", | ||
50 | - :alt => (_('The "%s" theme.') % theme.name)) + | ||
51 | - '<div class="opt-info">'.html_safe + | ||
52 | - content_tag('strong', theme.name, :class => 'name') + | ||
53 | - ' <br/> '.html_safe | ||
54 | - | ||
55 | - if theme.id == @current_theme # selected | ||
56 | - content_tag( 'div', | ||
57 | - base_content + content_tag('big', _('(current)') ) +'</div>'.html_safe, | ||
58 | - :class => 'theme-opt list-opt selected') | ||
59 | - else # Not selected | ||
60 | - link_to( | ||
61 | - base_content + '</div>'.html_safe, | ||
62 | - { :action => 'set', :id => theme.id }, | ||
63 | - :class => 'theme-opt list-opt') | ||
64 | - end | ||
65 | - | ||
66 | - end | ||
67 | - %><% end %> | ||
68 | - </div> | ||
69 | -<% end %> | ||
70 | - | ||
71 | -</div><!-- end id="theme-options" --> | ||
72 | -<% end %> | ||
73 | - | ||
74 | - | ||
75 | - | ||
76 | -<% if environment.enabled?('user_themes') %> | ||
77 | - <div id="user-themes" class="list-options"> | ||
78 | - | ||
79 | - <h2><%= _('My themes') %></h2> | ||
80 | - | ||
81 | - <% for themes in profile.themes.in_groups_of(3) %> | ||
82 | - <div class="list-group"> | ||
83 | - <% for theme in themes %><%= | ||
84 | - if theme | ||
85 | - | ||
86 | - selected = theme.id == @current_theme | ||
87 | - sel_html = selected ? | ||
88 | - content_tag('big', _('(current)') ) : | ||
89 | - link_to(_('Use this theme'), :action => 'set', :id => theme.id) | ||
90 | - | ||
91 | - content_tag( 'div', | ||
92 | - image_tag( | ||
93 | - '/images/icons-app/design-editor.png', | ||
94 | - :alt => (_('The "%s" theme.') % theme.name)) + | ||
95 | - '<div class="opt-info">' + | ||
96 | - content_tag('strong', theme.name, :class => 'name') + | ||
97 | - ' <br/> '+ sel_html +' <br/> ' + | ||
98 | - link_to(_('Edit this theme'), :action => 'edit', :id => theme.id) + | ||
99 | - ' <br/> ' + | ||
100 | - link_to(_('Test this theme'), :action => 'start_test', :id => theme.id) + | ||
101 | - '</div>', | ||
102 | - :class => 'theme-opt list-opt' + (selected ? ' selected' : '') | ||
103 | - ) | ||
104 | - | ||
105 | - end | ||
106 | - %><% end %> | ||
107 | - </div> | ||
108 | - <% end %> | ||
109 | - | ||
110 | - </div><!-- end id="user-themes" --> | ||
111 | -<% end %> | ||
112 | - | ||
113 | -<br style="clear:both" /> | ||
114 | - | ||
115 | -<% button_bar do %> | ||
116 | - <% if environment.enabled?('user_themes') %> | ||
117 | - <%= lightbox_button(:add, _('New theme ...'), :action => 'new') %> | ||
118 | - <% end %> | ||
119 | - <%= button(:back, _('Back'), :controller => 'profile_editor', :action => 'index') %> | ||
120 | -<% end %> |
app/views/themes/new.html.erb
@@ -1,10 +0,0 @@ | @@ -1,10 +0,0 @@ | ||
1 | -<h2><%= _('Create new theme') %></h2> | ||
2 | - | ||
3 | -<%= form_tag(:action => 'new') do %> | ||
4 | - | ||
5 | - <%= labelled_form_field(_('Name of the new theme:'), text_field_tag(:name)) %> | ||
6 | - | ||
7 | - <% button_bar do %> | ||
8 | - <%= submit_button(:save, _('Create')) %> | ||
9 | - <% end %> | ||
10 | -<% end %> |
debian/changelog
1 | +noosfero (0.46.0) unstable; urgency=low | ||
2 | + | ||
3 | + * New features release | ||
4 | + | ||
5 | + -- Rodrigo Souto <rodrigo@colivre.coop.br> Thu, 20 Feb 2014 17:56:14 -0300 | ||
6 | + | ||
7 | +noosfero (0.46.0~rc20140120171635) squeeze-test; urgency=low | ||
8 | + | ||
9 | + * 0.46.0 RC1 | ||
10 | + | ||
11 | + -- Rodrigo Souto <rodrigo@colivre.coop.br> Mon, 20 Jan 2014 17:16:45 +0000 | ||
12 | + | ||
1 | noosfero (0.45.2) unstable; urgency=low | 13 | noosfero (0.45.2) unstable; urgency=low |
2 | 14 | ||
3 | * Small release with a critical bugfix | 15 | * Small release with a critical bugfix |
lib/noosfero.rb
@@ -4,7 +4,7 @@ require 'fast_gettext' | @@ -4,7 +4,7 @@ require 'fast_gettext' | ||
4 | 4 | ||
5 | module Noosfero | 5 | module Noosfero |
6 | PROJECT = 'noosfero' | 6 | PROJECT = 'noosfero' |
7 | - VERSION = '0.45.2' | 7 | + VERSION = '0.46.0' |
8 | 8 | ||
9 | def self.pattern_for_controllers_in_directory(dir) | 9 | def self.pattern_for_controllers_in_directory(dir) |
10 | disjunction = controllers_in_directory(dir).join('|') | 10 | disjunction = controllers_in_directory(dir).join('|') |
lib/noosfero/plugin.rb
@@ -462,6 +462,25 @@ class Noosfero::Plugin | @@ -462,6 +462,25 @@ class Noosfero::Plugin | ||
462 | nil | 462 | nil |
463 | end | 463 | end |
464 | 464 | ||
465 | + # -> Adds adittional content to comment visualization | ||
466 | + # returns = lambda block that creates html code | ||
467 | + def comment_extra_contents(args) | ||
468 | + nil | ||
469 | + end | ||
470 | + | ||
471 | + # This method is called when the user clicks to send a comment. | ||
472 | + # A plugin can add new content to comment form and this method can process the params sent to avoid creating field on core tables. | ||
473 | + # returns = params after processed by plugins | ||
474 | + # example: | ||
475 | + # | ||
476 | + # def process_extra_comment_params(params) | ||
477 | + # params.delete(:extra_field) | ||
478 | + # end | ||
479 | + # | ||
480 | + def process_extra_comment_params(params) | ||
481 | + params | ||
482 | + end | ||
483 | + | ||
465 | # -> Finds objects by their contents | 484 | # -> Finds objects by their contents |
466 | # returns = {:results => [a, b, c, ...], ...} | 485 | # returns = {:results => [a, b, c, ...], ...} |
467 | # P.S.: The plugin might add other informations on the return hash for its | 486 | # P.S.: The plugin might add other informations on the return hash for its |
public/javascripts/article.js
1 | jQuery(function($) { | 1 | jQuery(function($) { |
2 | - $(".lead-button").live('click', function(){ | ||
3 | - article_id = this.getAttribute("article_id"); | ||
4 | - $(this).toggleClass('icon-add').toggleClass('icon-remove'); | ||
5 | - $(article_id).slideToggle(); | ||
6 | - return false; | ||
7 | - }) | ||
8 | $("#body-button").click(function(){ | 2 | $("#body-button").click(function(){ |
9 | $(this).toggleClass('icon-add').toggleClass('icon-remove'); | 3 | $(this).toggleClass('icon-add').toggleClass('icon-remove'); |
10 | $('#article-body-field').slideToggle(); | 4 | $('#article-body-field').slideToggle(); |
public/stylesheets/application.css
@@ -4323,7 +4323,7 @@ h1#agenda-title { | @@ -4323,7 +4323,7 @@ h1#agenda-title { | ||
4323 | padding-left: 0px; | 4323 | padding-left: 0px; |
4324 | list-style-type: none; | 4324 | list-style-type: none; |
4325 | } | 4325 | } |
4326 | -/* ==> public/stylesheets/controller_themes.css <== */ | 4326 | +/* ==> public/stylesheets/profile_controller_themes.css <== */ |
4327 | 4327 | ||
4328 | .action-themes-index .button-bar { | 4328 | .action-themes-index .button-bar { |
4329 | padding-top: 20px; | 4329 | padding-top: 20px; |
@@ -4397,23 +4397,23 @@ h1#agenda-title { | @@ -4397,23 +4397,23 @@ h1#agenda-title { | ||
4397 | #user-themes a:hover { | 4397 | #user-themes a:hover { |
4398 | text-decoration: underline; | 4398 | text-decoration: underline; |
4399 | } | 4399 | } |
4400 | -.controller-themes .template-preview-cell { | 4400 | +.controller-profile_themes .template-preview-cell { |
4401 | text-align: center; | 4401 | text-align: center; |
4402 | } | 4402 | } |
4403 | -.controller-themes .theme-preview { | 4403 | +.controller-profile_themes .theme-preview { |
4404 | border: 1px solid #BBB; | 4404 | border: 1px solid #BBB; |
4405 | } | 4405 | } |
4406 | -.controller-themes #css-files-list h2, .controller-themes #image-files-list h2 { | 4406 | +.controller-profile_themes #css-files-list h2, .controller-profile_themes #image-files-list h2 { |
4407 | margin-top: 0px; | 4407 | margin-top: 0px; |
4408 | } | 4408 | } |
4409 | -.controller-themes #css-files-list ul, .controller-themes #image-files-list ul, .controller-themes #css-code textarea { | 4409 | +.controller-profile_themes #css-files-list ul, .controller-profile_themes #image-files-list ul, .controller-profile_themes #css-code textarea { |
4410 | height: 280px; | 4410 | height: 280px; |
4411 | } | 4411 | } |
4412 | -.controller-themes #css-files-list ul, .controller-themes #image-files-list ul { | 4412 | +.controller-profile_themes #css-files-list ul, .controller-profile_themes #image-files-list ul { |
4413 | overflow: auto; | 4413 | overflow: auto; |
4414 | } | 4414 | } |
4415 | /* header stuff */ | 4415 | /* header stuff */ |
4416 | -.controller-themes #theme-name input { | 4416 | +.controller-profile_themes #theme-name input { |
4417 | font-size: 18px; | 4417 | font-size: 18px; |
4418 | border: 1px solid black; | 4418 | border: 1px solid black; |
4419 | background: white; | 4419 | background: white; |
@@ -4422,78 +4422,78 @@ h1#agenda-title { | @@ -4422,78 +4422,78 @@ h1#agenda-title { | ||
4422 | } | 4422 | } |
4423 | /* files list */ | 4423 | /* files list */ |
4424 | 4424 | ||
4425 | -.controller-themes #css-files-list { | 4425 | +.controller-profile_themes #css-files-list { |
4426 | width: 200px; | 4426 | width: 200px; |
4427 | float: left; | 4427 | float: left; |
4428 | margin-left: 10px; | 4428 | margin-left: 10px; |
4429 | } | 4429 | } |
4430 | -.controller-themes #css-files-list ul { | 4430 | +.controller-profile_themes #css-files-list ul { |
4431 | margin: 0px; | 4431 | margin: 0px; |
4432 | padding-left: 0px; | 4432 | padding-left: 0px; |
4433 | background: white; | 4433 | background: white; |
4434 | border: 1px solid #bbb; | 4434 | border: 1px solid #bbb; |
4435 | } | 4435 | } |
4436 | -.controller-themes #css-files-list li { | 4436 | +.controller-profile_themes #css-files-list li { |
4437 | list-style: none; | 4437 | list-style: none; |
4438 | margin-bottom: 5px; | 4438 | margin-bottom: 5px; |
4439 | border-bottom: 1px solid #bbb; | 4439 | border-bottom: 1px solid #bbb; |
4440 | } | 4440 | } |
4441 | -.controller-themes #css-files-list li a { | 4441 | +.controller-profile_themes #css-files-list li a { |
4442 | display: block; | 4442 | display: block; |
4443 | padding: 1px 5px; | 4443 | padding: 1px 5px; |
4444 | } | 4444 | } |
4445 | -.controller-themes #css-files-list a:hover { | 4445 | +.controller-profile_themes #css-files-list a:hover { |
4446 | color: red; | 4446 | color: red; |
4447 | } | 4447 | } |
4448 | /* images list */ | 4448 | /* images list */ |
4449 | 4449 | ||
4450 | -.controller-themes #image-files-list { | 4450 | +.controller-profile_themes #image-files-list { |
4451 | width: 200px; | 4451 | width: 200px; |
4452 | float: right; | 4452 | float: right; |
4453 | margin-right: 10px; | 4453 | margin-right: 10px; |
4454 | } | 4454 | } |
4455 | -.controller-themes #image-files-list ul { | 4455 | +.controller-profile_themes #image-files-list ul { |
4456 | background: white; | 4456 | background: white; |
4457 | border: 1px solid #bbb; | 4457 | border: 1px solid #bbb; |
4458 | } | 4458 | } |
4459 | -.controller-themes #image-files-list ul, .controller-themes #image-files-list li { | 4459 | +.controller-profile_themes #image-files-list ul, .controller-profile_themes #image-files-list li { |
4460 | padding: 0px; | 4460 | padding: 0px; |
4461 | margin: 0px; | 4461 | margin: 0px; |
4462 | list-style: none; | 4462 | list-style: none; |
4463 | } | 4463 | } |
4464 | -.controller-themes #image-files-list li { | 4464 | +.controller-profile_themes #image-files-list li { |
4465 | border-bottom: 1px solid #bbb; | 4465 | border-bottom: 1px solid #bbb; |
4466 | padding: 5px 0px; | 4466 | padding: 5px 0px; |
4467 | text-align: center; | 4467 | text-align: center; |
4468 | } | 4468 | } |
4469 | -.controller-themes #image-files-list img { | 4469 | +.controller-profile_themes #image-files-list img { |
4470 | max-width: 98%; | 4470 | max-width: 98%; |
4471 | max-height: 40px; | 4471 | max-height: 40px; |
4472 | } | 4472 | } |
4473 | -.controller-themes .msie6 #image-files-list img { | 4473 | +.controller-profile_themes .msie6 #image-files-list img { |
4474 | width: 50%; | 4474 | width: 50%; |
4475 | height: 40px; | 4475 | height: 40px; |
4476 | } | 4476 | } |
4477 | -.controller-themes #image-files-list li span { | 4477 | +.controller-profile_themes #image-files-list li span { |
4478 | display: block; | 4478 | display: block; |
4479 | width: 100%; | 4479 | width: 100%; |
4480 | overflow: hidden; | 4480 | overflow: hidden; |
4481 | } | 4481 | } |
4482 | /* textbox */ | 4482 | /* textbox */ |
4483 | 4483 | ||
4484 | -.controller-themes #css-code { | 4484 | +.controller-profile_themes #css-code { |
4485 | margin-left: 220px; | 4485 | margin-left: 220px; |
4486 | margin-right: 220px; | 4486 | margin-right: 220px; |
4487 | } | 4487 | } |
4488 | -.controller-themes .msie6 #css-code { | 4488 | +.controller-profile_themes .msie6 #css-code { |
4489 | float: left; | 4489 | float: left; |
4490 | margin-left: 20px; | 4490 | margin-left: 20px; |
4491 | margin-right: 240px; | 4491 | margin-right: 240px; |
4492 | } | 4492 | } |
4493 | -.controller-themes #css-code textarea { | 4493 | +.controller-profile_themes #css-code textarea { |
4494 | width: 100%; | 4494 | width: 100%; |
4495 | } | 4495 | } |
4496 | -.controller-themes .msie6 #css-code textarea { | 4496 | +.controller-profile_themes .msie6 #css-code textarea { |
4497 | width: 500px; | 4497 | width: 500px; |
4498 | } | 4498 | } |
4499 | /* highlights block stuff */ | 4499 | /* highlights block stuff */ |
test/factories.rb
@@ -61,7 +61,7 @@ module Noosfero::Factory | @@ -61,7 +61,7 @@ module Noosfero::Factory | ||
61 | ###### old stuff to be rearranged | 61 | ###### old stuff to be rearranged |
62 | def create_admin_user(env) | 62 | def create_admin_user(env) |
63 | admin_user = User.find_by_login('adminuser') || create_user('adminuser', :email => 'adminuser@noosfero.org', :password => 'adminuser', :password_confirmation => 'adminuser', :environment => env) | 63 | admin_user = User.find_by_login('adminuser') || create_user('adminuser', :email => 'adminuser@noosfero.org', :password => 'adminuser', :password_confirmation => 'adminuser', :environment => env) |
64 | - admin_role = Role.find_by_name('admin_role') || create(Role, :name => 'admin_role', :permissions => ['view_environment_admin_panel','edit_environment_features', 'edit_environment_design', 'manage_environment_categories', 'manage_environment_roles', 'manage_environment_trusted_sites', 'manage_environment_validators', 'manage_environment_users', 'manage_environment_templates', 'manage_environment_licenses']) | 64 | + admin_role = Role.find_by_name('admin_role') || Role.create!(:name => 'admin_role', :permissions => ['view_environment_admin_panel','edit_environment_features', 'edit_environment_design', 'manage_environment_categories', 'manage_environment_roles', 'manage_environment_trusted_sites', 'manage_environment_validators', 'manage_environment_users', 'manage_environment_templates', 'manage_environment_licenses', 'edit_appearance']) |
65 | create(RoleAssignment, :accessor => admin_user.person, :role => admin_role, :resource => env) unless admin_user.person.role_assignments.map{|ra|[ra.role, ra.accessor, ra.resource]}.include?([admin_role, admin_user, env]) | 65 | create(RoleAssignment, :accessor => admin_user.person, :role => admin_role, :resource => env) unless admin_user.person.role_assignments.map{|ra|[ra.role, ra.accessor, ra.resource]}.include?([admin_role, admin_user, env]) |
66 | admin_user.login | 66 | admin_user.login |
67 | end | 67 | end |
@@ -0,0 +1,140 @@ | @@ -0,0 +1,140 @@ | ||
1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
2 | + | ||
3 | +class EnvironmentThemesController; def rescue_action(e) raise e end; end | ||
4 | + | ||
5 | +class EnvironmentThemesControllerTest < ActionController::TestCase | ||
6 | + | ||
7 | + def setup | ||
8 | + @controller = EnvironmentThemesController.new | ||
9 | + @request = ActionController::TestRequest.new | ||
10 | + @response = ActionController::TestResponse.new | ||
11 | + | ||
12 | + Theme.stubs(:user_themes_dir).returns(TMP_THEMES_DIR) | ||
13 | + | ||
14 | + @env = Environment.default | ||
15 | + login = create_admin_user(@env) | ||
16 | + login_as(login) | ||
17 | + @profile = User.find_by_login(login).person | ||
18 | + end | ||
19 | + | ||
20 | + def teardown | ||
21 | + FileUtils.rm_rf(TMP_THEMES_DIR) | ||
22 | + end | ||
23 | + | ||
24 | + TMP_THEMES_DIR = Rails.root.join("test", "tmp", "environment_themes_controller") | ||
25 | + | ||
26 | + should 'display themes that can be applied' do | ||
27 | + env = Environment.default | ||
28 | + Theme.stubs(:approved_themes).with(@env).returns([]) | ||
29 | + t1 = 't1' | ||
30 | + t2 = 't2' | ||
31 | + t3 = 't3' | ||
32 | + env.themes = [t1, t2] | ||
33 | + env.save | ||
34 | + | ||
35 | + Theme.stubs(:system_themes).returns([Theme.new(t1), Theme.new(t2), Theme.new(t3)]) | ||
36 | + get :index | ||
37 | + | ||
38 | + %w[ t1 t2 ].each do |item| | ||
39 | + assert_tag :tag => 'a', :attributes => { :href => "/admin/environment_themes/set/#{item}" } | ||
40 | + end | ||
41 | + | ||
42 | + assert_no_tag :tag => 'a', :attributes => { :href => "/admin/environment_themes/set/t3" } | ||
43 | + end | ||
44 | + | ||
45 | + should 'highlight current theme' do | ||
46 | + env = Environment.default | ||
47 | + t1 = 'one' | ||
48 | + t2 = 'two' | ||
49 | + env.themes = [t1, t2] | ||
50 | + env.save | ||
51 | + | ||
52 | + Theme.stubs(:system_themes).returns([Theme.new(t1), Theme.new(t2)]) | ||
53 | + env.update_theme(t1) | ||
54 | + get :index | ||
55 | + | ||
56 | + assert_tag :attributes => { :class => 'theme-opt list-opt selected' } | ||
57 | + assert_no_tag :tag => 'a', :attributes => { :href => "/admin/environment_themes/set/one" } | ||
58 | + end | ||
59 | + | ||
60 | + should 'save selection of theme' do | ||
61 | + get :set, :id => 'onetheme' | ||
62 | + env = Environment.default | ||
63 | + assert_equal 'onetheme', env.theme | ||
64 | + end | ||
65 | + | ||
66 | + | ||
67 | + should 'unset selection of theme' do | ||
68 | + get :unset | ||
69 | + env = Environment.default | ||
70 | + assert_equal 'default', env.theme | ||
71 | + end | ||
72 | + | ||
73 | + should 'display link to use the default theme' do | ||
74 | + env = Environment.default | ||
75 | + env.themes = ['new-theme'] | ||
76 | + env.save | ||
77 | + | ||
78 | + Theme.stubs(:system_themes).returns([Theme.new('new-theme')]) | ||
79 | + | ||
80 | + get :index | ||
81 | + assert_tag :tag => 'a', :attributes => { :href => "/admin/environment_themes/unset" } | ||
82 | + end | ||
83 | + | ||
84 | + should 'point back to admin panel' do | ||
85 | + get :index | ||
86 | + assert_tag :tag => 'a', :attributes => { :href => '/admin' }, :content => 'Back' | ||
87 | + end | ||
88 | + | ||
89 | + should 'list templates' do | ||
90 | + all = LayoutTemplate.all | ||
91 | + | ||
92 | + LayoutTemplate.expects(:all).returns(all) | ||
93 | + get :index | ||
94 | + assert_same all, assigns(:layout_templates) | ||
95 | + end | ||
96 | + | ||
97 | + should 'display links to set template' do | ||
98 | + env = Environment.default | ||
99 | + env.layout_template = 'rightbar' | ||
100 | + env.save! | ||
101 | + t1 = LayoutTemplate.find('default') | ||
102 | + t2 = LayoutTemplate.find('leftbar') | ||
103 | + LayoutTemplate.expects(:all).returns([t1, t2]) | ||
104 | + | ||
105 | + get :index | ||
106 | + assert_tag :tag => 'a', :attributes => { :href => "/admin/environment_themes/set_layout_template/default"} | ||
107 | + assert_tag :tag => 'a', :attributes => { :href => "/admin/environment_themes/set_layout_template/leftbar"} | ||
108 | + end | ||
109 | + | ||
110 | + should 'highlight current template' do | ||
111 | + env = Environment.default | ||
112 | + env.update_attributes!(:layout_template => 'default') | ||
113 | + env.layout_template = 'default' | ||
114 | + | ||
115 | + t1 = LayoutTemplate.find('default') | ||
116 | + t2 = LayoutTemplate.find('leftbar') | ||
117 | + LayoutTemplate.expects(:all).returns([t1, t2]) | ||
118 | + | ||
119 | + get :index | ||
120 | + assert_tag :attributes => { :class => 'template-opt list-opt selected' } | ||
121 | + assert_no_tag :tag => 'a', :attributes => { :href => "/admin/environment_themes/set_layout_template/default"} | ||
122 | + end | ||
123 | + | ||
124 | + should 'set template' do | ||
125 | + env = Environment.default | ||
126 | + post :set_layout_template, :id => 'leftbar' | ||
127 | + env.reload | ||
128 | + assert_equal 'leftbar', env.layout_template | ||
129 | + assert_redirected_to :action => 'index' | ||
130 | + end | ||
131 | + | ||
132 | + should 'not display the "Select themes" section if there are no themes to choose from' do | ||
133 | + env = Environment.default | ||
134 | + env.themes = []; env.save! | ||
135 | + Theme.stubs(:system_themes_dir).returns(TMP_THEMES_DIR) # an empty dir | ||
136 | + get :index | ||
137 | + assert_no_tag :content => "Select theme" | ||
138 | + end | ||
139 | + | ||
140 | +end |
@@ -0,0 +1,313 @@ | @@ -0,0 +1,313 @@ | ||
1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
2 | +# require 'profile_themes_controller' | ||
3 | + | ||
4 | +class ProfileThemesController; def rescue_action(e) raise e end; end | ||
5 | + | ||
6 | +class ProfileThemesControllerTest < ActionController::TestCase | ||
7 | + | ||
8 | + def setup | ||
9 | + @controller = ProfileThemesController.new | ||
10 | + @request = ActionController::TestRequest.new | ||
11 | + @response = ActionController::TestResponse.new | ||
12 | + | ||
13 | + Theme.stubs(:user_themes_dir).returns(TMP_THEMES_DIR) | ||
14 | + | ||
15 | + @profile = create_user('testinguser').person | ||
16 | + login_as('testinguser') | ||
17 | + | ||
18 | + @env = Environment.default | ||
19 | + @env.enable('user_themes') | ||
20 | + @env.save! | ||
21 | + end | ||
22 | + attr_reader :profile, :env | ||
23 | + | ||
24 | + def teardown | ||
25 | + FileUtils.rm_rf(TMP_THEMES_DIR) | ||
26 | + end | ||
27 | + | ||
28 | + TMP_THEMES_DIR = Rails.root.join("test", "tmp", "profile_themes_controller") | ||
29 | + | ||
30 | + should 'display themes that can be applied' do | ||
31 | + env = Environment.default | ||
32 | + Theme.stubs(:approved_themes).with(@profile).returns([Theme.new('t1', :name => 't1')]) | ||
33 | + t2 = 't2' | ||
34 | + t3 = 't3' | ||
35 | + env.themes = [t2] | ||
36 | + env.save | ||
37 | + | ||
38 | + Theme.stubs(:system_themes).returns([Theme.new(t2), Theme.new(t3)]) | ||
39 | + get :index, :profile => 'testinguser' | ||
40 | + | ||
41 | + %w[ t1 t2 ].each do |item| | ||
42 | + assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/set/#{item}" } | ||
43 | + end | ||
44 | + | ||
45 | + assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/set/t3" } | ||
46 | + end | ||
47 | + | ||
48 | + should 'highlight current theme' do | ||
49 | + env = Environment.default | ||
50 | + t1 = 'one' | ||
51 | + t2 = 'two' | ||
52 | + env.themes = [t1, t2] | ||
53 | + env.save | ||
54 | + | ||
55 | + Theme.stubs(:system_themes).returns([Theme.new(t1), Theme.new(t2)]) | ||
56 | + profile.update_theme(t1) | ||
57 | + get :index, :profile => 'testinguser' | ||
58 | + | ||
59 | + assert_tag :attributes => { :class => 'theme-opt list-opt selected' } | ||
60 | + assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/set/one" } | ||
61 | + end | ||
62 | + | ||
63 | + should 'display list of my themes for edition' do | ||
64 | + Theme.create('three', :owner => profile) | ||
65 | + Theme.create('four', :owner => profile) | ||
66 | + | ||
67 | + get :index, :profile => 'testinguser' | ||
68 | + | ||
69 | + %w[ three four ].each do |item| | ||
70 | + assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/edit/#{item}" } | ||
71 | + end | ||
72 | + end | ||
73 | + | ||
74 | + should 'save selection of theme' do | ||
75 | + get :set, :profile => 'testinguser', :id => 'onetheme' | ||
76 | + profile = Profile.find(@profile.id) | ||
77 | + assert_equal 'onetheme', profile.theme | ||
78 | + end | ||
79 | + | ||
80 | + should 'save selection of theme even if model is invalid' do | ||
81 | + @profile.sex = nil | ||
82 | + @profile.save! | ||
83 | + @profile.environment.custom_person_fields = { 'sex' => {'required' => 'true', 'active' => 'true'} }; @profile.environment.save! | ||
84 | + | ||
85 | + get :set, :profile => 'testinguser', :id => 'onetheme' | ||
86 | + profile = Profile.find(@profile.id) | ||
87 | + assert_equal 'onetheme', profile.theme | ||
88 | + end | ||
89 | + | ||
90 | + should 'unset selection of theme' do | ||
91 | + get :unset, :profile => 'testinguser' | ||
92 | + assert_equal nil, profile.theme | ||
93 | + end | ||
94 | + | ||
95 | + should 'display link to use the default theme' do | ||
96 | + env = Environment.default | ||
97 | + env.themes = ['new-theme'] | ||
98 | + env.save | ||
99 | + | ||
100 | + Theme.stubs(:system_themes).returns([Theme.new('new-theme')]) | ||
101 | + | ||
102 | + get :index, :profile => 'testinguser' | ||
103 | + assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/unset" } | ||
104 | + end | ||
105 | + | ||
106 | + should 'point back to control panel' do | ||
107 | + get :index, :profile => 'testinguser' | ||
108 | + assert_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser' }, :content => 'Back' | ||
109 | + end | ||
110 | + | ||
111 | + should 'display screen for creating new theme' do | ||
112 | + @request.expects(:xhr?).returns(true).at_least_once | ||
113 | + get :new, :profile => 'testinguser' | ||
114 | + assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/profile_themes/new', :method => /post/i }, :descendant => { :tag => 'input', :attributes => { :type => 'text', :name => 'name' } } | ||
115 | + end | ||
116 | + | ||
117 | + should 'create a new theme' do | ||
118 | + post :new, :profile => 'testinguser', :name => 'My theme' | ||
119 | + | ||
120 | + ok('theme should be created') do | ||
121 | + profile.themes.first.id == 'my-theme' | ||
122 | + end | ||
123 | + end | ||
124 | + | ||
125 | + should 'edit a theme' do | ||
126 | + theme = Theme.create('mytheme', :owner => profile) | ||
127 | + get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
128 | + | ||
129 | + assert_equal theme, assigns(:theme) | ||
130 | + end | ||
131 | + | ||
132 | + should 'list CSS files in theme' do | ||
133 | + theme = Theme.create('mytheme', :owner => profile) | ||
134 | + theme.add_css('one.css') | ||
135 | + theme.add_css('two.css') | ||
136 | + | ||
137 | + get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
138 | + | ||
139 | + %w[ one.css two.css ].each do |item| | ||
140 | + assert_includes assigns(:css_files), item | ||
141 | + assert_tag :tag => 'li', :descendant => { :tag => 'a', :content => item} | ||
142 | + end | ||
143 | + end | ||
144 | + | ||
145 | + should 'display dialog for creating new CSS' do | ||
146 | + theme = Theme.create('mytheme', :owner => profile) | ||
147 | + @request.stubs(:xhr?).returns(true) | ||
148 | + get :add_css, :profile => 'testinguser', :id => 'mytheme' | ||
149 | + | ||
150 | + assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/profile_themes/add_css/mytheme', :method => /post/i} | ||
151 | + assert_tag :tag => 'input', :attributes => { :name => 'css', :type => 'text' } | ||
152 | + assert_tag :tag => 'input', :attributes => { :type => 'submit' } | ||
153 | + end | ||
154 | + | ||
155 | + should 'be able to add new CSS to theme' do | ||
156 | + theme = Theme.create('mytheme', :owner => profile) | ||
157 | + post :add_css, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css' | ||
158 | + | ||
159 | + assert_response :redirect | ||
160 | + | ||
161 | + reloaded_theme = Theme.find('mytheme') | ||
162 | + assert_includes reloaded_theme.css_files, 'test.css' | ||
163 | + end | ||
164 | + | ||
165 | + should 'load code from a given CSS file' do | ||
166 | + theme = Theme.create('mytheme', :owner => profile); theme.update_css('test.css', '/* sample code */') | ||
167 | + get :css_editor, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css' | ||
168 | + | ||
169 | + assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/profile_themes/update_css/mytheme' }, :descendant => { :tag => 'textarea', :content => /\/\* sample code \*\// } | ||
170 | + end | ||
171 | + | ||
172 | + should 'be able to save CSS code' do | ||
173 | + theme = Theme.create('mytheme', :owner => profile); theme.update_css('test.css', '/* sample code */') | ||
174 | + get :css_editor, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css' | ||
175 | + | ||
176 | + assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/profile_themes/update_css/mytheme' }, :descendant => { :tag => 'input', :attributes => { :type => 'submit' } } | ||
177 | + assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/profile_themes/update_css/mytheme' }, :descendant => { :tag => 'input', :attributes => { :type => 'hidden', :name => 'css', :value => 'test.css' } } | ||
178 | + end | ||
179 | + | ||
180 | + should 'update css code when saving' do | ||
181 | + theme = Theme.create('mytheme', :owner => profile); theme.update_css('test.css', '/* sample code */') | ||
182 | + post :update_css, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css', :csscode => 'body { background: white; }' | ||
183 | + assert_equal 'body { background: white; }', theme.read_css('test.css') | ||
184 | + end | ||
185 | + | ||
186 | + should 'list image files in theme' do | ||
187 | + theme = Theme.create('mytheme', :owner => profile) | ||
188 | + theme.add_image('one.png', 'FAKE IMAGE DATA 1') | ||
189 | + theme.add_image('two.png', 'FAKE IMAGE DATA 2') | ||
190 | + | ||
191 | + get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
192 | + | ||
193 | + assert_tag :tag => 'img', :attributes => { :src => '/user_themes/mytheme/images/one.png' } | ||
194 | + assert_tag :tag => 'img', :attributes => { :src => '/user_themes/mytheme/images/two.png' } | ||
195 | + end | ||
196 | + | ||
197 | + should 'display "add image" button' do | ||
198 | + theme = Theme.create('mytheme', :owner => profile) | ||
199 | + get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
200 | + | ||
201 | + assert_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser/profile_themes/add_image/mytheme' } | ||
202 | + end | ||
203 | + | ||
204 | + should 'display the "add image" dialog' do | ||
205 | + theme = Theme.create('mytheme', :owner => profile) | ||
206 | + @request.stubs(:xhr?).returns(true) | ||
207 | + | ||
208 | + get :add_image, :profile => 'testinguser', :id => 'mytheme' | ||
209 | + assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/profile_themes/add_image/mytheme', :method => /post/i, :enctype => 'multipart/form-data' }, :descendant => { :tag => 'input', :attributes => { :name => 'image', :type => 'file' } } | ||
210 | + end | ||
211 | + | ||
212 | + should 'be able to add new image to theme' do | ||
213 | + theme = Theme.create('mytheme', :owner => profile) | ||
214 | + @request.stubs(:xhr?).returns(false) | ||
215 | + | ||
216 | + post :add_image, :profile => 'testinguser', :id => 'mytheme', :image => fixture_file_upload('/files/rails.png', 'image/png', :binary) | ||
217 | + assert_redirected_to :action => "edit", :id => 'mytheme' | ||
218 | + assert theme.image_files.include?('rails.png') | ||
219 | + assert(system('diff', Rails.root.join('test', 'fixtures', 'files','rails.png').to_s, TMP_THEMES_DIR.join('mytheme/images/rails.png').to_s), 'should put the correct uploaded file in the right place') | ||
220 | + end | ||
221 | + | ||
222 | + should 'link to "test theme"' do | ||
223 | + Theme.create('one', :owner => profile) | ||
224 | + Theme.create('two', :owner => profile) | ||
225 | + get :index, :profile => 'testinguser' | ||
226 | + | ||
227 | + %w[ one two ].each do |item| | ||
228 | + assert_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser/profile_themes/start_test/' + item } | ||
229 | + end | ||
230 | + end | ||
231 | + | ||
232 | + should 'start testing theme' do | ||
233 | + theme = Theme.create('theme-under-test', :owner => profile) | ||
234 | + post :start_test, :profile => 'testinguser', :id => 'theme-under-test' | ||
235 | + | ||
236 | + assert_equal 'theme-under-test', session[:theme] | ||
237 | + assert_redirected_to :controller => 'content_viewer', :profile => 'testinguser', :action => 'view_page' | ||
238 | + end | ||
239 | + | ||
240 | + should 'stop testing theme' do | ||
241 | + theme = Theme.create('theme-under-test', :owner => profile) | ||
242 | + post :stop_test, :profile => 'testinguser', :id => 'theme-under-test' | ||
243 | + | ||
244 | + assert_nil session[:theme] | ||
245 | + assert_redirected_to :action => 'index' | ||
246 | + end | ||
247 | + | ||
248 | + should 'list templates' do | ||
249 | + all = LayoutTemplate.all | ||
250 | + | ||
251 | + LayoutTemplate.expects(:all).returns(all) | ||
252 | + get :index, :profile => 'testinguser' | ||
253 | + assert_equal all, assigns(:layout_templates) | ||
254 | + end | ||
255 | + | ||
256 | + should 'display links to set template' do | ||
257 | + profile.layout_template = 'rightbar' | ||
258 | + profile.save! | ||
259 | + t1 = LayoutTemplate.find('default') | ||
260 | + t2 = LayoutTemplate.find('leftbar') | ||
261 | + LayoutTemplate.expects(:all).returns([t1, t2]) | ||
262 | + | ||
263 | + get :index, :profile => 'testinguser' | ||
264 | + assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/set_layout_template/default"} | ||
265 | + assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/set_layout_template/leftbar"} | ||
266 | + end | ||
267 | + | ||
268 | + should 'highlight current template' do | ||
269 | + profile.layout_template = 'default' | ||
270 | + profile.save! | ||
271 | + | ||
272 | + t1 = LayoutTemplate.find('default') | ||
273 | + t2 = LayoutTemplate.find('leftbar') | ||
274 | + LayoutTemplate.expects(:all).returns([t1, t2]) | ||
275 | + | ||
276 | + get :index, :profile => 'testinguser' | ||
277 | + assert_tag :attributes => { :class => 'template-opt list-opt selected' } | ||
278 | + assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/set_layout_template/default"} | ||
279 | + end | ||
280 | + | ||
281 | + should 'set template' do | ||
282 | + post :set_layout_template, :profile => 'testinguser', :id => 'leftbar' | ||
283 | + profile = Profile.find(@profile.id) | ||
284 | + assert_equal 'leftbar', profile.layout_template | ||
285 | + assert_redirected_to :action => 'index' | ||
286 | + end | ||
287 | + | ||
288 | + should 'set template even if the model is invalid' do | ||
289 | + @profile.sex = nil | ||
290 | + @profile.save! | ||
291 | + @profile.environment.custom_person_fields = { 'sex' => {'required' => 'true', 'active' => 'true'} }; @profile.environment.save! | ||
292 | + | ||
293 | + post :set_layout_template, :profile => 'testinguser', :id => 'leftbar' | ||
294 | + profile = Profile.find(@profile.id) | ||
295 | + assert_equal 'leftbar', profile.layout_template | ||
296 | + assert_redirected_to :action => 'index' | ||
297 | + end | ||
298 | + | ||
299 | + should 'not display "new theme" button when user themes are disabled' do | ||
300 | + env.disable('user_themes') | ||
301 | + env.save! | ||
302 | + get :index, :profile => 'testinguser' | ||
303 | + assert_no_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser/profile_themes/new' } | ||
304 | + end | ||
305 | + | ||
306 | + should 'not display the "Select themes" section if there are no themes to choose from' do | ||
307 | + env.themes = []; env.save! | ||
308 | + Theme.stubs(:system_themes_dir).returns(TMP_THEMES_DIR) # an empty dir | ||
309 | + get :index, :profile => "testinguser" | ||
310 | + assert_no_tag :content => "Select theme" | ||
311 | + end | ||
312 | + | ||
313 | +end |
test/functional/themes_controller_test.rb
@@ -1,311 +0,0 @@ | @@ -1,311 +0,0 @@ | ||
1 | -require File.dirname(__FILE__) + '/../test_helper' | ||
2 | -require 'themes_controller' | ||
3 | - | ||
4 | -class ThemesController; def rescue_action(e) raise e end; end | ||
5 | - | ||
6 | -class ThemesControllerTest < ActionController::TestCase | ||
7 | - | ||
8 | - def setup | ||
9 | - @controller = ThemesController.new | ||
10 | - @request = ActionController::TestRequest.new | ||
11 | - @response = ActionController::TestResponse.new | ||
12 | - | ||
13 | - Theme.stubs(:user_themes_dir).returns(TMP_THEMES_DIR) | ||
14 | - | ||
15 | - @profile = create_user('testinguser').person | ||
16 | - login_as('testinguser') | ||
17 | - | ||
18 | - @env = Environment.default | ||
19 | - @env.enable('user_themes') | ||
20 | - @env.save! | ||
21 | - end | ||
22 | - attr_reader :profile, :env | ||
23 | - | ||
24 | - def teardown | ||
25 | - FileUtils.rm_rf(TMP_THEMES_DIR) | ||
26 | - end | ||
27 | - | ||
28 | - TMP_THEMES_DIR = Rails.root.join("test", "tmp", "themes_controller") | ||
29 | - | ||
30 | - should 'display themes that can be applied' do | ||
31 | - env = Environment.default | ||
32 | - Theme.stubs(:approved_themes).with(@profile).returns([Theme.new('t1', :name => 't1')]) | ||
33 | - t2 = 't2' | ||
34 | - t3 = 't3' | ||
35 | - env.themes = [t2] | ||
36 | - env.save | ||
37 | - | ||
38 | - Theme.stubs(:system_themes).returns([Theme.new(t2), Theme.new(t3)]) | ||
39 | - get :index, :profile => 'testinguser' | ||
40 | - | ||
41 | - %w[ t1 t2 ].each do |item| | ||
42 | - assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set/#{item}" } | ||
43 | - end | ||
44 | - | ||
45 | - assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set/t3" } | ||
46 | - end | ||
47 | - | ||
48 | - should 'highlight current theme' do | ||
49 | - env = Environment.default | ||
50 | - t1 = 'one' | ||
51 | - t2 = 'two' | ||
52 | - env.themes = [t1, t2] | ||
53 | - env.save | ||
54 | - | ||
55 | - Theme.stubs(:system_themes).returns([Theme.new(t1), Theme.new(t2)]) | ||
56 | - profile.update_theme(t1) | ||
57 | - get :index, :profile => 'testinguser' | ||
58 | - | ||
59 | - assert_tag :attributes => { :class => 'theme-opt list-opt selected' } | ||
60 | - assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set/one" } | ||
61 | - end | ||
62 | - | ||
63 | - should 'display list of my themes for edition' do | ||
64 | - Theme.create('three', :owner => profile) | ||
65 | - Theme.create('four', :owner => profile) | ||
66 | - | ||
67 | - get :index, :profile => 'testinguser' | ||
68 | - | ||
69 | - %w[ three four ].each do |item| | ||
70 | - assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/edit/#{item}" } | ||
71 | - end | ||
72 | - end | ||
73 | - | ||
74 | - should 'save selection of theme' do | ||
75 | - get :set, :profile => 'testinguser', :id => 'onetheme' | ||
76 | - profile = Profile.find(@profile.id) | ||
77 | - assert_equal 'onetheme', profile.theme | ||
78 | - end | ||
79 | - | ||
80 | - should 'save selection of theme even if model is invalid' do | ||
81 | - @profile.sex = nil | ||
82 | - @profile.save! | ||
83 | - @profile.environment.custom_person_fields = { 'sex' => {'required' => 'true', 'active' => 'true'} }; @profile.environment.save! | ||
84 | - | ||
85 | - get :set, :profile => 'testinguser', :id => 'onetheme' | ||
86 | - profile = Profile.find(@profile.id) | ||
87 | - assert_equal 'onetheme', profile.theme | ||
88 | - end | ||
89 | - | ||
90 | - should 'unset selection of theme' do | ||
91 | - get :unset, :profile => 'testinguser' | ||
92 | - assert_equal nil, profile.theme | ||
93 | - end | ||
94 | - | ||
95 | - should 'display link to use the default theme' do | ||
96 | - env = Environment.default | ||
97 | - env.themes = ['new-theme'] | ||
98 | - env.save | ||
99 | - | ||
100 | - Theme.stubs(:system_themes).returns([Theme.new('new-theme')]) | ||
101 | - | ||
102 | - get :index, :profile => 'testinguser' | ||
103 | - assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/unset" } | ||
104 | - end | ||
105 | - | ||
106 | - should 'point back to control panel' do | ||
107 | - get :index, :profile => 'testinguser' | ||
108 | - assert_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser' }, :content => 'Back' | ||
109 | - end | ||
110 | - | ||
111 | - should 'display screen for creating new theme' do | ||
112 | - @request.expects(:xhr?).returns(true).at_least_once | ||
113 | - get :new, :profile => 'testinguser' | ||
114 | - assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/themes/new', :method => /post/i }, :descendant => { :tag => 'input', :attributes => { :type => 'text', :name => 'name' } } | ||
115 | - end | ||
116 | - | ||
117 | - should 'create a new theme' do | ||
118 | - post :new, :profile => 'testinguser', :name => 'My theme' | ||
119 | - | ||
120 | - ok('theme should be created') do | ||
121 | - profile.themes.first.id == 'my-theme' | ||
122 | - end | ||
123 | - end | ||
124 | - | ||
125 | - should 'edit a theme' do | ||
126 | - theme = Theme.create('mytheme', :owner => profile) | ||
127 | - get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
128 | - | ||
129 | - assert_equal theme, assigns(:theme) | ||
130 | - end | ||
131 | - | ||
132 | - should 'list CSS files in theme' do | ||
133 | - theme = Theme.create('mytheme', :owner => profile) | ||
134 | - theme.add_css('one.css') | ||
135 | - theme.add_css('two.css') | ||
136 | - | ||
137 | - get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
138 | - | ||
139 | - %w[ one.css two.css ].each do |item| | ||
140 | - assert_includes assigns(:css_files), item | ||
141 | - assert_tag :tag => 'li', :descendant => { :tag => 'a', :content => item} | ||
142 | - end | ||
143 | - end | ||
144 | - | ||
145 | - should 'display dialog for creating new CSS' do | ||
146 | - theme = Theme.create('mytheme', :owner => profile) | ||
147 | - @request.stubs(:xhr?).returns(true) | ||
148 | - get :add_css, :profile => 'testinguser', :id => 'mytheme' | ||
149 | - | ||
150 | - assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/themes/add_css/mytheme', :method => /post/i} | ||
151 | - assert_tag :tag => 'input', :attributes => { :name => 'css', :type => 'text' } | ||
152 | - assert_tag :tag => 'input', :attributes => { :type => 'submit' } | ||
153 | - end | ||
154 | - | ||
155 | - should 'be able to add new CSS to theme' do | ||
156 | - theme = Theme.create('mytheme', :owner => profile) | ||
157 | - post :add_css, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css' | ||
158 | - | ||
159 | - assert_response :redirect | ||
160 | - | ||
161 | - reloaded_theme = Theme.find('mytheme') | ||
162 | - assert_includes reloaded_theme.css_files, 'test.css' | ||
163 | - end | ||
164 | - | ||
165 | - should 'load code from a given CSS file' do | ||
166 | - theme = Theme.create('mytheme', :owner => profile); theme.update_css('test.css', '/* sample code */') | ||
167 | - get :css_editor, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css' | ||
168 | - | ||
169 | - assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/themes/update_css/mytheme' }, :descendant => { :tag => 'textarea', :content => /\/\* sample code \*\// } | ||
170 | - end | ||
171 | - | ||
172 | - should 'be able to save CSS code' do | ||
173 | - theme = Theme.create('mytheme', :owner => profile); theme.update_css('test.css', '/* sample code */') | ||
174 | - get :css_editor, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css' | ||
175 | - | ||
176 | - assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/themes/update_css/mytheme' }, :descendant => { :tag => 'input', :attributes => { :type => 'submit' } } | ||
177 | - assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/themes/update_css/mytheme' }, :descendant => { :tag => 'input', :attributes => { :type => 'hidden', :name => 'css', :value => 'test.css' } } | ||
178 | - end | ||
179 | - | ||
180 | - should 'update css code when saving' do | ||
181 | - theme = Theme.create('mytheme', :owner => profile); theme.update_css('test.css', '/* sample code */') | ||
182 | - post :update_css, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css', :csscode => 'body { background: white; }' | ||
183 | - assert_equal 'body { background: white; }', theme.read_css('test.css') | ||
184 | - end | ||
185 | - | ||
186 | - should 'list image files in theme' do | ||
187 | - theme = Theme.create('mytheme', :owner => profile) | ||
188 | - theme.add_image('one.png', 'FAKE IMAGE DATA 1') | ||
189 | - theme.add_image('two.png', 'FAKE IMAGE DATA 2') | ||
190 | - | ||
191 | - get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
192 | - | ||
193 | - assert_tag :tag => 'img', :attributes => { :src => '/user_themes/mytheme/images/one.png' } | ||
194 | - assert_tag :tag => 'img', :attributes => { :src => '/user_themes/mytheme/images/two.png' } | ||
195 | - end | ||
196 | - | ||
197 | - should 'display "add image" button' do | ||
198 | - theme = Theme.create('mytheme', :owner => profile) | ||
199 | - get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
200 | - | ||
201 | - assert_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser/themes/add_image/mytheme' } | ||
202 | - end | ||
203 | - | ||
204 | - should 'display the "add image" dialog' do | ||
205 | - theme = Theme.create('mytheme', :owner => profile) | ||
206 | - @request.stubs(:xhr?).returns(true) | ||
207 | - | ||
208 | - get :add_image, :profile => 'testinguser', :id => 'mytheme' | ||
209 | - assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/themes/add_image/mytheme', :method => /post/i, :enctype => 'multipart/form-data' }, :descendant => { :tag => 'input', :attributes => { :name => 'image', :type => 'file' } } | ||
210 | - end | ||
211 | - | ||
212 | - should 'be able to add new image to theme' do | ||
213 | - theme = Theme.create('mytheme', :owner => profile) | ||
214 | - @request.stubs(:xhr?).returns(false) | ||
215 | - | ||
216 | - post :add_image, :profile => 'testinguser', :id => 'mytheme', :image => fixture_file_upload('/files/rails.png', 'image/png', :binary) | ||
217 | - assert_redirected_to :action => "edit", :id => 'mytheme' | ||
218 | - assert theme.image_files.include?('rails.png') | ||
219 | - assert(system('diff', Rails.root.join('test', 'fixtures', 'files','rails.png').to_s, TMP_THEMES_DIR.join('mytheme/images/rails.png').to_s), 'should put the correct uploaded file in the right place') | ||
220 | - end | ||
221 | - | ||
222 | - should 'link to "test theme"' do | ||
223 | - Theme.create('one', :owner => profile) | ||
224 | - Theme.create('two', :owner => profile) | ||
225 | - get :index, :profile => 'testinguser' | ||
226 | - | ||
227 | - %w[ one two ].each do |item| | ||
228 | - assert_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser/themes/start_test/' + item } | ||
229 | - end | ||
230 | - end | ||
231 | - | ||
232 | - should 'start testing theme' do | ||
233 | - theme = Theme.create('theme-under-test', :owner => profile) | ||
234 | - post :start_test, :profile => 'testinguser', :id => 'theme-under-test' | ||
235 | - | ||
236 | - assert_equal 'theme-under-test', session[:theme] | ||
237 | - assert_redirected_to :controller => 'content_viewer', :profile => 'testinguser', :action => 'view_page' | ||
238 | - end | ||
239 | - | ||
240 | - should 'stop testing theme' do | ||
241 | - theme = Theme.create('theme-under-test', :owner => profile) | ||
242 | - post :stop_test, :profile => 'testinguser', :id => 'theme-under-test' | ||
243 | - | ||
244 | - assert_nil session[:theme] | ||
245 | - assert_redirected_to :action => 'index' | ||
246 | - end | ||
247 | - | ||
248 | - should 'list templates' do | ||
249 | - all = LayoutTemplate.all | ||
250 | - | ||
251 | - LayoutTemplate.expects(:all).returns(all) | ||
252 | - get :index, :profile => 'testinguser' | ||
253 | - assert_equal all, assigns(:layout_templates) | ||
254 | - end | ||
255 | - | ||
256 | - should 'display links to set template' do | ||
257 | - profile.update_attributes!({:layout_template => 'rightbar'}, :without_protection => true) | ||
258 | - t1 = LayoutTemplate.find('default') | ||
259 | - t2 = LayoutTemplate.find('leftbar') | ||
260 | - LayoutTemplate.expects(:all).returns([t1, t2]) | ||
261 | - | ||
262 | - get :index, :profile => 'testinguser' | ||
263 | - assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set_layout_template/default"} | ||
264 | - assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set_layout_template/leftbar"} | ||
265 | - end | ||
266 | - | ||
267 | - should 'highlight current template' do | ||
268 | - profile.update_attributes!({:layout_template => 'default'}, :without_protection => true) | ||
269 | - | ||
270 | - t1 = LayoutTemplate.find('default') | ||
271 | - t2 = LayoutTemplate.find('leftbar') | ||
272 | - LayoutTemplate.expects(:all).returns([t1, t2]) | ||
273 | - | ||
274 | - get :index, :profile => 'testinguser' | ||
275 | - assert_tag :attributes => { :class => 'template-opt list-opt selected' } | ||
276 | - assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set_layout_template/default"} | ||
277 | - end | ||
278 | - | ||
279 | - should 'set template' do | ||
280 | - post :set_layout_template, :profile => 'testinguser', :id => 'leftbar' | ||
281 | - profile = Profile.find(@profile.id) | ||
282 | - assert_equal 'leftbar', profile.layout_template | ||
283 | - assert_redirected_to :action => 'index' | ||
284 | - end | ||
285 | - | ||
286 | - should 'set template even if the model is invalid' do | ||
287 | - @profile.sex = nil | ||
288 | - @profile.save! | ||
289 | - @profile.environment.custom_person_fields = { 'sex' => {'required' => 'true', 'active' => 'true'} }; @profile.environment.save! | ||
290 | - | ||
291 | - post :set_layout_template, :profile => 'testinguser', :id => 'leftbar' | ||
292 | - profile = Profile.find(@profile.id) | ||
293 | - assert_equal 'leftbar', profile.layout_template | ||
294 | - assert_redirected_to :action => 'index' | ||
295 | - end | ||
296 | - | ||
297 | - should 'not display "new theme" button when user themes are disabled' do | ||
298 | - env.disable('user_themes') | ||
299 | - env.save! | ||
300 | - get :index, :profile => 'testinguser' | ||
301 | - assert_no_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser/themes/new' } | ||
302 | - end | ||
303 | - | ||
304 | - should 'not display the "Select themes" section if there are no themes to choose from' do | ||
305 | - env.themes = []; env.save! | ||
306 | - Theme.stubs(:system_themes_dir).returns(TMP_THEMES_DIR) # an empty dir | ||
307 | - get :index, :profile => "testinguser" | ||
308 | - assert_no_tag :content => "Select theme" | ||
309 | - end | ||
310 | - | ||
311 | -end |
test/unit/box_test.rb
@@ -119,4 +119,25 @@ class BoxTest < ActiveSupport::TestCase | @@ -119,4 +119,25 @@ class BoxTest < ActiveSupport::TestCase | ||
119 | assert blocks.include?('box-test_plugin-block') | 119 | assert blocks.include?('box-test_plugin-block') |
120 | end | 120 | end |
121 | 121 | ||
122 | + should 'list plugin block as allowed for the right holder' do | ||
123 | + class SomePlugin < Noosfero::Plugin | ||
124 | + def self.extra_blocks | ||
125 | + { PluginBlock => {:position => 1, :type => [Person, Enterprise]} } | ||
126 | + end | ||
127 | + end | ||
128 | + class PluginBlock < Block | ||
129 | + def self.to_s; 'plugin-block'; end | ||
130 | + end | ||
131 | + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([SomePlugin.new]) | ||
132 | + | ||
133 | + blocks = Box.new(:position => 1, :owner => Person.new).acceptable_blocks | ||
134 | + assert blocks.include?('box-test_plugin-block') | ||
135 | + | ||
136 | + blocks = Box.new(:position => 1, :owner => Enterprise.new).acceptable_blocks | ||
137 | + assert blocks.include?('box-test_plugin-block') | ||
138 | + | ||
139 | + blocks = Box.new(:position => 1, :owner => Community.new).acceptable_blocks | ||
140 | + assert !blocks.include?('box-test_plugin-block') | ||
141 | + end | ||
142 | + | ||
122 | end | 143 | end |