typus 0.9.22 → 0.9.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.rdoc CHANGED
@@ -26,6 +26,25 @@ Step 3: Go to the admin area and enjoy it!
26
26
 
27
27
  http://0.0.0.0:3000/admin
28
28
 
29
+ == Want to see a demo working?
30
+
31
+ There's an application running at Heroku.
32
+
33
+ http://typus.heroku.com/
34
+
35
+ Use the following credentials to log in.
36
+
37
+ Email: userdemo@intraducibles.com
38
+ Password: userdemo
39
+
40
+ Notes on the application demo:
41
+
42
+ - Runs under SSL.
43
+ - Has an Assets model to show how assets can work.
44
+ - User can only edit the posts they have generated.
45
+ - User cannot edit Categories, just view them.
46
+ - Shows how TinyMCE is integrated with Pages.
47
+
29
48
  == Installing
30
49
 
31
50
  Install from GitHub the latest version which it's compatible with Rails 2.3.2.
@@ -58,8 +77,7 @@ Typus and blog about Typus.
58
77
 
59
78
  == Fancyzoom for assets
60
79
 
61
- This feature is a work in progress. It currently works if the attached file is
62
- named asset and only previews images.
80
+ This feature is a work in progress. Only previews images.
63
81
 
64
82
  # db/migrate/create_photos.rb
65
83
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.22
1
+ 0.9.23
@@ -88,7 +88,7 @@ class Admin::MasterController < ApplicationController
88
88
  @item = @resource[:class].new(params[:item])
89
89
 
90
90
  if @item.attributes.include?(Typus.user_fk)
91
- @item.attributes = { Typus.user_fk => session[:typus_user_id] }
91
+ @item.attributes = { Typus.user_fk => @current_user.id }
92
92
  end
93
93
 
94
94
  if @item.valid?
@@ -147,7 +147,7 @@ class Admin::MasterController < ApplicationController
147
147
  def destroy
148
148
  @item.destroy
149
149
  flash[:success] = _("{{model}} successfully removed.", :model => @resource[:class].typus_human_name)
150
- redirect_to :back
150
+ redirect_to request.referer || admin_dashboard_path
151
151
  rescue Exception => error
152
152
  error_handler(error, params.merge(:action => 'index', :id => nil))
153
153
  end
@@ -161,7 +161,7 @@ class Admin::MasterController < ApplicationController
161
161
  else
162
162
  flash[:notice] = _("Toggle is disabled.")
163
163
  end
164
- redirect_to :back
164
+ redirect_to request.referer || admin_dashboard_path
165
165
  end
166
166
 
167
167
  ##
@@ -176,7 +176,7 @@ class Admin::MasterController < ApplicationController
176
176
  def position
177
177
  @item.send(params[:go])
178
178
  flash[:success] = _("Record moved {{to}}.", :to => params[:go].gsub(/move_/, '').humanize.downcase)
179
- redirect_to :back
179
+ redirect_to request.referer || admin_dashboard_path
180
180
  end
181
181
 
182
182
  ##
@@ -256,9 +256,9 @@ private
256
256
 
257
257
  # OPTIMIZE: `typus_users` is currently hard-coded. We should find a good name for this option.
258
258
  if @item.respond_to?('typus_users') && !@item.send('typus_users').include?(@current_user) ||
259
- @item.respond_to?(Typus.user_fk) && !(@item.send(Typus.user_fk) == session[:typus_user_id])
259
+ @item.respond_to?(Typus.user_fk) && !@item.owned_by?(@current_user)
260
260
  flash[:notice] = _("You don't have permission to access this item.")
261
- redirect_to :back
261
+ redirect_to request.referer || admin_dashboard_path
262
262
  end
263
263
 
264
264
  end
@@ -271,7 +271,7 @@ private
271
271
  # If current user is not root and @resource has a foreign_key which
272
272
  # is related to the logged user (Typus.user_fk) we only show the user
273
273
  # related items.
274
- if @resource[:class].columns.map { |u| u.name }.include?(Typus.user_fk)
274
+ if @resource[:class].typus_user_id?
275
275
  condition = { Typus.user_fk => @current_user }
276
276
  @conditions = @resource[:class].merge_conditions(@conditions, condition)
277
277
  end
@@ -13,12 +13,15 @@ class TypusController < ApplicationController
13
13
  include SslRequirement
14
14
  ssl_required :sign_in, :sign_out,
15
15
  :dashboard,
16
- :recover_password, :reset_password
16
+ :recover_password, :reset_password,
17
+ :set_locale
17
18
  end
18
19
 
19
20
  filter_parameter_logging :password
20
21
 
