radiant-reader-extension 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/README.md +89 -0
- data/Rakefile +140 -0
- data/VERSION +1 -0
- data/app/controllers/admin/messages_controller.rb +20 -0
- data/app/controllers/admin/reader_settings_controller.rb +92 -0
- data/app/controllers/admin/readers_controller.rb +28 -0
- data/app/controllers/password_resets_controller.rb +64 -0
- data/app/controllers/reader_action_controller.rb +84 -0
- data/app/controllers/reader_activations_controller.rb +60 -0
- data/app/controllers/reader_sessions_controller.rb +56 -0
- data/app/controllers/readers_controller.rb +131 -0
- data/app/helpers/admin/reader_settings_helper.rb +36 -0
- data/app/models/message.rb +108 -0
- data/app/models/message_function.rb +37 -0
- data/app/models/message_reader.rb +13 -0
- data/app/models/reader.rb +146 -0
- data/app/models/reader_notifier.rb +34 -0
- data/app/models/reader_session.rb +3 -0
- data/app/views/admin/messages/_form.html.haml +29 -0
- data/app/views/admin/messages/_help.html.haml +41 -0
- data/app/views/admin/messages/_message_description.html.haml +3 -0
- data/app/views/admin/messages/edit.html.haml +16 -0
- data/app/views/admin/messages/new.html.haml +16 -0
- data/app/views/admin/reader_settings/_setting.html.haml +24 -0
- data/app/views/admin/reader_settings/edit.html.haml +10 -0
- data/app/views/admin/reader_settings/index.html.haml +35 -0
- data/app/views/admin/reader_settings/show.html.haml +1 -0
- data/app/views/admin/readers/_avatar.html.haml +3 -0
- data/app/views/admin/readers/_form.html.haml +50 -0
- data/app/views/admin/readers/_list_head.html.haml +9 -0
- data/app/views/admin/readers/_listed.html.haml +22 -0
- data/app/views/admin/readers/_password_fields.html.haml +18 -0
- data/app/views/admin/readers/edit.html.haml +8 -0
- data/app/views/admin/readers/index.html.haml +17 -0
- data/app/views/admin/readers/new.html.haml +7 -0
- data/app/views/admin/readers/remove.html.haml +18 -0
- data/app/views/admin/sites/_choose_reader_layout.html.haml +7 -0
- data/app/views/password_resets/create.html.haml +13 -0
- data/app/views/password_resets/edit.html.haml +71 -0
- data/app/views/password_resets/new.html.haml +31 -0
- data/app/views/reader_activations/_activation_required.html.haml +34 -0
- data/app/views/reader_activations/_on_activation.html.haml +4 -0
- data/app/views/reader_activations/show.html.haml +41 -0
- data/app/views/reader_notifier/message.html.haml +1 -0
- data/app/views/reader_sessions/_login_form.html.haml +59 -0
- data/app/views/reader_sessions/new.html.haml +38 -0
- data/app/views/readers/_contributions.html.haml +2 -0
- data/app/views/readers/_controls.html.haml +25 -0
- data/app/views/readers/_extra_controls.html.haml +0 -0
- data/app/views/readers/_flasher.html.haml +6 -0
- data/app/views/readers/_form.html.haml +73 -0
- data/app/views/readers/create.html.haml +28 -0
- data/app/views/readers/edit.html.haml +47 -0
- data/app/views/readers/index.html.haml +16 -0
- data/app/views/readers/login.html.haml +15 -0
- data/app/views/readers/new.html.haml +41 -0
- data/app/views/readers/permission_denied.html.haml +23 -0
- data/app/views/readers/show.html.haml +35 -0
- data/app/views/wrappers/_field_errors.html.haml +5 -0
- data/config/routes.rb +22 -0
- data/config/settings.rb +9 -0
- data/db/migrate/001_create_readers.rb +31 -0
- data/db/migrate/002_extend_sites.rb +17 -0
- data/db/migrate/003_reader_honorifics.rb +12 -0
- data/db/migrate/004_user_readers.rb +11 -0
- data/db/migrate/005_last_login.rb +15 -0
- data/db/migrate/007_adapt_for_authlogic.rb +27 -0
- data/db/migrate/20090921125653_reader_messages.rb +27 -0
- data/db/migrate/20090924164413_functional_messages.rb +9 -0
- data/db/migrate/20090925081225_standard_messages.rb +106 -0
- data/db/migrate/20091006102438_message_visibility.rb +9 -0
- data/db/migrate/20091010083503_registration_config.rb +10 -0
- data/db/migrate/20091019124021_message_functions.rb +9 -0
- data/db/migrate/20091020133533_forenames.rb +9 -0
- data/db/migrate/20091020135152_contacts.rb +23 -0
- data/db/migrate/20091111090819_ensure_functional_messages_visible.rb +9 -0
- data/db/migrate/20091119092936_messages_have_layout.rb +9 -0
- data/db/migrate/20100922152338_lock_versions.rb +9 -0
- data/db/migrate/20100927095703_default_settings.rb +14 -0
- data/db/migrate/20101004074945_unlock_version.rb +9 -0
- data/lib/config_extensions.rb +5 -0
- data/lib/controller_extensions.rb +77 -0
- data/lib/reader_admin_ui.rb +64 -0
- data/lib/reader_helper.rb +36 -0
- data/lib/reader_site.rb +10 -0
- data/lib/reader_tags.rb +297 -0
- data/lib/rfc822.rb +29 -0
- data/lib/tasks/reader_extension_tasks.rake +28 -0
- data/pkg/radiant-reader-extension-0.9.0.gem +0 -0
- data/public/images/admin/chk_off.png +0 -0
- data/public/images/admin/chk_on.png +0 -0
- data/public/images/admin/new-message.png +0 -0
- data/public/images/admin/new-reader.png +0 -0
- data/public/javascripts/admin/messages.js +13 -0
- data/public/stylesheets/sass/admin/reader.sass +95 -0
- data/radiant-reader-extension.gemspec +184 -0
- data/reader_extension.rb +55 -0
- data/spec/controllers/admin/messages_controller_spec.rb +38 -0
- data/spec/controllers/admin/readers_controller_spec.rb +14 -0
- data/spec/controllers/password_resets_controller_spec.rb +140 -0
- data/spec/controllers/reader_activations_controller_spec.rb +45 -0
- data/spec/controllers/readers_controller_spec.rb +193 -0
- data/spec/datasets/messages_dataset.rb +49 -0
- data/spec/datasets/reader_layouts_dataset.rb +26 -0
- data/spec/datasets/reader_sites_dataset.rb +10 -0
- data/spec/datasets/readers_dataset.rb +51 -0
- data/spec/lib/reader_admin_ui_spec.rb +35 -0
- data/spec/lib/reader_site_spec.rb +18 -0
- data/spec/matchers/reader_login_system_matcher.rb +35 -0
- data/spec/models/message_spec.rb +109 -0
- data/spec/models/reader_notifier_spec.rb +34 -0
- data/spec/models/reader_spec.rb +155 -0
- data/spec/spec.opts +5 -0
- data/spec/spec_helper.rb +48 -0
- metadata +267 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
class MessageFunction
|
2
|
+
attr_accessor :name, :description
|
3
|
+
|
4
|
+
def initialize(name, description='')
|
5
|
+
@name = name
|
6
|
+
@description = description
|
7
|
+
end
|
8
|
+
|
9
|
+
def symbol
|
10
|
+
@name.to_s.downcase.intern
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
@name
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.[](value)
|
18
|
+
return if value.blank?
|
19
|
+
@@functions.find { |function| function.symbol == value.to_s.downcase.intern }
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.add(name, description='')
|
23
|
+
@@functions.push(MessageFunction.new(name, description)) unless MessageFunction[name]
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.find_all
|
27
|
+
@@functions.dup
|
28
|
+
end
|
29
|
+
|
30
|
+
@@functions = [
|
31
|
+
MessageFunction.new('welcome', 'Welcome'),
|
32
|
+
MessageFunction.new('invitation', 'Invitation' ),
|
33
|
+
MessageFunction.new('password_reset', 'Password instructions'),
|
34
|
+
MessageFunction.new('activation', 'Activation instructions')
|
35
|
+
]
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class MessageReader < ActiveRecord::Base
|
2
|
+
belongs_to :message
|
3
|
+
belongs_to :reader
|
4
|
+
|
5
|
+
named_scope :undelivered, {
|
6
|
+
:conditions => "sent_at IS NULL OR sent_at > NOW()"
|
7
|
+
}
|
8
|
+
|
9
|
+
named_scope :delivered, {
|
10
|
+
:conditions => "sent_at IS NOT NULL and sent_at <= NOW()"
|
11
|
+
}
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'authlogic'
|
2
|
+
require 'digest/sha1'
|
3
|
+
require 'gravtastic'
|
4
|
+
|
5
|
+
class Reader < ActiveRecord::Base
|
6
|
+
@@user_columns = [:name, :email, :login, :created_at, :password, :notes]
|
7
|
+
cattr_accessor :user_columns
|
8
|
+
cattr_accessor :current
|
9
|
+
default_scope :order => 'name ASC'
|
10
|
+
|
11
|
+
is_site_scoped if respond_to? :is_site_scoped
|
12
|
+
|
13
|
+
is_gravtastic :with => :email, :rating => 'PG', :size => 48
|
14
|
+
acts_as_authentic do |config|
|
15
|
+
config.validations_scope = :site_id if defined? Site
|
16
|
+
config.transition_from_restful_authentication = true
|
17
|
+
config.validate_email_field = false
|
18
|
+
config.validate_login_field = false
|
19
|
+
end
|
20
|
+
|
21
|
+
belongs_to :user
|
22
|
+
belongs_to :created_by, :class_name => 'User'
|
23
|
+
belongs_to :updated_by, :class_name => 'User'
|
24
|
+
|
25
|
+
has_many :message_readers
|
26
|
+
has_many :messages, :through => :message_readers
|
27
|
+
|
28
|
+
attr_accessor :current_password # used for authentication on update
|
29
|
+
|
30
|
+
before_save :set_login
|
31
|
+
before_update :update_user
|
32
|
+
|
33
|
+
validates_presence_of :name, :email, :message => 'is required'
|
34
|
+
validates_uniqueness_of :login, :message => "is already in use here"
|
35
|
+
validate :email_must_not_be_in_use
|
36
|
+
|
37
|
+
include RFC822
|
38
|
+
validates_format_of :email, :with => RFC822_valid, :message => 'appears not to be an email address'
|
39
|
+
validates_length_of :name, :maximum => 100, :allow_nil => true
|
40
|
+
|
41
|
+
named_scope :any
|
42
|
+
named_scope :active, :conditions => "activated_at IS NOT NULL"
|
43
|
+
named_scope :inactive, :conditions => "activated_at IS NULL"
|
44
|
+
|
45
|
+
def forename
|
46
|
+
read_attribute(:forename) || name.split(/\s/).first
|
47
|
+
end
|
48
|
+
|
49
|
+
def activate!
|
50
|
+
self.activated_at = Time.now.utc
|
51
|
+
self.save!
|
52
|
+
self.send_welcome_message
|
53
|
+
end
|
54
|
+
|
55
|
+
def activated?
|
56
|
+
!inactive?
|
57
|
+
end
|
58
|
+
|
59
|
+
def inactive?
|
60
|
+
self.activated_at.nil?
|
61
|
+
end
|
62
|
+
|
63
|
+
def disable_perishable_token_maintenance?
|
64
|
+
inactive? && !new_record?
|
65
|
+
end
|
66
|
+
|
67
|
+
[:activation, :invitation, :welcome, :password_reset].each do |function|
|
68
|
+
define_method("send_#{function}_message".intern) {
|
69
|
+
send_functional_message(function)
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
def send_functional_message(function)
|
74
|
+
reset_perishable_token!
|
75
|
+
message = Message.functional(function)
|
76
|
+
raise StandardError, "No #{function} message could be found" unless message
|
77
|
+
message.deliver_to(self)
|
78
|
+
end
|
79
|
+
|
80
|
+
def generate_email_field_name
|
81
|
+
generate_password(32)
|
82
|
+
end
|
83
|
+
|
84
|
+
def generate_password(length=12)
|
85
|
+
chars = ("a".."z").to_a + ("A".."Z").to_a + ("1".."9").to_a
|
86
|
+
Array.new(length, '').collect{chars[rand(chars.size)]}.join
|
87
|
+
end
|
88
|
+
|
89
|
+
def is_user?
|
90
|
+
self.user ? true : false
|
91
|
+
end
|
92
|
+
|
93
|
+
def is_admin?
|
94
|
+
self.user && self.user.admin? ? true : false
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.find_or_create_for_user(user)
|
98
|
+
if user.respond_to?(:site) && site = Page.current_site
|
99
|
+
reader = self.find_or_create_by_site_id_and_user_id(site.id, user.id)
|
100
|
+
else
|
101
|
+
reader = self.find_or_create_by_user_id(user.id)
|
102
|
+
end
|
103
|
+
if reader.new_record?
|
104
|
+
user_columns.each { |att| reader.send("#{att.to_s}=", user.send(att)) }
|
105
|
+
reader.crypted_password = user.password
|
106
|
+
reader.password_salt = user.salt
|
107
|
+
reader.activated_at = reader.created_at
|
108
|
+
reader.save(false)
|
109
|
+
end
|
110
|
+
reader
|
111
|
+
end
|
112
|
+
|
113
|
+
protected
|
114
|
+
|
115
|
+
def set_login
|
116
|
+
self.login = self.email if self.login.blank?
|
117
|
+
end
|
118
|
+
|
119
|
+
private
|
120
|
+
|
121
|
+
def email_must_not_be_in_use
|
122
|
+
reader = Reader.find_by_email(self.email) # the finds will be site-scoped if appropriate
|
123
|
+
user = User.find_by_email(self.email)
|
124
|
+
if user && user != self.user
|
125
|
+
errors.add(:email, "belongs to an author here")
|
126
|
+
elsif reader && reader != self
|
127
|
+
errors.add(:email, "is already registered here")
|
128
|
+
else
|
129
|
+
return true
|
130
|
+
end
|
131
|
+
return false
|
132
|
+
end
|
133
|
+
|
134
|
+
def validate_length_of_password?
|
135
|
+
new_record? or not password.to_s.empty?
|
136
|
+
end
|
137
|
+
|
138
|
+
def update_user
|
139
|
+
if self.user
|
140
|
+
user_columns.each { |att| self.user.send("#{att.to_s}=", send(att)) if send("#{att.to_s}_changed?") }
|
141
|
+
self.user.password_confirmation = password_confirmation if password_changed?
|
142
|
+
self.user.save! if self.user.changed?
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class ReaderNotifier < ActionMailer::Base
|
2
|
+
|
3
|
+
# this sets a default that will be overridden by the layout association of each message as it is sent out
|
4
|
+
radiant_layout "email"
|
5
|
+
|
6
|
+
def message(reader, message, sender=nil)
|
7
|
+
site = reader.site if reader.respond_to?(:site)
|
8
|
+
prefix = site ? site.abbreviation : Radiant::Config['site.mail_prefix']
|
9
|
+
host = site ? site.base_domain : Radiant::Config['site.url'] || 'www.example.com'
|
10
|
+
default_url_options[:host] = host
|
11
|
+
sender ||= message.created_by
|
12
|
+
|
13
|
+
message_layout(message.layout) if message.layout
|
14
|
+
content_type("text/html")
|
15
|
+
subject (prefix || '') + message.subject
|
16
|
+
recipients(reader.email)
|
17
|
+
from message.created_by.email
|
18
|
+
subject message.subject
|
19
|
+
sent_on(Time.now)
|
20
|
+
|
21
|
+
body({
|
22
|
+
:host => host,
|
23
|
+
:title => message.subject,
|
24
|
+
:message => message.filtered_body,
|
25
|
+
:sender => sender,
|
26
|
+
:reader => reader,
|
27
|
+
:site => site || {
|
28
|
+
:name => Radiant::Config['site.name'],
|
29
|
+
:url => Radiant::Config['site.url']
|
30
|
+
}
|
31
|
+
})
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
= render_region :form_top
|
2
|
+
|
3
|
+
.form-area
|
4
|
+
- render_region :form do |formpart|
|
5
|
+
- formpart.edit_subject do
|
6
|
+
%p.title
|
7
|
+
= form.label :subject, "Message Subject"
|
8
|
+
= form.text_field :subject, :class => 'textbox', :maxlength => 255
|
9
|
+
- if @message.new_record?
|
10
|
+
= form.hidden_field :function_id
|
11
|
+
|
12
|
+
- formpart.edit_body do
|
13
|
+
%div.body
|
14
|
+
%p
|
15
|
+
%span.filter
|
16
|
+
= form.label :filter_id, "Filter:"
|
17
|
+
= form.select :filter_id, TextFilter.descendants.map { |tf| tf.filter_name }.sort, :id => 'message_filter', :include_blank => true
|
18
|
+
= form.label :body, "Message Body"
|
19
|
+
= form.text_area :body, :class => 'textarea', :style => 'width: 100%'
|
20
|
+
|
21
|
+
- render_region :form_bottom do |form_bottom|
|
22
|
+
- form_bottom.edit_timestamp do
|
23
|
+
= updated_stamp @message
|
24
|
+
- form_bottom.edit_buttons do
|
25
|
+
%p.buttons
|
26
|
+
= save_model_button(@message)
|
27
|
+
= save_model_and_continue_editing_button(@message)
|
28
|
+
or
|
29
|
+
= link_to "cancel", admin_messages_url
|
@@ -0,0 +1,41 @@
|
|
1
|
+
%p
|
2
|
+
You can use tags, snippets and assets in your messages just as you would in a page.
|
3
|
+
There are also a few simple mailmerge tags that you can use to place information about the recipient (or yourself) in each message as it is sent out.
|
4
|
+
Most are self-explanatory:
|
5
|
+
%ul.help
|
6
|
+
%li
|
7
|
+
%code <r:sender:name />
|
8
|
+
is the name configured in
|
9
|
+
%em
|
10
|
+
reader.mail_from_name:
|
11
|
+
currently
|
12
|
+
%strong
|
13
|
+
= "'#{Radiant::Config['reader.mail_from_name']}'."
|
14
|
+
%li
|
15
|
+
%code <r:sender:email />
|
16
|
+
is the address configured in
|
17
|
+
%em
|
18
|
+
reader.mail_from_address:
|
19
|
+
currently
|
20
|
+
%strong
|
21
|
+
= "'#{Radiant::Config['reader.mail_from_address']}'."
|
22
|
+
%li
|
23
|
+
%code <r:recipient:name />
|
24
|
+
%li
|
25
|
+
%code <r:recipient:email />
|
26
|
+
%li
|
27
|
+
%code <r:recipient:login />
|
28
|
+
%li
|
29
|
+
%code <r:recipient:password />
|
30
|
+
only works in welcome messages: after first login we forget the unencrypted password
|
31
|
+
%li
|
32
|
+
%code <r:recipient:url />
|
33
|
+
is the address of the page about this person
|
34
|
+
%li
|
35
|
+
%code <r:recipient:edit_url />
|
36
|
+
is the address of the preferences form
|
37
|
+
%li
|
38
|
+
%code <r:recipient:activation_url />
|
39
|
+
is the address that will activate a newly-created account
|
40
|
+
%li
|
41
|
+
%code <r:recipient:description />
|
@@ -0,0 +1,16 @@
|
|
1
|
+
- include_stylesheet('admin/reader')
|
2
|
+
|
3
|
+
= render_region :top
|
4
|
+
- render_region :main do |main|
|
5
|
+
|
6
|
+
- main.edit_header do
|
7
|
+
%h1
|
8
|
+
Edit
|
9
|
+
= render :partial => 'message_description'
|
10
|
+
|
11
|
+
- main.edit_form do
|
12
|
+
- form_for :message, @message, :url => admin_message_url(@message), :html => {:id => 'message_form', :method => 'put'} do |f|
|
13
|
+
= render :partial => 'form', :object => f
|
14
|
+
|
15
|
+
- main.edit_footer do
|
16
|
+
= render :partial => 'help'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
- include_stylesheet('admin/reader')
|
2
|
+
|
3
|
+
= render_region :top
|
4
|
+
- render_region :main do |main|
|
5
|
+
|
6
|
+
- main.edit_header do
|
7
|
+
%h1
|
8
|
+
Create
|
9
|
+
= render :partial => 'message_description'
|
10
|
+
|
11
|
+
- main.edit_form do
|
12
|
+
- form_for :message, @message, :url => admin_messages_url, :html => {:id => 'message_form', :method => 'post'} do |f|
|
13
|
+
= render :partial => 'form', :object => f
|
14
|
+
|
15
|
+
- main.edit_footer do
|
16
|
+
= render :partial => 'help'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
- if setting || key
|
2
|
+
- setting ||= Radiant::Config.find_by_key(key)
|
3
|
+
- if setting
|
4
|
+
- label ||= setting.key
|
5
|
+
- notes ||= nil
|
6
|
+
- domkey = setting.key.gsub('?', '_')
|
7
|
+
- containerid = "set_#{domkey}"
|
8
|
+
|
9
|
+
- if setting.key.ends_with?("?")
|
10
|
+
%p.ruled
|
11
|
+
%span{:id => containerid, :class => "checkbox #{setting.value.to_s}"}
|
12
|
+
= checkbox_for_setting(setting, label)
|
13
|
+
|
14
|
+
- else
|
15
|
+
%p.ruled
|
16
|
+
%label= label
|
17
|
+
%span.inplace{:id => containerid}
|
18
|
+
= editable_setting(setting)
|
19
|
+
|
20
|
+
- else
|
21
|
+
%p.haserror
|
22
|
+
%strong
|
23
|
+
= key
|
24
|
+
is not defined.
|
@@ -0,0 +1,10 @@
|
|
1
|
+
- domkey = @setting.key.gsub('?', '_')
|
2
|
+
- domid = "set_#{domkey}"
|
3
|
+
|
4
|
+
- remote_form_for @setting, :url => admin_reader_setting_path(@setting), :update => domid, :loading => "$('#{domid}').addClassName('waiting');", :loaded => "$('#{domid}').removeClassName('waiting');", :html => { :method => :put } do |f|
|
5
|
+
- if @setting.key =~ /\.layout$/
|
6
|
+
= f.select :value, Layout.all.collect {|l| [ l.name, l.name ] }
|
7
|
+
- else
|
8
|
+
= f.text_field :value
|
9
|
+
= f.submit 'save'
|
10
|
+
= link_to_remote 'cancel', {:url => admin_reader_setting_url(@setting.id), :method => 'get', :update => domid, :loading => "$('#{domid}').addClassName('waiting');", :loaded => "$('#{domid}').removeClassName('waiting');"}, {:class => 'cancel'}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
- body_classes << "reversed"
|
2
|
+
- include_stylesheet('admin/reader')
|
3
|
+
|
4
|
+
#reader_settings.box
|
5
|
+
%h3 Reader administration
|
6
|
+
|
7
|
+
- render_region :settings do |settings|
|
8
|
+
- settings.registration do
|
9
|
+
= render :partial => 'setting', :locals => {:key => 'reader.allow_registration?', :label => 'Allow visitors to register'}
|
10
|
+
= render :partial => 'setting', :locals => {:key => 'reader.require_confirmation?', :label => 'Require email confirmation'}
|
11
|
+
= render :partial => 'setting', :locals => {:key => 'reader.layout', :label => "Admin layout", :notes => "The radiant layout used to present reader-administration pages"}
|
12
|
+
|
13
|
+
- settings.site do
|
14
|
+
= render :partial => 'setting', :locals => {:key => 'site.title', :label => "Site title", :notes => "This is the name by which forms and emails refer to your site"}
|
15
|
+
= render :partial => 'setting', :locals => {:key => 'site.url', :label => "Site url", :notes => "This is the address we use to build links in emails"}
|
16
|
+
|
17
|
+
- settings.sender do
|
18
|
+
= render :partial => 'setting', :locals => {:key => 'reader.mail_from_name', :label => "Email sender", :notes => "This is the name that automatic emails seem to come from"}
|
19
|
+
= render :partial => 'setting', :locals => {:key => 'reader.mail_from_address', :label => "Email address", :notes => "This is the address that automatic emails seem to come from"}
|
20
|
+
|
21
|
+
#message_settings.box
|
22
|
+
%h3 Administrative messages
|
23
|
+
|
24
|
+
- render_region :messages do |messages|
|
25
|
+
- messages.administration do
|
26
|
+
- MessageFunction.find_all.each do |func|
|
27
|
+
- message = Message.for_function(func).shift
|
28
|
+
%p.ruled
|
29
|
+
%label= func.description
|
30
|
+
- if message
|
31
|
+
= link_to message.subject, edit_admin_message_url(message)
|
32
|
+
- else
|
33
|
+
= link_to image('plus') + " create message", new_admin_message_url(:function => func), :class => 'create'
|
34
|
+
|
35
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
= editable_setting(@setting)
|
@@ -0,0 +1,50 @@
|
|
1
|
+
- form_for [:admin, @reader] do |f|
|
2
|
+
= hidden_field "reader", "lock_version"
|
3
|
+
|
4
|
+
= render :partial => 'avatar' unless @reader.new_record?
|
5
|
+
|
6
|
+
= render_region :form_top, :locals => {:f => f}
|
7
|
+
|
8
|
+
- render_region :form, :locals => {:f => f} do |form|
|
9
|
+
- form.edit_name do
|
10
|
+
%p
|
11
|
+
= f.label :name, t('name')
|
12
|
+
= f.text_field :name, :class => "textbox activate", :size => 32, :maxlength => 100
|
13
|
+
|
14
|
+
- form.edit_email do
|
15
|
+
%p
|
16
|
+
= f.label :email, t('email_address') , :class => "optional"
|
17
|
+
= f.text_field "email", :class => 'textbox', :size => 32, :maxlength => 255
|
18
|
+
|
19
|
+
- form.edit_username do
|
20
|
+
%p
|
21
|
+
= f.label :login, t('username') , :class => "optional"
|
22
|
+
= f.text_field "login", :class => 'textbox', :size => 32, :maxlength => 255
|
23
|
+
|
24
|
+
- form.edit_readername do
|
25
|
+
%p
|
26
|
+
= f.label :login, t('readername')
|
27
|
+
= f.text_field "login", :class => "textbox", :size => 32, :maxlength => 40
|
28
|
+
|
29
|
+
- form.edit_password do
|
30
|
+
= render "password_fields", :f => f
|
31
|
+
|
32
|
+
- form.edit_description do
|
33
|
+
%p
|
34
|
+
= f.label :description, "Self-description", :class => "optional"
|
35
|
+
~ f.text_area "description", :size => "53x8", :class => "textarea"
|
36
|
+
|
37
|
+
- form.edit_notes do
|
38
|
+
%p
|
39
|
+
= f.label :notes, t('notes'), :class => "optional"
|
40
|
+
~ f.text_area "notes", :size => "53x4", :class => "textarea"
|
41
|
+
|
42
|
+
- render_region :form_bottom, :locals => {:f => f} do |form_bottom|
|
43
|
+
- form_bottom.edit_buttons do
|
44
|
+
%p.buttons
|
45
|
+
= save_model_button(@reader)
|
46
|
+
= save_model_and_continue_editing_button(@reader)
|
47
|
+
= t('or')
|
48
|
+
= link_to t('cancel'), admin_readers_path
|
49
|
+
- form_bottom.edit_timestamp do
|
50
|
+
= updated_stamp @reader
|