parlement 0.1
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/CHANGES +709 -0
- data/COPYING +223 -0
- data/README +20 -0
- data/Rakefile +136 -0
- data/app/controllers/account_controller.rb +181 -0
- data/app/controllers/application.rb +30 -0
- data/app/controllers/elt_controller.rb +83 -0
- data/app/helpers/account_helper.rb +2 -0
- data/app/helpers/application_helper.rb +4 -0
- data/app/helpers/elt_helper.rb +37 -0
- data/app/helpers/live_tree.rb +238 -0
- data/app/helpers/mailman.rb +96 -0
- data/app/models/attachment.rb +4 -0
- data/app/models/elt.rb +17 -0
- data/app/models/mail.rb +4 -0
- data/app/models/notifier.rb +13 -0
- data/app/models/person.rb +9 -0
- data/app/models/user.rb +7 -0
- data/app/models/user_notify.rb +75 -0
- data/app/views/account/_help.rhtml +23 -0
- data/app/views/account/_login.rhtml +57 -0
- data/app/views/account/_show.rhtml +31 -0
- data/app/views/account/logout.rhtml +10 -0
- data/app/views/account/signup.rhtml +17 -0
- data/app/views/account/welcome.rhtml +13 -0
- data/app/views/elt/_elt.rhtml +105 -0
- data/app/views/elt/_form.rhtml +31 -0
- data/app/views/elt/_list.rhtml +28 -0
- data/app/views/elt/new.rhtml +102 -0
- data/app/views/elt/rss.rxml +31 -0
- data/app/views/elt/show.rhtml +46 -0
- data/app/views/elt/show_tree.rhtml +8 -0
- data/app/views/layouts/scaffold.rhtml +13 -0
- data/app/views/layouts/top.rhtml +45 -0
- data/app/views/notifier/changeEmail.rhtml +10 -0
- data/config/boot.rb +17 -0
- data/config/database.yml +82 -0
- data/config/environment.rb +92 -0
- data/config/environments/development.rb +17 -0
- data/config/environments/production.rb +17 -0
- data/config/environments/test.rb +17 -0
- data/config/environments/user_environment.rb +1 -0
- data/config/routes.rb +28 -0
- data/db/ROOT/CV.txt +166 -0
- data/db/ROOT/IP.txt +3 -0
- data/db/ROOT/parleR.txt +3 -0
- data/db/ROOT/parlement/security.txt +34 -0
- data/db/ROOT/parlement/test.txt +4 -0
- data/db/ROOT/parlement.txt +51 -0
- data/db/ROOT/perso.txt +215 -0
- data/db/schema.sql +127 -0
- data/lib/data_import.rb +54 -0
- data/lib/file_column.rb +263 -0
- data/lib/file_column_helper.rb +45 -0
- data/lib/localization.rb +88 -0
- data/lib/localizer.rb +88 -0
- data/lib/login_system.rb +87 -0
- data/lib/rails_file_column.rb +19 -0
- data/lib/user_system.rb +101 -0
- data/public/404.html +8 -0
- data/public/500.html +8 -0
- data/public/dispatch.cgi +10 -0
- data/public/dispatch.fcgi +24 -0
- data/public/dispatch.rb +10 -0
- data/public/engine_files/README +5 -0
- data/public/engine_files/login_engine/stylesheets/login_engine.css +81 -0
- data/public/favicon.ico +0 -0
- data/public/favicon.png +0 -0
- data/public/images/live_tree_branch_collapsed_icon.gif +0 -0
- data/public/images/live_tree_branch_expanded_icon.gif +0 -0
- data/public/images/live_tree_leaf_icon.gif +0 -0
- data/public/images/live_tree_loading_spinner.gif +0 -0
- data/public/images/webfeed.gif +0 -0
- data/public/javascripts/controls.js +721 -0
- data/public/javascripts/dragdrop.js +519 -0
- data/public/javascripts/effects.js +992 -0
- data/public/javascripts/live_tree.js +749 -0
- data/public/javascripts/prototype.js +1726 -0
- data/public/javascripts/scriptaculous.js +47 -0
- data/public/javascripts/slider.js +258 -0
- data/public/oldREADME +190 -0
- data/public/oldindex.html +78 -0
- data/public/robots.txt +1 -0
- data/public/stylesheets/default.css +238 -0
- data/public/stylesheets/live_tree.css +62 -0
- data/public/stylesheets/scaffold.css +74 -0
- data/script/about +3 -0
- data/script/benchmarker +19 -0
- data/script/breakpointer +3 -0
- data/script/console +3 -0
- data/script/create_db +7 -0
- data/script/destroy +3 -0
- data/script/generate +3 -0
- data/script/performance/benchmarker +3 -0
- data/script/performance/profiler +3 -0
- data/script/plugin +3 -0
- data/script/process/reaper +3 -0
- data/script/process/spawner +3 -0
- data/script/process/spinner +3 -0
- data/script/profiler +34 -0
- data/script/runner +3 -0
- data/script/server +3 -0
- data/test/fixtures/attachments.yml +10 -0
- data/test/fixtures/elts.yml +15 -0
- data/test/fixtures/mails.yml +7 -0
- data/test/fixtures/people.yml +49 -0
- data/test/fixtures/users.yml +41 -0
- data/test/functional/account_controller_test.rb +239 -0
- data/test/functional/elt_controller_test.rb +18 -0
- data/test/mocks/test/time.rb +17 -0
- data/test/mocks/test/user_notify.rb +16 -0
- data/test/test_helper.rb +28 -0
- data/test/unit/attachment_test.rb +14 -0
- data/test/unit/elt_test.rb +14 -0
- data/test/unit/mail_test.rb +14 -0
- data/test/unit/notifier_test.rb +31 -0
- data/test/unit/person_test.rb +24 -0
- data/test/unit/user_test.rb +94 -0
- data/vendor/plugins/engines/CHANGELOG +7 -0
- data/vendor/plugins/engines/README +128 -0
- data/vendor/plugins/engines/init.rb +33 -0
- data/vendor/plugins/engines/lib/action_mailer_extensions.rb +160 -0
- data/vendor/plugins/engines/lib/action_view_extensions.rb +130 -0
- data/vendor/plugins/engines/lib/dependencies_extensions.rb +56 -0
- data/vendor/plugins/engines/lib/engines.rb +292 -0
- data/vendor/plugins/engines/lib/ruby_extensions.rb +127 -0
- data/vendor/plugins/engines/lib/testing_extensions.rb +33 -0
- data/vendor/plugins/engines/test/ruby_extensions_test.rb +94 -0
- data/vendor/plugins/login_engine/README +258 -0
- data/vendor/plugins/login_engine/app/controllers/user_controller.rb +248 -0
- data/vendor/plugins/login_engine/app/helpers/user_helper.rb +88 -0
- data/vendor/plugins/login_engine/app/models/user.rb +7 -0
- data/vendor/plugins/login_engine/app/models/user_notify.rb +75 -0
- data/vendor/plugins/login_engine/app/views/user/_edit.rhtml +11 -0
- data/vendor/plugins/login_engine/app/views/user/_password.rhtml +9 -0
- data/vendor/plugins/login_engine/app/views/user/change_password.rhtml +17 -0
- data/vendor/plugins/login_engine/app/views/user/edit.rhtml +23 -0
- data/vendor/plugins/login_engine/app/views/user/forgot_password.rhtml +18 -0
- data/vendor/plugins/login_engine/app/views/user/home.rhtml +7 -0
- data/vendor/plugins/login_engine/app/views/user/login.rhtml +17 -0
- data/vendor/plugins/login_engine/app/views/user/logout.rhtml +8 -0
- data/vendor/plugins/login_engine/app/views/user/signup.rhtml +17 -0
- data/vendor/plugins/login_engine/app/views/user_notify/change_password.rhtml +10 -0
- data/vendor/plugins/login_engine/app/views/user_notify/delete.rhtml +5 -0
- data/vendor/plugins/login_engine/app/views/user_notify/forgot_password.rhtml +11 -0
- data/vendor/plugins/login_engine/app/views/user_notify/pending_delete.rhtml +9 -0
- data/vendor/plugins/login_engine/app/views/user_notify/signup.rhtml +12 -0
- data/vendor/plugins/login_engine/db/schema.rb +25 -0
- data/vendor/plugins/login_engine/init_engine.rb +10 -0
- data/vendor/plugins/login_engine/lib/login_engine/authenticated_system.rb +107 -0
- data/vendor/plugins/login_engine/lib/login_engine/authenticated_user.rb +149 -0
- data/vendor/plugins/login_engine/lib/login_engine.rb +58 -0
- data/vendor/plugins/login_engine/public/stylesheets/login_engine.css +81 -0
- data/vendor/plugins/login_engine/tasks/tasks.rake +4 -0
- data/vendor/plugins/login_engine/test/fixtures/templates/users.yml +41 -0
- data/vendor/plugins/login_engine/test/fixtures/users.yml +41 -0
- data/vendor/plugins/login_engine/test/functional/user_controller_test.rb +533 -0
- data/vendor/plugins/login_engine/test/mocks/mail.rb +14 -0
- data/vendor/plugins/login_engine/test/mocks/time.rb +19 -0
- data/vendor/plugins/login_engine/test/test_helper.rb +15 -0
- data/vendor/plugins/login_engine/test/unit/user_test.rb +94 -0
- metadata +276 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module EltHelper
|
|
2
|
+
def format(data)
|
|
3
|
+
# for italics /.../ to _..._ \
|
|
4
|
+
#.gsub(/(\s+)\/([\w\s�������]*)\//, '\\1_\\2_') \
|
|
5
|
+
|
|
6
|
+
# ^here: data
|
|
7
|
+
# /italic/
|
|
8
|
+
# - listElement
|
|
9
|
+
# in reply to:\n>
|
|
10
|
+
# 1. numbered list
|
|
11
|
+
text = auto_link data \
|
|
12
|
+
.gsub(/^(\w*):\s/, ' \\1: ') \
|
|
13
|
+
.gsub(/(\s+)\/([\w\s]*)\//, '\\1_\\2_') \
|
|
14
|
+
.gsub(/^-\s/, '* ') \
|
|
15
|
+
.gsub(/(:)(\n)(^>\s)/, '\\1\\2\\2\\3') \
|
|
16
|
+
.gsub(/^\d+[\.-]\s+/, '# ') \
|
|
17
|
+
if data != nil
|
|
18
|
+
|
|
19
|
+
textiled = text.blank? ? "" : RedCloth.new(text).to_html
|
|
20
|
+
if textiled[0..2] == "<p>" then textiled = textiled[3..-1] end
|
|
21
|
+
if textiled[-4..-1] == "</p>" then textiled = textiled[0..-5] end
|
|
22
|
+
return textiled
|
|
23
|
+
|
|
24
|
+
"""
|
|
25
|
+
hard_breaks = false
|
|
26
|
+
auto_link textilize_without_paragraph(data \
|
|
27
|
+
.gsub(/\&\#8211\;/, '* ') \
|
|
28
|
+
.gsub(/^-\s/, '* ') \
|
|
29
|
+
.gsub(/(\s+)\/([\w\s�������]*)\//, '\\1_\\2_') \
|
|
30
|
+
.gsub(/[^\n]\n^>/, '') \
|
|
31
|
+
.gsub(/^\d+[ \.-]+/, '# ') \
|
|
32
|
+
# ).gsub(/(.{65,182})<br\s\/>/, \
|
|
33
|
+
# ).gsub(/([\r\n\<\>=\w\d\s.\:;,$*?!\-����������\"\&#;()\/]{65,182})<br\s\/>([^>])/,
|
|
34
|
+
) if data != nil
|
|
35
|
+
"""
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# Version:: 0.1
|
|
2
|
+
# Author:: Emanuel Borsboom (http://www.epiphyte.ca/)
|
|
3
|
+
# Copyright:: Copyright (c) 2005 Emanuel Borsboom
|
|
4
|
+
# License:: MIT (see LICENSE[link:files/LICENSE.html])
|
|
5
|
+
#
|
|
6
|
+
# See README[link:files/README.html] for general information about LiveTree.
|
|
7
|
+
|
|
8
|
+
module LiveTree
|
|
9
|
+
|
|
10
|
+
def self.included(base) #:nodoc:
|
|
11
|
+
super
|
|
12
|
+
base.extend(ClassMethods)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
module ClassMethods
|
|
16
|
+
|
|
17
|
+
# Sets up this controller to serve data for a LiveTree.
|
|
18
|
+
#
|
|
19
|
+
# Arguments:
|
|
20
|
+
# * +name+ - the tree's name.
|
|
21
|
+
# * <tt>options</tt> - may contain:
|
|
22
|
+
# * <tt>:model</tt> - name of the model to use for retrieving data (symbol).
|
|
23
|
+
# * <tt>:model_class</tt> - name of the model's class, incase it can't be inferred (string)
|
|
24
|
+
# * <tt>:get_item_name_proc</tt> - proc object which, when called with an item, returns the name of the item to display.
|
|
25
|
+
#
|
|
26
|
+
# Either one of <tt>:model</tt> or <tt>:model_class</tt> must be specified.
|
|
27
|
+
#
|
|
28
|
+
# If <tt>:get_item_name_proc</tt> is not specified, the item's <tt>name</tt> attribute is used.
|
|
29
|
+
#
|
|
30
|
+
# This example sets up this controller to serve data for a tree with name +family_tree+, that uses the +person+ model to get data:
|
|
31
|
+
#
|
|
32
|
+
# class FamilyController < ApplicationController
|
|
33
|
+
# live_tree :family_tree, :model => :person
|
|
34
|
+
# end
|
|
35
|
+
#
|
|
36
|
+
# A data retrieval method is created that is named <em><tt><name></tt></em><tt>_live_tree_data</tt> (e.g. +family_tree_live_tree_data+)
|
|
37
|
+
def live_tree(name, options = {})
|
|
38
|
+
raise ":model or :model_class_name option is required" if options[:model] == nil && options[:model_class_name] == nil
|
|
39
|
+
if options[:model_class_name] != nil
|
|
40
|
+
model = options[:model_class_name]
|
|
41
|
+
else
|
|
42
|
+
model = Inflector.camelize(options[:model])
|
|
43
|
+
end
|
|
44
|
+
self.const_set("LIVE_TREE_OPTIONS_" + name.to_s.upcase, options);
|
|
45
|
+
code = "" +
|
|
46
|
+
"def #{name}_live_tree_options\n" +
|
|
47
|
+
" LIVE_TREE_OPTIONS_" + name.to_s.upcase + "\n" +
|
|
48
|
+
"end\n" +
|
|
49
|
+
"def #{name}_live_tree_data\n" +
|
|
50
|
+
" get_live_tree_data(" + model + ".find(live_tree_item_id), #{name}_live_tree_options)\n" +
|
|
51
|
+
"end\n"
|
|
52
|
+
#STDERR.write("\n\n#{code}\n\n")
|
|
53
|
+
class_eval code
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
module LiveTreeHelper
|
|
59
|
+
|
|
60
|
+
def _recurse_live_tree_data(item, depth, get_item_name_proc, special_child_id = nil, special_child_data = nil) #:nodoc:
|
|
61
|
+
result = "{id:" + item.id.to_s + ",name:'" + escape_javascript(get_item_name_proc.call(item).to_s) + "'"
|
|
62
|
+
if item.children.size == 0
|
|
63
|
+
result += ",children:[]"
|
|
64
|
+
elsif depth == nil || depth > 1
|
|
65
|
+
result += ",children:[\n"
|
|
66
|
+
first = true
|
|
67
|
+
for child in item.children
|
|
68
|
+
result += ",\n" unless first
|
|
69
|
+
first = false
|
|
70
|
+
if child.id == special_child_id
|
|
71
|
+
result += special_child_data
|
|
72
|
+
else
|
|
73
|
+
result += _recurse_live_tree_data(child, depth == nil ? nil : depth - 1, get_item_name_proc, special_child_id, special_child_data)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
result += "]"
|
|
77
|
+
end
|
|
78
|
+
result += "}"
|
|
79
|
+
result
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def _get_live_tree_data(item, options, params) #:nodoc:
|
|
83
|
+
options ||= {}
|
|
84
|
+
get_item_name_proc = Proc.new { |x| x.name }
|
|
85
|
+
if options[:get_item_name_proc] != nil
|
|
86
|
+
get_item_name_proc = options[:get_item_name_proc]
|
|
87
|
+
end
|
|
88
|
+
depth = params[:depth] == nil ? nil : params[:depth].to_i
|
|
89
|
+
include_parents = params[:include_parents]
|
|
90
|
+
root_item_id = params[:root_item_id] == nil ? nil : params[:root_item_id].to_i
|
|
91
|
+
|
|
92
|
+
result = _recurse_live_tree_data(item, depth, get_item_name_proc)
|
|
93
|
+
if include_parents
|
|
94
|
+
while item.parent != nil && (root_item_id == nil || item.id != root_item_id)
|
|
95
|
+
result = _recurse_live_tree_data(item.parent, 2, get_item_name_proc, item.id, result)
|
|
96
|
+
item = item.parent
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
return result;
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def LiveTreeHelper.live_tree_js_name(name) #:nodoc:
|
|
103
|
+
Inflector.camelize(name).sub(/^(.)/) { |s| $1.downcase }
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Embeds a LiveTree at the current location in the document.
|
|
107
|
+
#
|
|
108
|
+
# Arguments:
|
|
109
|
+
# * +name+ - name of the tree
|
|
110
|
+
# * +options+ - may contain any of the options documented in #construct_live_tree_function, as well as:
|
|
111
|
+
# * <tt>:js_variable_name</tt> - JavaScript variable name to assign the JavaScript LiveTree object to (optional).
|
|
112
|
+
#
|
|
113
|
+
# If <tt>:js_variable_name</tt> is not specified, the tree is assigned to a variable with the name of the tree converted to camelcase
|
|
114
|
+
# with a lowercase first letter (e.g. if the tree is named +family_tree+, it will be assigned to +familyTree+).
|
|
115
|
+
def live_tree(name, options = {})
|
|
116
|
+
options = options.dup;
|
|
117
|
+
if options[:js_variable_name] != nil
|
|
118
|
+
var_name = options[:js_variable_name]
|
|
119
|
+
else
|
|
120
|
+
var_name = LiveTreeHelper.live_tree_js_name(name)
|
|
121
|
+
end
|
|
122
|
+
options.delete :js_variable_name
|
|
123
|
+
js = "var " + var_name + "=" + construct_live_tree_function(name, options) + ";"
|
|
124
|
+
js += var_name + ".render();"
|
|
125
|
+
return javascript_tag(js);
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Returns JavaScript code that constructs a JavaScript LiveTree object.
|
|
129
|
+
#
|
|
130
|
+
# Arguments:
|
|
131
|
+
#
|
|
132
|
+
# * +name+ - name of the tree
|
|
133
|
+
#
|
|
134
|
+
# * +options+ - most of these options are passed to the JavaScript LiveTree object as-is, but their
|
|
135
|
+
# names are converted to camelcase-with-lowercase-first-letter (e.g. <tt>:on_click_item</tt> becomes <tt>onClickItem</tt>).
|
|
136
|
+
# See LiveTreeClient[link:files/LiveTreeClient.html] for details details about those options. In addition, the following may be
|
|
137
|
+
# specified:
|
|
138
|
+
#
|
|
139
|
+
# * <tt>:id</tt> - HTML ID to give the tree's top HTML element (default is the tree's name).
|
|
140
|
+
# * <tt>:data_action</tt> - Action used by the tree to read data (default is "#{name}_live_tree_data").
|
|
141
|
+
# * <tt>:data_controller</tt> - Controller used by the tree to read data (default is the current controller).
|
|
142
|
+
# * <tt>:initial_data_root</tt> - Root item to construct initial tree data (optional, but you almost certainly want to include this).
|
|
143
|
+
# * <tt>:initial_data_whole_tree</tt> - Specifies whether the entire tree should be sent in the initial data, in which case the client will never have to contact the server for more data (default +false+, only used if <tt>:initial_data_root</tt> is specified).
|
|
144
|
+
# * <tt>:initial_data_options</tt> - Specifies options for constructing the initial data. See #construct_live_tree_data for details. If you used LiveTree::ClassMethods.live_tree to setup your controller, you don't need to specify this (the same values passed to live_tree are used). (default <tt>{}</tt>, only used if <tt>:initial_data_root</tt>).
|
|
145
|
+
def construct_live_tree_function(name, options = {})
|
|
146
|
+
options = options.dup;
|
|
147
|
+
if options[:id] != nil
|
|
148
|
+
tree_id = options[:id]
|
|
149
|
+
else
|
|
150
|
+
tree_id = name
|
|
151
|
+
end
|
|
152
|
+
for k in [:on_click_item, :on_expand_item, :on_collapse_item, :on_load_item]
|
|
153
|
+
if options[k] != nil
|
|
154
|
+
options[k] = "function(item){" + options[k] + "}"
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
if options[:data_url] == nil
|
|
158
|
+
if options[:data_action] == nil
|
|
159
|
+
act = name.to_s + "_live_tree_data"
|
|
160
|
+
else
|
|
161
|
+
act = options[:data_action]
|
|
162
|
+
end
|
|
163
|
+
if options[:data_controller] == nil
|
|
164
|
+
options[:data_url] = { :action => act }
|
|
165
|
+
else
|
|
166
|
+
options[:data_url] = { :controller => options[:data_controller], :action => act }
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
options[:data_url] = '"' + escape_javascript(url_for(options[:data_url])) + '"'
|
|
170
|
+
for k in [:css_class, :css_style]
|
|
171
|
+
if options[k] != nil
|
|
172
|
+
options[k] = '"' + escape_javascript(options[k]) + '"'
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
if options[:initial_data_root] != nil
|
|
176
|
+
item = options[:initial_data_root]
|
|
177
|
+
if (options[:initial_data_whole_tree])
|
|
178
|
+
depth = nil
|
|
179
|
+
elsif (options[:expand_root_item] == nil || options[:expand_root_item] || options[:hide_root_item])
|
|
180
|
+
depth = 2
|
|
181
|
+
else
|
|
182
|
+
depth = 1
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
if options[:initial_data_options] == nil
|
|
186
|
+
data_options_method = controller.method("#{name}_live_tree_options")
|
|
187
|
+
if data_options_method
|
|
188
|
+
data_options = data_options_method.call
|
|
189
|
+
else
|
|
190
|
+
data_options = {}
|
|
191
|
+
end
|
|
192
|
+
else
|
|
193
|
+
data_options = options[:initial_data_options]
|
|
194
|
+
end
|
|
195
|
+
data_options = data_options.dup
|
|
196
|
+
data_options[:depth] = depth;
|
|
197
|
+
options[:initial_data] = construct_live_tree_data(item, data_options)
|
|
198
|
+
end
|
|
199
|
+
options.delete :id
|
|
200
|
+
options.delete :data_action
|
|
201
|
+
options.delete :data_controller
|
|
202
|
+
options.delete :initial_data_root
|
|
203
|
+
options.delete :initial_data_options
|
|
204
|
+
options.delete :initial_data_whole_tree
|
|
205
|
+
options_js = "{\n" + options.map {|k, v| LiveTreeHelper.live_tree_js_name(k) + ":#{v}"}.join(",\n") + "\n}"
|
|
206
|
+
"new LiveTree(\"" + tree_id.to_s + "\"," + options_js + ")"
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# Returns data in format appropriate for use with the <tt>:initial_data</tt> parameter of #construct_live_tree_function .
|
|
210
|
+
#
|
|
211
|
+
# Arguments:
|
|
212
|
+
# * +item+ - Root item of the data.
|
|
213
|
+
# * +options+ - Same options as LiveTree.get_live_tree_data, as well as:
|
|
214
|
+
# * <tt>:depth</tt> - How many level deep to recurse (default is +nil+, which means to recurse to the ends of all branches).
|
|
215
|
+
def construct_live_tree_data(item, options = {})
|
|
216
|
+
return _get_live_tree_data(item, options, options)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
# Renders data to return to a LiveTree data request.
|
|
222
|
+
#
|
|
223
|
+
# Arguments:
|
|
224
|
+
# * +item+ - Item to return.
|
|
225
|
+
# * +options+ - May contain the following:
|
|
226
|
+
# * <tt>:get_item_name_proc</tt> - Proc object which, when called with an item, returns the name of the item to display. (by default, the item's name is retrieved using the object's +name+ attribute).
|
|
227
|
+
def get_live_tree_data(item, options = {})
|
|
228
|
+
#data = LiveTreeHelper.get_live_tree_data(item, options, params)
|
|
229
|
+
#render :text => data
|
|
230
|
+
render :inline => '<%= _get_live_tree_data(item, options, params) %>', :locals => { :item => item, :options => options }
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
# Returns the value of the item ID from the request's params.
|
|
234
|
+
def live_tree_item_id
|
|
235
|
+
params[:item_id]
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Receive an email from which an elt is created. An associated mail is kept to
|
|
3
|
+
make sure we don't lose any data. Attachments are also created in an associated
|
|
4
|
+
table
|
|
5
|
+
"""
|
|
6
|
+
class Mailman < ActionMailer::Base
|
|
7
|
+
""" This is to make sure we only have utf-8, no iso-8859 """
|
|
8
|
+
def unquote(text)
|
|
9
|
+
text.gsub(/\=\?.*?\?\=/) do |m|
|
|
10
|
+
TMail::Unquoter.unquote_and_convert_to(m, 'utf-8')
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def receive(email)
|
|
15
|
+
@elt = Elt.new
|
|
16
|
+
@elt.created_on = email.date
|
|
17
|
+
@elt.subject = unquote(email.subject)
|
|
18
|
+
|
|
19
|
+
@elt.body = ''
|
|
20
|
+
|
|
21
|
+
@elt.person = Person.find_by_name(unquote(email.friendly_from))
|
|
22
|
+
@elt.person = Person.new if @elt.person == nil
|
|
23
|
+
@elt.person.name = unquote(email.friendly_from)
|
|
24
|
+
@elt.person.email = email.from.first
|
|
25
|
+
|
|
26
|
+
if email.references != nil
|
|
27
|
+
# Try to fin its email parent in the db
|
|
28
|
+
for parent in email.references
|
|
29
|
+
m = Mail.find_by_message(parent.to_s)
|
|
30
|
+
@elt.parent = m.elt if m != nil
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
if @elt.parent == nil
|
|
35
|
+
parentId = @elt.subject.match(/\[\w*\]/)
|
|
36
|
+
logger.info parentId
|
|
37
|
+
if parentId != nil
|
|
38
|
+
parentId = parentId[0].gsub(/[\[\]]/, '')
|
|
39
|
+
parentElt = Elt.find(parentId)
|
|
40
|
+
logger.info parentElt
|
|
41
|
+
if parentElt != nil
|
|
42
|
+
@elt.subject = @elt.subject
|
|
43
|
+
@elt.parent_id = parentId
|
|
44
|
+
end
|
|
45
|
+
logger.info @elt.subject
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
@elt.parent_id = 'mails' if @elt.parent == nil
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
mngAttachment(email) if email != nil
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
logger.info email.from.first
|
|
56
|
+
@mail = Mail.new
|
|
57
|
+
logger.info email.friendly_from
|
|
58
|
+
@mail.message = email.message_id
|
|
59
|
+
logger.info email.references
|
|
60
|
+
@mail.mail_parents = email.references
|
|
61
|
+
|
|
62
|
+
@mail.file = email.encoded
|
|
63
|
+
|
|
64
|
+
@elt.save
|
|
65
|
+
@mail.elt = @elt
|
|
66
|
+
@mail.save
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def mngAttachment(attachment)
|
|
70
|
+
if attachment.content_type == 'text/plain'
|
|
71
|
+
@elt.body += attachment.body
|
|
72
|
+
elsif attachment.multipart?
|
|
73
|
+
attachment.parts.each do |part|
|
|
74
|
+
mngAttachment(part)
|
|
75
|
+
end
|
|
76
|
+
elsif attachment.content_type != 'text/html'
|
|
77
|
+
@attach = @elt.attachments.build
|
|
78
|
+
body = attachment.body
|
|
79
|
+
|
|
80
|
+
@attach.content_type = attachment.content_type
|
|
81
|
+
|
|
82
|
+
def body.original_filename=(orig)
|
|
83
|
+
@original_filename = orig
|
|
84
|
+
end
|
|
85
|
+
body.original_filename = attachment.type_param('name')
|
|
86
|
+
def body.original_filename
|
|
87
|
+
@original_filename
|
|
88
|
+
end
|
|
89
|
+
def body.read
|
|
90
|
+
self.to_s
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
@attach.file = body
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
data/app/models/elt.rb
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class Elt < ActiveRecord::Base
|
|
2
|
+
acts_as_tree :order => "position is not null, position, created_on"
|
|
3
|
+
belongs_to :person
|
|
4
|
+
has_one :mail, :dependent => true
|
|
5
|
+
has_many :attachments, :dependent => true
|
|
6
|
+
|
|
7
|
+
# for live_tree
|
|
8
|
+
def name
|
|
9
|
+
subject
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def save
|
|
13
|
+
super
|
|
14
|
+
logger.info 'hello world!!!'
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
data/app/models/mail.rb
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class Notifier < ActionMailer::Base
|
|
2
|
+
def changeEmail(person, link)
|
|
3
|
+
# Email header info MUST be added here
|
|
4
|
+
@recipients = person.email
|
|
5
|
+
@subject = "[parleR] check key: "+person.check_key
|
|
6
|
+
@from = MAIL_FROM
|
|
7
|
+
|
|
8
|
+
# Email body substitutions go here
|
|
9
|
+
@body["name"] = person.name
|
|
10
|
+
@body["link"] = link
|
|
11
|
+
@body["check_key"] = person.check_key
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
class Person < ActiveRecord::Base
|
|
2
|
+
has_many :elts
|
|
3
|
+
|
|
4
|
+
validates_presence_of :name, :on => :create
|
|
5
|
+
validates_length_of :name, :within => 3..40, :on => :create
|
|
6
|
+
validates_uniqueness_of :name, :on => :create
|
|
7
|
+
validates_uniqueness_of :email, :on => :create
|
|
8
|
+
end
|
|
9
|
+
|
data/app/models/user.rb
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
class UserNotify < ActionMailer::Base
|
|
2
|
+
def signup(user, password, url=nil)
|
|
3
|
+
setup_email(user)
|
|
4
|
+
|
|
5
|
+
# Email header info
|
|
6
|
+
@subject += "Welcome to #{LoginEngine.config(:app_name)}!"
|
|
7
|
+
|
|
8
|
+
# Email body substitutions
|
|
9
|
+
@body["name"] = "#{user.firstname} #{user.lastname}"
|
|
10
|
+
@body["login"] = user.login
|
|
11
|
+
@body["password"] = password
|
|
12
|
+
@body["url"] = url || LoginEngine.config(:app_url).to_s
|
|
13
|
+
@body["app_name"] = LoginEngine.config(:app_name).to_s
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def forgot_password(user, url=nil)
|
|
17
|
+
setup_email(user)
|
|
18
|
+
|
|
19
|
+
# Email header info
|
|
20
|
+
@subject += "Forgotten password notification"
|
|
21
|
+
|
|
22
|
+
# Email body substitutions
|
|
23
|
+
@body["name"] = "#{user.firstname} #{user.lastname}"
|
|
24
|
+
@body["login"] = user.login
|
|
25
|
+
@body["url"] = url || LoginEngine.config(:app_url).to_s
|
|
26
|
+
@body["app_name"] = LoginEngine.config(:app_name).to_s
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def change_password(user, password, url=nil)
|
|
30
|
+
setup_email(user)
|
|
31
|
+
|
|
32
|
+
# Email header info
|
|
33
|
+
@subject += "Changed password notification"
|
|
34
|
+
|
|
35
|
+
# Email body substitutions
|
|
36
|
+
@body["name"] = "#{user.firstname} #{user.lastname}"
|
|
37
|
+
@body["login"] = user.login
|
|
38
|
+
@body["password"] = password
|
|
39
|
+
@body["url"] = url || LoginEngine.config(:app_url).to_s
|
|
40
|
+
@body["app_name"] = LoginEngine.config(:app_name).to_s
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def pending_delete(user, url=nil)
|
|
44
|
+
setup_email(user)
|
|
45
|
+
|
|
46
|
+
# Email header info
|
|
47
|
+
@subject += "Delete user notification"
|
|
48
|
+
|
|
49
|
+
# Email body substitutions
|
|
50
|
+
@body["name"] = "#{user.firstname} #{user.lastname}"
|
|
51
|
+
@body["url"] = url || LoginEngine.config(:app_url).to_s
|
|
52
|
+
@body["app_name"] = LoginEngine.config(:app_name).to_s
|
|
53
|
+
@body["days"] = LoginEngine.config(:delayed_delete_days).to_s
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def delete(user, url=nil)
|
|
57
|
+
setup_email(user)
|
|
58
|
+
|
|
59
|
+
# Email header info
|
|
60
|
+
@subject += "Delete user notification"
|
|
61
|
+
|
|
62
|
+
# Email body substitutions
|
|
63
|
+
@body["name"] = "#{user.firstname} #{user.lastname}"
|
|
64
|
+
@body["url"] = url || LoginEngine.config(:app_url).to_s
|
|
65
|
+
@body["app_name"] = LoginEngine.config(:app_name).to_s
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def setup_email(user)
|
|
69
|
+
@recipients = "#{user.email}"
|
|
70
|
+
@from = LoginEngine.config(:email_from).to_s
|
|
71
|
+
@subject = "[#{LoginEngine.config(:app_name)}] "
|
|
72
|
+
@sent_on = Time.now
|
|
73
|
+
@headers['Content-Type'] = "text/plain; charset=#{LoginEngine.config(:mail_charset)}; format=flowed"
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<%= link_to_function("?",
|
|
2
|
+
visual_effect(:Shrink, "help_#{divId}_link")+
|
|
3
|
+
visual_effect(:Grow, "help_#{divId}")+
|
|
4
|
+
visual_effect(:Grow, "help_close_#{divId}_link"),
|
|
5
|
+
:class => "helpLink",
|
|
6
|
+
:id => "help_#{divId}_link") %>
|
|
7
|
+
|
|
8
|
+
<%= link_to_function("?",
|
|
9
|
+
visual_effect(:Shrink, "help_#{divId}")+
|
|
10
|
+
visual_effect(:Shrink, "help_close_#{divId}_link")+
|
|
11
|
+
visual_effect(:Grow, "help_#{divId}_link"),
|
|
12
|
+
:class => "helpLinkClose",
|
|
13
|
+
:id => "help_close_#{divId}_link",
|
|
14
|
+
:style => "display:none") %>
|
|
15
|
+
|
|
16
|
+
<div style="display:none" class="help" id="help_<%= divId %>">
|
|
17
|
+
<%= link_to_function("Help:",
|
|
18
|
+
visual_effect(:Shrink, "help_#{divId}")+
|
|
19
|
+
visual_effect(:Shrink, "help_close_#{divId}_link")+
|
|
20
|
+
visual_effect(:Grow, "help_#{divId}_link"),
|
|
21
|
+
:class => "helpTitle") %>
|
|
22
|
+
<%= content %>
|
|
23
|
+
</div>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<div class="login">
|
|
2
|
+
<%= form_remote_tag(
|
|
3
|
+
:update => divId,
|
|
4
|
+
:url => { :controller => 'account', :action => 'login' },
|
|
5
|
+
:interactive => visual_effect(:BlindDown, divId)) %>
|
|
6
|
+
<!--:position => 'after',-->
|
|
7
|
+
|
|
8
|
+
<input type="hidden" id="divId" name="divId" value="<%= divId %>"/>
|
|
9
|
+
|
|
10
|
+
<label for="person_name">Pseudo:</label>
|
|
11
|
+
<%= text_field "person", "name", :size => 10 %>
|
|
12
|
+
|
|
13
|
+
<%= link_to_function('+',
|
|
14
|
+
"Element.toggle(this);"+visual_effect(:Grow, 'user_password_'+divId.to_s)) %>
|
|
15
|
+
|
|
16
|
+
<span style="display:none" id="user_password_<%= divId %>">
|
|
17
|
+
|
|
18
|
+
<label for="user_password">Password:</label>
|
|
19
|
+
<%= password_field "user", "password", :size => 10 %>
|
|
20
|
+
|
|
21
|
+
<%= link_to_function('email? >',
|
|
22
|
+
"Element.toggle(this);"+visual_effect(:Grow, 'person_email_'+divId.to_s)) %>
|
|
23
|
+
</span>
|
|
24
|
+
|
|
25
|
+
<span style="display:none" id="person_email_<%= divId %>">
|
|
26
|
+
<br/>
|
|
27
|
+
<!--
|
|
28
|
+
<label for="user_password_confirmation">Confirm password:</label>
|
|
29
|
+
<%= password_field "user", "password_confirmation", :size => 10 %>
|
|
30
|
+
|
|
31
|
+
-->
|
|
32
|
+
<label for="person_email">Email (or check key):</label>
|
|
33
|
+
<%= text_field "person", "email", :size => 30 %>
|
|
34
|
+
</span>
|
|
35
|
+
|
|
36
|
+
<%= submit_tag 'Ok' %>
|
|
37
|
+
|
|
38
|
+
<%= render :partial => 'account/help',
|
|
39
|
+
:locals => { :divId => 'login'+divId.to_s, :content => '
|
|
40
|
+
<ul>You can propose an element
|
|
41
|
+
<li>with no pseudo</li>
|
|
42
|
+
<li>with an unprotected pseudo</li>
|
|
43
|
+
<li>with a password protected pseudo (click on the "+")</li>
|
|
44
|
+
<li>with a password protected and email verified pseudo (TODO)</li>
|
|
45
|
+
</ul>
|
|
46
|
+
The last method is the only secure way to protect a nickname on
|
|
47
|
+
<strong>this</strong> server.
|
|
48
|
+
<br/>
|
|
49
|
+
If a nick is not protected and verified, anybody else can protect it for
|
|
50
|
+
themselves if they at least supply a password <em>and</em> an email.
|
|
51
|
+
<br/>
|
|
52
|
+
A login must contain [3..40] characters, a password [5..40].
|
|
53
|
+
' } %>
|
|
54
|
+
</div>
|
|
55
|
+
<%= end_form_tag %>
|
|
56
|
+
</div>
|
|
57
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<% @flash.each do |key, value| %>
|
|
2
|
+
<div class="<%= key %>"><%= value %></div>
|
|
3
|
+
<% end %>
|
|
4
|
+
|
|
5
|
+
<%= error_messages_for 'person' if @person %>
|
|
6
|
+
<%= error_messages_for 'user' if @user %>
|
|
7
|
+
|
|
8
|
+
<% if @session[:person] != nil %>
|
|
9
|
+
<% if @session[:person] != nil and @session[:person].name != nil \
|
|
10
|
+
and @session[:person].name != '' %>
|
|
11
|
+
<div class="author">
|
|
12
|
+
<% if @session[:person] != nil and @session[:person].email != nil %>
|
|
13
|
+
<<%= mail_to @session[:person].email, @session[:person].name %>>
|
|
14
|
+
<% else %>
|
|
15
|
+
<<%= @session[:person].name %>>
|
|
16
|
+
<% end %>
|
|
17
|
+
</div>
|
|
18
|
+
<% end %>
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
<div class="logout">
|
|
22
|
+
<%= link_to_remote('(X)',
|
|
23
|
+
:update => divId,
|
|
24
|
+
:url => { :controller => 'account', :action => 'logout', :divId => divId },
|
|
25
|
+
:loaded => visual_effect(:BlindDown, divId)) %>
|
|
26
|
+
</div>
|
|
27
|
+
<% else %>
|
|
28
|
+
|
|
29
|
+
<%= render :partial => 'account/login', :locals => { :divId => divId } %>
|
|
30
|
+
<% end %>
|
|
31
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<%= start_form_tag :action=> "signup" %>
|
|
2
|
+
|
|
3
|
+
<div title="Account signup" id="signupform" class="form">
|
|
4
|
+
<h3>Signup</h3>
|
|
5
|
+
<%= error_messages_for 'user' %><br/>
|
|
6
|
+
|
|
7
|
+
<label for="user_login">Desired login:</label><br/>
|
|
8
|
+
<%= text_field "user", "login", :size => 30 %><br/>
|
|
9
|
+
<label for="user_password">Choose password:</label><br/>
|
|
10
|
+
<%= password_field "user", "password", :size => 30 %><br/>
|
|
11
|
+
<label for="user_password_confirmation">Confirm password:</label><br/>
|
|
12
|
+
<%= password_field "user", "password_confirmation", :size => 30 %><br/>
|
|
13
|
+
|
|
14
|
+
<input type="submit" value="Signup »" class="primary" />
|
|
15
|
+
|
|
16
|
+
<%= end_form_tag %>
|
|
17
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
|
|
2
|
+
<div class="memo">
|
|
3
|
+
<h3>Welcome</h3>
|
|
4
|
+
|
|
5
|
+
<p>You are now logged into the system...</p>
|
|
6
|
+
<p>
|
|
7
|
+
Since you are here it's safe to assume the application never called store_location, otherwise
|
|
8
|
+
you would have been redirected somewhere else after a successful login.
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<%= link_to "« logout", :action=>"logout"%>
|
|
12
|
+
|
|
13
|
+
</div>
|