21
- before_filter :set_locale
22
+ before_filter :verify_typus_users_table_schema
23
+
24
+ before_filter :set_default_locale, :except => [ :dashboard ]
22
25
 
23
26
  before_filter :reload_config_et_roles
24
27
  before_filter :require_login,
@@ -35,6 +38,8 @@ class TypusController < ApplicationController
35
38
  before_filter :recover_password_disabled?,
36
39
  :only => [ :recover_password, :reset_password ]
37
40
 
41
+ before_filter :set_locale, :only => [ :dashboard ]
42
+
38
43
  def dashboard
39
44
  flash[:notice] = _("There are not defined applications in config/typus/*.yml.") if Typus.applications.empty?
40
45
  end
@@ -117,6 +122,18 @@ class TypusController < ApplicationController
117
122
 
118
123
  private
119
124
 
125
+ def verify_typus_users_table_schema
126
+
127
+ unless Typus.user_class.model_fields.keys.include?(:roles)
128
+ raise "Run `script/generate typus_update_schema_to_01 -f && rake db:migrate` to update database schema."
129
+ end
130
+
131
+ unless Typus.user_class.model_fields.keys.include?(:preferences)
132
+ raise "Run `script/generate typus_update_schema_to_02 -f && rake db:migrate` to update database schema."
133
+ end
134
+
135
+ end
136
+
120
137
  def recover_password_disabled?
121
138
  redirect_to admin_sign_in_path unless Typus::Configuration.options[:recover_password]
122
139
  end
@@ -58,7 +58,7 @@ module Admin::FormHelper
58
58
  html << typus_tree_field(related_fk, related.roots, related_fk)
59
59
  else
60
60
  html << <<-HTML
61
- <li><label for="item_#{attribute}">#{_(related_fk.humanize)}
61
+ <li><label for="item_#{attribute}">#{@resource[:class].human_attribute_name(attribute)}
62
62
  <small>#{link_to _("Add"), { :controller => "admin/#{related.class_name.tableize}", :action => 'new', :back_to => back_to, :selected => related_fk }, :confirm => message.join("\n\n") if @current_user.can_perform?(related, 'create')}</small>
63
63
  </label>
64
64
  #{select :item, related_fk, related.find(:all, :order => related.typus_order_by).collect { |p| [p.typus_name, p.id] }, { :include_blank => true }, { :disabled => attribute_disabled?(attribute) } }</li>
@@ -93,25 +93,27 @@ module Admin::FormHelper
93
93
  HTML
94
94
  end
95
95
 
96
- # WEI: Added image preview.
96
+ # Optimize
97
97
  def typus_file_field(attribute)
98
- attribute_display = attribute.split('_file_name').first
98
+
99
+ attachment = attribute.split('_file_name').first
100
+
99
101
  unless @item.send(attribute).blank?
100
- if attachment = @item.send(attribute_display)
101
- if (@item.send("#{attribute_display}_content_type") =~ /^image\/.+/) and (attachment.styles.member?(:thumbnail) or attachment.styles.member?(:edit))
102
- style = attachment.styles.member?(:thumbnail) ? :thumbnail : :edit
103
- preview = image_tag attachment.url(style)
104
- else
105
- preview = link_to @item.send(attribute), attachment.url
106
- end
107
- end
102
+ item = @item.send(attachment)
103
+ preview = if @item.send("#{attachment}_content_type") =~ /^image\/.+/ && item.styles.member?(:typus_thumbnail)
104
+ image_tag item.url(:typus_thumbnail)
105
+ else
106
+ link_to @item.send(attribute), item.url
107
+ end
108
108
  end
109
+
109
110
  <<-HTML
110
- <li><label for="item_#{attribute}">#{_(attribute_display.humanize)}</label>
111
- #{file_field :item, attribute.split("_file_name").first, :disabled => attribute_disabled?(attribute)}
112
- #{preview}
113
- </li>
111
+ <li><label for="item_#{attribute}">#{_(attachment.humanize)}</label>
112
+ #{file_field :item, attachment, :disabled => attribute_disabled?(attribute)}
113
+ #{preview}
114
+ </li>
114
115
  HTML
116
+
115
117
  end
116
118
 
117
119
  def typus_password_field(attribute)
@@ -235,8 +237,6 @@ module Admin::FormHelper
235
237
  association = reflection.macro
236
238
  foreign_key = reflection.through_reflection ? reflection.primary_key_name.pluralize : reflection.primary_key_name
237
239
 
238
- #WEI: Changed link to use type name rather than field:
239
- #WEI: link_options = { :controller => "admin/#{field}",
240
240
  link_options = { :controller => "admin/#{model_to_relate_as_resource.pluralize}",
241
241
  :action => 'new',
242
242
  :back_to => "#{@back_to}##{field}",
@@ -28,10 +28,17 @@ module Admin::SidebarHelper
28
28
  end
29
29
  end
30
30
 
31
+ # OPTIMIZE
31
32
  case params[:action]
32
33
  when 'show'
33
34
  if @current_user.can_perform?(@resource[:class], 'update')
34
- items << (link_to _("Edit entry"), :action => 'edit', :id => @item.id)
35
+ if @item.typus_user_id?
36
+ if @item.owned_by?(@current_user)
37
+ items << (link_to _("Edit entry"), :action => 'edit', :id => @item.id)
38
+ end
39
+ else
40
+ items << (link_to _("Edit entry"), :action => 'edit', :id => @item.id)
41
+ end
35
42
  end
36
43
  end
37
44
 
@@ -194,16 +201,9 @@ function surfto_#{model_pluralized}(form) {
194
201
 
195
202
  end
196
203
 
197
- ##
198
- # Thinking in update datetime_filters to ...
199
- #
200
- # %w( today last_few_days last_7_days last_30_days )
201
- #
202
- # ... which are the ones used by 'exception_logger'.
203
- #
204
204
  def datetime_filter(request, filter)
205
205
  items = []
206
- %w( today past_7_days this_month this_year ).each do |timeline|
206
+ %w( today last_few_days last_7_days last_30_days ).each do |timeline|
207
207
  switch = request.include?("#{filter}=#{timeline}") ? 'on' : 'off'
208
208
  options = { filter.to_sym => timeline, :page => nil }
209
209
  items << (link_to _(timeline.humanize), params.merge(options), :class => switch)
@@ -31,14 +31,21 @@ module Admin::TableHelper
31
31
  else
32
32
  html << typus_table_string_field(key, item, link_options)
33
33
  end
34
-
35
34
  end
36
35
 
37
- action = item.class.typus_options_for(:default_action_on_item)
38
- content = link_to _(action.capitalize), :controller => "admin/#{item.class.name.tableize}", :action => action, :id => item.id
39
- html << <<-HTML
36
+ action = if item.typus_user_id? && !@current_user.is_root?
37
+ # If there's a typus_user_id column on the table and logged user is not root ...
38
+ item.owned_by?(@current_user) ? 'edit' : 'show'
39
+ elsif !@current_user.can_perform?(model, 'edit')
40
+ 'show'
41
+ else
42
+ item.class.typus_options_for(:default_action_on_item)
43
+ end
44
+
45
+ content = link_to _(action.capitalize), :controller => "admin/#{item.class.name.tableize}", :action => action, :id => item.id
46
+ html << <<-HTML
40
47
  <td width="10px">#{content}</td>
41
- HTML
48
+ HTML
42
49
 
43
50
  ##
44
51
  # This controls the action to perform. If we are on a model list we
@@ -149,10 +156,20 @@ module Admin::TableHelper
149
156
  end
150
157
 
151
158
  def typus_table_file_field(attribute, item, link_options = {})
152
- <<-HTML
159
+
160
+ attachment = attribute.split('_file_name').first
161
+
162
+ if item.send(attachment).styles.member?(:typus_preview) && item.send("#{attachment}_content_type") =~ /^image\/.+/
163
+ <<-HTML
153
164
  <td><a href="##{item.to_dom(:suffix => 'zoom')}" id="#{item.to_dom}" title="Click to preview">#{item.send(attribute)}</a></td>
154
- <div id="#{item.to_dom(:suffix => 'zoom')}">#{item.typus_preview}</div>
155
- HTML
165
+ <div id=\"#{item.to_dom(:suffix => 'zoom')}\">#{item.typus_preview(attachment)}</div>
166
+ HTML
167
+ else
168
+ <<-HTML
169
+ <td>#{link_to item.send(attribute), item.send(attachment).url}</td>
170
+ HTML
171
+ end
172
+
156
173
  end
157
174
 
158
175
  def typus_table_tree_field(attribute, item)
@@ -149,9 +149,15 @@ module TypusHelper
149
149
 
150
150
  message = _("Are you sure you want to sign out and end your session?")
151
151
 
152
+ user_details = if user.can_perform?(Typus::Configuration.options[:user_class_name], 'edit')
153
+ link_to user.name, admin_edit_typus_user_path, :title => "#{user.email} (#{user.role})"
154
+ else
155
+ user.name
156
+ end
157
+
152
158
  <<-HTML
153
159
  <ul>
154
- <li>#{_("Logged as")} #{link_to user.name, admin_edit_typus_user_path, :title => "#{user.email} (#{user.role})"}</li>
160
+ <li>#{_("Logged as")} #{user_details}</li>
155
161
  <li>#{link_to _("Sign out"), admin_sign_out_path, { :confirm => message } }</li>
156
162
  </ul>
157
163
  HTML
@@ -4,6 +4,4 @@
4
4
 
5
5
  <p>If you need help don't hesitate in joining the <%= link_to 'Typus', 'http://groups.google.com/group/typus', :rel => 'external' %> mailing list.</p>
6
6
 
7
- <p>Remember you can replace this sidebar adding <code>_sidebar.html.erb</code> file on <code>app/views/admin/dashboard</code> folder.</p>
8
-
9
- <p>Have a nice day!</p>
7
+ <p>Replace this sidebar dropping a file named <code>_sidebar.html.erb</code> on the <code>app/views/admin/dashboard</code> folder.</p>
@@ -3,9 +3,4 @@
3
3
 
4
4
  <%= url_for admin_reset_password_url(:token => @user.token) %>
5
5
 
6
- <%= _("If you didn't request a password update, you can ignore this message") %>
7
-
8
- <%= _("Have a nice day") %>
9
-
10
- --
11
- <%= Typus::Configuration.options[:app_name] %>
6
+ <%= _("If you didn't request a password update, you can ignore this message") %>
@@ -86,7 +86,6 @@ de:
86
86
  "{{current_user_role}} can't display items": "{{current_user_role}} kann Eintr&auml;ge nicht anzeigen"
87
87
  "You can update your password at": "Sie k7ouml;nnen Ihr Passwort &auml;ndern unter"
88
88
  "If you didn't request a password update, you can ignore this message": "Falls Sie keine Passwort &Auml;derung beantragt haben, k&ouml;nnen Sie diese nachricht ignorieren"
89
- "Have a nice day": "Haben Sie einen guten Tag"
90
89
  "Reset password": "Passwort zur&uuml;cksetzen"
91
90
  "Add new": "Erstellen"
92
91
  "Do you want to cancel it?": "Wollen Sie abbrechen?"
@@ -99,9 +98,9 @@ de:
99
98
  "Change {{attribute}}?": "{{attribute}}&auml;ndern?"
100
99
  "Set language": "Sprache einstellen"
101
100
  "Today": "Heute"
102
- "Past 7 days": "Letzten 7 Tage"
103
- "This month": "Diesen Monat"
104
- "This year": "Dieses Jahr"
101
+ "Last few days": "Letzten Tage"
102
+ "Last 7 days": "Letzten 7 Tage"
103
+ "Last 30 days": "Letzten 30 Tage"
105
104
  "{{model}} filtered by {{filtered_by}}": "{{model}} gefiltert nach {{filtered_by}}"
106
105
  "True": "Richtig"
107
106
  "False": "Falsch"
@@ -86,7 +86,6 @@ es:
86
86
  "{{current_user_role}} can't display items": "{{current_user_role}} no puede mostrar los elementos."
87
87
  "You can update your password at": "Puedes actualizar tu contraseña en"
88
88
  "If you didn't request a password update, you can ignore this message": "Si no pediste una actualización de tu contraseña, puedes ignorar este mensaje."
89
- "Have a nice day": "Que tengas un buen dia."
90
89
  "Reset password": "Cambiar contraseña"
91
90
  "Add new": "Añadir nuevo"
92
91
  "Do you want to cancel it?": "¿Quieres cancelarlo?"
@@ -99,9 +98,9 @@ es:
99
98
  "Change {{attribute}}?": "Change {{attribute}}?"
100
99
  "Set language": "Cambiar idioma"
101
100
  "Today": "Hoy"
102
- "Past 7 days": "Últimos 7 dias"
103
- "This month": "Este mes"
104
- "This year": "Este año"
101
+ "Last few days": "Últimos dias"
102
+ "Last 7 days": "Últimos 7 dias"
103
+ "Last 30 days": "Últimos 30 dias"
105
104
  "{{model}} filtered by {{filtered_by}}": "{{model}} filtrados por {{filtered_by}}"
106
105
  "True": "Verdadero"
107
106
  "False": "Falso"
@@ -90,7 +90,6 @@
90
90
  "{{current_user_role}} can't display items":
91
91
  "You can update your password at":
92
92
  "If you didn't request a password update, you can ignore this message":
93
- "Have a nice day":
94
93
  "Reset password":
95
94
  "Add new":
96
95
  "Do you want to cancel it?":
@@ -103,9 +102,9 @@
103
102
  "Change {{attribute}}?":
104
103
  "Set language":
105
104
  "Today":
106
- "Past 7 days":
107
- "This month":
108
- "This year":
105
+ "Last few days":
106
+ "Last 7 days":
107
+ "Last 30 days":
109
108
  "{{model}} filtered by {{filtered_by}}":
110
109
  "True":
111
110
  "False":
@@ -86,7 +86,6 @@ pt-BR:
86
86
  "{{current_user_role}} can't display items": "{{current_user_role}} não pode mostrar os items."
87
87
  "You can update your password at": "Você pode atualizar sua senha em"
88
88
  "If you didn't request a password update, you can ignore this message": "Se você não pediu uma renovação de senha, por favor ignore esta mensagem."
89
- "Have a nice day": "Tenha um bom dia."
90
89
  "Reset password": "Trocar senha"
91
90
  "Add new": "Adicionar novo"
92
91
  "Do you want to cancel it?": "Quer cancelar?"
@@ -99,9 +98,9 @@ pt-BR:
99
98
  "Change {{attribute}}?": "Mudar {{attribute}}?"
100
99
  "Set language": "Mudar idioma"
101
100
  "Today": "Hoje"
102
- "Past 7 days": "Últimos 7 dias"
103
- "This month": "Este mês"
104
- "This year": "Este ano"
101
+ "Last few days": "Últimos dias"
102
+ "Last 7 days": "Últimos 7 dias"
103
+ "Last 30 days": "Últimos 30 dias"
105
104
  "Created at": "Criado em"
106
105
  "Updated at": "Atualizado em"
107
106
  "{{model}} filtered by {{filtered_by}}": "{{model}} filtrados por {{filtered_by}}"
@@ -26,7 +26,7 @@ ru:
26
26
  "Update entry": "Изменить запись"
27
27
  "New": "Новый"
28
28
  "Show": "Показать"
29
- "Edit": "Editar"
29
+ "Edit":
30
30
  "Login": "Редактировать"
31
31
  "Setup": "Установки"
32
32
  "Create": "Создать"
@@ -86,7 +86,6 @@ ru:
86
86
  "{{current_user_role}} can't display items": "{{current_user_role}} не может отобразить записи"
87
87
  "You can update your password at": "Вы можете установить свой пароль на"
88
88
  "If you didn't request a password update, you can ignore this message": "Если Вы не запрашивали обновление пароля, Вы можете проигнорировать это сообщение."
89
- "Have a nice day": "Добрый день."
90
89
  "Reset password": "Сбросить пароль"
91
90
  "Add new": "Добавить новый"
92
91
  "Do you want to cancel it?": "Вы хотите отменить это?"
@@ -99,9 +98,9 @@ ru:
99
98
  "Change {{attribute}}?": "Изменить {{attribute}}?"
100
99
  "Set language": "Установить язык"
101
100
  "Today": "Сегодня"
102
- "Past 7 days": "Последние 7 дней"
103
- "This month": "Этот месяц"
104
- "This year": "Этот год"
101
+ "Last few days": "Последние дней"
102
+ "Last 7 days": "Последние 7 дней"
103
+ "Last 30 days": "Последние 30 дней"
105
104
  "Created at": "Создано"
106
105
  "Updated at": "Обновлено"
107
106
  "{{model}} filtered by {{filtered_by}}":
@@ -5,7 +5,6 @@
5
5
  Typus::Configuration.options[:app_name] = '<%= application %>'
6
6
  # Typus::Configuration.options[:config_folder] = 'config/typus'
7
7
  # Typus::Configuration.options[:email] = 'admin@example.com'
8
- # Typus::Configuration.options[:image_preview_size] = :typus
9
8
  # Typus::Configuration.options[:locales] = [ [ "English", :en ], [ "Español", :es ] ]
10
9
  # Typus::Configuration.options[:recover_password] = true
11
10
  # Typus::Configuration.options[:root] = 'admin'
@@ -10,6 +10,7 @@ class CreateTypusUsers < ActiveRecord::Migration
10
10
  t.string :token, :null => false
11
11
  t.string :salt, :null => false
12
12
  t.string :crypted_password, :null => false
13
+ t.string :preferences
13
14
  t.timestamps
14
15
  end
15
16
  end
@@ -0,0 +1,11 @@
1
+ class UpdateTypusSchemaTo02 < ActiveRecord::Migration
2
+
3
+ def self.up
4
+ add_column :typus_users, :preferences, :string
5
+ end
6
+
7
+ def self.down
8
+ remove_column :typus_users, :preferences
9
+ end
10
+
11
+ end
@@ -0,0 +1,11 @@
1
+ class TypusUpdateSchemaTo02Generator < Rails::Generator::Base
2
+
3
+ def manifest
4
+
5
+ record do |m|
6
+ m.migration_template 'migration.rb', 'db/migrate', { :migration_file_name => 'update_typus_schema_to_02' }
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -235,9 +235,11 @@ module Typus
235
235
  # Sidebar filters:
236
236
  #
237
237
  # - Booleans: true, false
238
- # - Datetime: today, past_7_days, this_month, this_year
238
+ # - Datetime: today, last_few_days, last_7_days, last_30_days
239
239
  # - Integer & String: *_id and "selectors" (p.ej. category_id)
240
240
  #
241
+ # today last_few_days last_7_days last_30_days
242
+ #
241
243
  case filter_type
242
244
  when :boolean
243
245
  condition = { key => (value == 'true') ? true : false }
@@ -245,9 +247,9 @@ module Typus
245
247
  when :datetime
246
248
  interval = case value
247
249
  when 'today' then Time.new.midnight..Time.new.midnight.tomorrow
248
- when 'past_7_days' then 6.days.ago.midnight..Time.new.midnight.tomorrow
249
- when 'this_month' then Time.new.midnight.last_month..Time.new.midnight.tomorrow
250
- when 'this_year' then Time.new.midnight.last_year..Time.new.midnight.tomorrow
250
+ when 'last_few_days' then 3.days.ago.midnight..Time.new.midnight.tomorrow
251
+ when 'last_7_days' then 6.days.ago.midnight..Time.new.midnight.tomorrow
252
+ when 'last_30_days' then Time.new.midnight.last_month..Time.new.midnight.tomorrow
251
253
  end
252
254
  condition = ["#{key} BETWEEN ? AND ?", interval.first.to_s(:db), interval.last.to_s(:db)]
253
255
  conditions = merge_conditions(conditions, condition)
@@ -266,6 +268,10 @@ module Typus
266
268
 
267
269
  end
268
270
 
271
+ def typus_user_id?
272
+ columns.map { |u| u.name }.include?(Typus.user_fk)
273
+ end
274
+
269
275
  end
270
276
 
271
277
  module InstanceMethods
@@ -299,6 +305,14 @@ module Typus
299
305
  respond_to?(:name) ? name : "#{self.class}##{id}"
300
306
  end
301
307
 
308
+ def typus_user_id?
309
+ self.class.typus_user_id?
310
+ end
311
+
312
+ def owned_by?(user)
313
+ send(Typus.user_fk) == user.id
314
+ end
315
+
302
316
  end
303
317
 
304
318
  end
@@ -27,10 +27,6 @@ module Typus
27
27
 
28
28
  @current_user = Typus.user_class.find(session[:typus_user_id])
29
29
 
30
- unless @current_user.respond_to?(:role)
31
- raise _("Run 'script/generate typus_update_schema_to_01 -f && rake db:migrate' to update database schema.")
32
- end
33
-
34
30
  unless Typus::Configuration.roles.keys.include?(@current_user.role)
35
31
  raise _("Role does no longer exists.")
36
32
  end
data/lib/typus/locale.rb CHANGED
@@ -6,12 +6,22 @@ module Typus
6
6
  if params[:locale]
7
7
  I18n.locale = params[:locale]
8
8
  session[:typus_locale] = params[:locale]
9
- redirect_to :back
9
+ @current_user.update_attributes :preferences => { :locale => params[:locale] }
10
+ redirect_to request.referer || admin_dashboard_path
10
11
  else
11
- I18n.locale = session[:typus_locale] || Typus.default_locale
12
+ begin
13
+ I18n.locale = @current_user.preferences[:locale]
14
+ rescue
15
+ @current_user.update_attributes :preferences => { :locale => params[:locale] }
16
+ retry
17
+ end
12
18
  end
13
19
  end
14
20
 
21
+ def set_default_locale
22
+ I18n.locale = Typus.default_locale
23
+ end
24
+
15
25
  end
16
26
 
17
27
  end
data/lib/typus/preview.rb CHANGED
@@ -2,8 +2,8 @@ module Typus
2
2
 
3
3
  module InstanceMethods
4
4
 
5
- def typus_preview
6
- return "<img src=\"#{asset.url(Typus::Configuration.options[:image_preview_size])}\" />"
5
+ def typus_preview(attachment)
6
+ return "<img src=\"#{send(attachment).url(:typus_preview)}\" />"
7
7
  end
8
8
 
9
9
  end
data/lib/typus/user.rb CHANGED
@@ -25,6 +25,9 @@ module Typus
25
25
  validates_presence_of :role
26
26
 
27
27
  before_save :initialize_salt, :encrypt_password, :initialize_token
28
+ before_create :set_preferences
29
+
30
+ serialize :preferences
28
31
 
29
32
  include InstanceMethods
30
33
 
@@ -96,6 +99,10 @@ module Typus
96
99
 
97
100
  protected
98
101
 
102
+ def set_preferences
103
+ self.preferences = { :locale => Typus.default_locale }
104
+ end
105
+
99
106
  def generate_hash(string)
100
107
  Digest::SHA1.hexdigest(string)
101
108
  end
@@ -109,11 +109,14 @@ class Admin::FormHelperTest < ActiveSupport::TestCase
109
109
  def test_typus_file_field
110
110
 
111
111
  @resource = { :class => Post }
112
+ @item = Post.new
112
113
 
113
114
  output = typus_file_field('asset_file_name')
114
115
  expected = <<-HTML
115
116
  <li><label for="item_asset_file_name">Asset</label>
116
- <input id="item_asset" name="item[asset]" size="30" type="file" /></li>
117
+ <input id="item_asset" name="item[asset]" size="30" type="file" />
118
+
119
+ </li>
117
120
  HTML
118
121
 
119
122
  assert_equal expected, output
@@ -194,9 +194,9 @@ class Admin::SidebarHelperTest < ActiveSupport::TestCase
194
194
  <h2>Created at</h2>
195
195
  <ul>
196
196
  <li><a href="http://test.host/admin/typus_users?created_at=today" class="off">Today</a></li>
197
- <li><a href="http://test.host/admin/typus_users?created_at=past_7_days" class="off">Past 7 days</a></li>
198
- <li><a href="http://test.host/admin/typus_users?created_at=this_month" class="off">This month</a></li>
199
- <li><a href="http://test.host/admin/typus_users?created_at=this_year" class="off">This year</a></li>
197
+ <li><a href="http://test.host/admin/typus_users?created_at=last_few_days" class="off">Last few days</a></li>
198
+ <li><a href="http://test.host/admin/typus_users?created_at=last_7_days" class="off">Last 7 days</a></li>
199
+ <li><a href="http://test.host/admin/typus_users?created_at=last_30_days" class="off">Last 30 days</a></li>
200
200
  </ul>
201
201
  HTML
202
202
  assert_equal expected, output
@@ -207,9 +207,9 @@ class Admin::SidebarHelperTest < ActiveSupport::TestCase
207
207
  <h2>Created at</h2>
208
208
  <ul>
209
209
  <li><a href="http://test.host/admin/typus_users?created_at=today" class="on">Today</a></li>
210
- <li><a href="http://test.host/admin/typus_users?created_at=past_7_days" class="off">Past 7 days</a></li>
211
- <li><a href="http://test.host/admin/typus_users?created_at=this_month" class="off">This month</a></li>
212
- <li><a href="http://test.host/admin/typus_users?created_at=this_year" class="off">This year</a></li>
210
+ <li><a href="http://test.host/admin/typus_users?created_at=last_few_days" class="off">Last few days</a></li>
211
+ <li><a href="http://test.host/admin/typus_users?created_at=last_7_days" class="off">Last 7 days</a></li>
212
+ <li><a href="http://test.host/admin/typus_users?created_at=last_30_days" class="off">Last 30 days</a></li>
213
213
  </ul>
214
214
  HTML
215
215
  assert_equal expected, output
@@ -285,33 +285,32 @@ class ActiveRecordTest < ActiveSupport::TestCase
285
285
  params = { :created_at => 'today' }
286
286
  assert_equal expected, TypusUser.build_conditions(params).first
287
287
 
288
-
289
288
  expected = case ENV['DB']
290
289
  when /postgresql/
291
- "(created_at BETWEEN E'#{6.days.ago.midnight.to_s(:db)}' AND E'#{Time.new.midnight.tomorrow.to_s(:db)}')"
290
+ "(created_at BETWEEN E'#{3.days.ago.midnight.to_s(:db)}' AND E'#{Time.new.midnight.tomorrow.to_s(:db)}')"
292
291
  else
293
- "(created_at BETWEEN '#{6.days.ago.midnight.to_s(:db)}' AND '#{Time.new.midnight.tomorrow.to_s(:db)}')"
292
+ "(created_at BETWEEN '#{3.days.ago.midnight.to_s(:db)}' AND '#{Time.new.midnight.tomorrow.to_s(:db)}')"
294
293
  end
295
- params = { :created_at => 'past_7_days' }
294
+ params = { :created_at => 'last_few_days' }
296
295
  assert_equal expected, TypusUser.build_conditions(params).first
297
296
 
298
-
299
297
  expected = case ENV['DB']
300
298
  when /postgresql/
301
- "(created_at BETWEEN E'#{Time.new.midnight.last_month.to_s(:db)}' AND E'#{Time.new.midnight.tomorrow.to_s(:db)}')"
299
+ "(created_at BETWEEN E'#{6.days.ago.midnight.to_s(:db)}' AND E'#{Time.new.midnight.tomorrow.to_s(:db)}')"
302
300
  else
303
- "(created_at BETWEEN '#{Time.new.midnight.last_month.to_s(:db)}' AND '#{Time.new.midnight.tomorrow.to_s(:db)}')"
301
+ "(created_at BETWEEN '#{6.days.ago.midnight.to_s(:db)}' AND '#{Time.new.midnight.tomorrow.to_s(:db)}')"
304
302
  end
305
- params = { :created_at => 'this_month' }
303
+ params = { :created_at => 'last_7_days' }
306
304
  assert_equal expected, TypusUser.build_conditions(params).first
307
305
 
306
+
308
307
  expected = case ENV['DB']
309
308
  when /postgresql/
310
- "(created_at BETWEEN E'#{Time.new.midnight.last_year.to_s(:db)}' AND E'#{Time.new.midnight.tomorrow.to_s(:db)}')"
309
+ "(created_at BETWEEN E'#{Time.new.midnight.last_month.to_s(:db)}' AND E'#{Time.new.midnight.tomorrow.to_s(:db)}')"
311
310
  else
312
- "(created_at BETWEEN '#{Time.new.midnight.last_year.to_s(:db)}' AND '#{Time.new.midnight.tomorrow.to_s(:db)}')"
311
+ "(created_at BETWEEN '#{Time.new.midnight.last_month.to_s(:db)}' AND '#{Time.new.midnight.tomorrow.to_s(:db)}')"
313
312
  end
314
- params = { :created_at => 'this_year' }
313
+ params = { :created_at => 'last_30_days' }
315
314
  assert_equal expected, TypusUser.build_conditions(params).first
316
315
 
317
316
  end
@@ -12,7 +12,6 @@ class ConfigurationTest < ActiveSupport::TestCase
12
12
  assert_equal 'Typus', Typus::Configuration.options[:app_name]
13
13
  assert_equal 'vendor/plugins/typus/test/config/working', Typus::Configuration.options[:config_folder]
14
14
  assert_equal 'admin@example.com', Typus::Configuration.options[:email]
15
- assert_equal 'typus', Typus::Configuration.options[:image_preview_size]
16
15
  assert_equal [ [ "English", :en] ], Typus::Configuration.options[:locales]
17
16
  assert_equal false, Typus::Configuration.options[:recover_password]
18
17
  assert_equal 'admin', Typus::Configuration.options[:root]
data/test/models.rb CHANGED
@@ -48,4 +48,7 @@ class Post < ActiveRecord::Base
48
48
  'plugin'
49
49
  end
50
50
 
51
+ def asset_file_name
52
+ end
53
+
51
54
  end
@@ -26,8 +26,4 @@ class TypusMailerTest < ActiveSupport::TestCase
26
26
  assert_match expected, @response.body
27
27
  end
28
28
 
29
- def test_should_check_email_contains_signature
30
- assert_match /--\n#{Typus::Configuration.options[:app_name]}/, @response.body
31
- end
32
-
33
29
  end
data/typus.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{typus}
8
- s.version = "0.9.22"
8
+ s.version = "0.9.23"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Francesc Esplugas"]
12
- s.date = %q{2009-08-26}
12
+ s.date = %q{2009-09-03}
13
13
  s.description = %q{Effortless backend interface for Ruby on Rails applications. (Admin scaffold generator.)}
14
14
  s.email = %q{francesc@intraducibles.com}
15
15
  s.extra_rdoc_files = [
@@ -94,6 +94,8 @@ Gem::Specification.new do |s|
94
94
  "generators/typus_update_schema_to_01/templates/config/typus.yml",
95
95
  "generators/typus_update_schema_to_01/templates/migration.rb",
96
96
  "generators/typus_update_schema_to_01/typus_update_schema_to_01_generator.rb",
97
+ "generators/typus_update_schema_to_02/templates/migration.rb",
98
+ "generators/typus_update_schema_to_02/typus_update_schema_to_02_generator.rb",
97
99
  "lib/typus.rb",
98
100
  "lib/typus/active_record.rb",
99
101
  "lib/typus/authentication.rb",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.22
4
+ version: 0.9.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Francesc Esplugas
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-26 00:00:00 +02:00
12
+ date: 2009-09-03 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -100,6 +100,8 @@ files:
100
100
  - generators/typus_update_schema_to_01/templates/config/typus.yml
101
101
  - generators/typus_update_schema_to_01/templates/migration.rb
102
102
  - generators/typus_update_schema_to_01/typus_update_schema_to_01_generator.rb
103
+ - generators/typus_update_schema_to_02/templates/migration.rb
104
+ - generators/typus_update_schema_to_02/typus_update_schema_to_02_generator.rb
103
105
  - lib/typus.rb
104
106
  - lib/typus/active_record.rb
105
107
  - lib/typus/authentication.rb