chili_presentations 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,23 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'friendly_id', '~> 3.2.1'
4
+ gem "paperclip", "~> 2.7"
5
+
6
+ group :development, :test do
7
+ gem "rails", "2.3.14"
8
+ gem "fastercsv"
9
+ gem "rubytree", "~> 0.5.2", :require => 'tree'
10
+ gem "sqlite3-ruby", "< 1.3", :require => "sqlite3"
11
+ gem "webrat"
12
+
13
+ gem 'cucumber'
14
+ gem 'shoulda'
15
+ gem 'rspec', '~> 1.3'
16
+ gem 'rspec-rails'
17
+ gem 'redmine_plugin_support'
18
+ gem 'autotest-rails', '~> 4.1.0'
19
+ gem 'fakeweb'
20
+ gem 'hoe', '~> 2.8.0'
21
+ gem 'hoe-git'
22
+ gem 'ZenTest'
23
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,90 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ ZenTest (4.5.0)
5
+ actionmailer (2.3.14)
6
+ actionpack (= 2.3.14)
7
+ actionpack (2.3.14)
8
+ activesupport (= 2.3.14)
9
+ rack (~> 1.1.0)
10
+ activerecord (2.3.14)
11
+ activesupport (= 2.3.14)
12
+ activeresource (2.3.14)
13
+ activesupport (= 2.3.14)
14
+ activesupport (2.3.14)
15
+ autotest-rails (4.1.1)
16
+ ZenTest (= 4.5)
17
+ babosa (0.3.5)
18
+ builder (3.0.0)
19
+ cocaine (0.3.0)
20
+ cucumber (1.1.4)
21
+ builder (>= 2.1.2)
22
+ diff-lcs (>= 1.1.2)
23
+ gherkin (~> 2.7.1)
24
+ json (>= 1.4.6)
25
+ term-ansicolor (>= 1.0.6)
26
+ diff-lcs (1.1.3)
27
+ fakeweb (1.3.0)
28
+ fastercsv (1.5.4)
29
+ friendly_id (3.2.1.1)
30
+ babosa (~> 0.3.0)
31
+ gherkin (2.7.1)
32
+ json (>= 1.4.6)
33
+ hoe (2.8.0)
34
+ rake (>= 0.8.7)
35
+ hoe-git (1.4.1)
36
+ hoe (>= 2.2.0)
37
+ json (1.6.4)
38
+ mime-types (1.19)
39
+ nokogiri (1.5.0)
40
+ paperclip (2.7.0)
41
+ activerecord (>= 2.3.0)
42
+ activesupport (>= 2.3.2)
43
+ cocaine (>= 0.0.2)
44
+ mime-types
45
+ rack (1.1.3)
46
+ rack-test (0.6.1)
47
+ rack (>= 1.0)
48
+ rails (2.3.14)
49
+ actionmailer (= 2.3.14)
50
+ actionpack (= 2.3.14)
51
+ activerecord (= 2.3.14)
52
+ activeresource (= 2.3.14)
53
+ activesupport (= 2.3.14)
54
+ rake (>= 0.8.3)
55
+ rake (0.9.2.2)
56
+ redmine_plugin_support (0.0.5)
57
+ rspec (1.3.2)
58
+ rspec-rails (1.3.4)
59
+ rack (>= 1.0.0)
60
+ rspec (~> 1.3.1)
61
+ rubytree (0.5.3)
62
+ shoulda (2.11.3)
63
+ sqlite3-ruby (1.2.5)
64
+ term-ansicolor (1.0.7)
65
+ webrat (0.7.3)
66
+ nokogiri (>= 1.2.0)
67
+ rack (>= 1.0)
68
+ rack-test (>= 0.5.3)
69
+
70
+ PLATFORMS
71
+ ruby
72
+
73
+ DEPENDENCIES
74
+ ZenTest
75
+ autotest-rails (~> 4.1.0)
76
+ cucumber
77
+ fakeweb
78
+ fastercsv
79
+ friendly_id (~> 3.2.1)
80
+ hoe (~> 2.8.0)
81
+ hoe-git
82
+ paperclip (~> 2.7)
83
+ rails (= 2.3.14)
84
+ redmine_plugin_support
85
+ rspec (~> 1.3)
86
+ rspec-rails
87
+ rubytree (~> 0.5.2)
88
+ shoulda
89
+ sqlite3-ruby (< 1.3)
90
+ webrat
data/History.txt ADDED
@@ -0,0 +1,4 @@
1
+ == 0.1.0 2012-09-24
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Tom Kersten
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ 'Software'), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Manifest.txt ADDED
@@ -0,0 +1,32 @@
1
+ Gemfile
2
+ Gemfile.lock
3
+ History.txt
4
+ LICENSE
5
+ Manifest.txt
6
+ README.md
7
+ Rakefile
8
+ app/controllers/presentations_controller.rb
9
+ app/helpers/presentations_helper.rb
10
+ app/models/presentation.rb
11
+ app/models/presentation_observer.rb
12
+ app/views/presentations/_shared_form.html.erb
13
+ app/views/presentations/edit.html.erb
14
+ app/views/presentations/index.html.erb
15
+ app/views/presentations/new.html.erb
16
+ assets/stylesheets/forms.css
17
+ assets/stylesheets/presentations.css
18
+ autotest/discover.rb
19
+ config/locales/en.yml
20
+ config/routes.rb
21
+ db/migrate/20120920025054_create_presentations.rb
22
+ db/migrate/20120920025554_create_slugs.rb
23
+ init.rb
24
+ lang/en.yml
25
+ lib/chili_presentations.rb
26
+ lib/chili_presentations/version.rb
27
+ lib/presentation_project_patch.rb
28
+ lib/presentation_user_patch.rb
29
+ lib/presentation_version_patch.rb
30
+ lib/tasks/chili_presentations_tasks.rb
31
+ lib/tasks/contributor_tasks.rb
32
+ rails/init.rb
data/README.md ADDED
@@ -0,0 +1,141 @@
1
+ # ChiliPresentations - Host HTML-presentations in a ChiliProject installation
2
+
3
+ * http://github.com/tomkersten/chili_presentations
4
+
5
+ ## DESCRIPTION:
6
+
7
+ ChiliProject/Redmine plugin which allows you to upload a zipped directory
8
+ containing a "web-friendly" presentation (HTML/JS/CSS) and associate it
9
+ with a project. The plugin will unzip it and filter viewing permissions
10
+ according to your 'permissions' settings.
11
+
12
+
13
+ ## NOTABLE ITEMS TO CONSIDER
14
+
15
+ 1. This plugin is distributed as a gem, but does
16
+ ship with migrations and asset files (stylesheets, etc). Therefore,
17
+ the installation procedure is not the standard process.
18
+ 1. This plugin must be deployed behind the nginx web server, or a server which
19
+ implements the same `X-Sendfile` behavior as nginx (none that I am aware of
20
+ do this). The controller which serves up the presentation defers this task
21
+ to nginx by setting the `X-Accel-Redirect` header. If ChiliProject is
22
+ deployed behind anything other than nginx, it is likely you will only be
23
+ shown a blank screen. (__NOTE:__ This could easily be changed, but there is
24
+ no reason in my environment to support other servers. Patches are absolutely
25
+ welcome.)
26
+ 1. You must be able to set up a simple directive in your nginx config and cycle
27
+ nginx in order to take advantage of the afforementioned `X-Accel-Redirect`
28
+ header feature of nginx.
29
+
30
+ ## FEATURES:
31
+
32
+ 1. Makes it dead simple upload, store, and view HTML-based presentations
33
+ within a ChiliProject/Redmine (CP/RM) installation.
34
+ 1. Allows you to link presentations to specific "versions" in the CP/RM
35
+ project
36
+ 1. Adds a "presentation" wiki macro which can be used to link to a
37
+ presentation in wikis, news items, et cetera.
38
+
39
+ ## SYNOPSIS:
40
+
41
+ 1. Install the plugin
42
+ 1. Enable the "Presentations" module in a project
43
+
44
+ A "Presentations" tab will show up in your project. Click the "Add Presentation"
45
+ link in the contextual menu and use the form to upload a zipped directory
46
+ containing an @index.html@ file. The new presentation will show up in the list
47
+ of that project's presentations.
48
+
49
+ ## REQUIREMENTS:
50
+
51
+ * Gems:
52
+ - friendly\_id (v3.2.1.1)
53
+ - paperclip (v2.7.0)
54
+
55
+ * System commands:
56
+ - `unzip` must be installed and on the path of the user running the
57
+ ChiliProject application servers.
58
+
59
+ ## INSTALL:
60
+
61
+ ```
62
+ gem install chili_presentations
63
+ ```
64
+
65
+ ### Manual steps after gem installation
66
+
67
+ In your 'Gemfile', add:
68
+
69
+ ``` ruby
70
+ gem 'chili_presentations'
71
+ ```
72
+
73
+ Execute `bundle install` (or `bundle update chili_presentations` if you had a
74
+ previous version installed).
75
+
76
+ Next, in your 'Rakefile', add:
77
+
78
+ ``` ruby
79
+ require 'tasks/chili_presentations_tasks'
80
+ ```
81
+
82
+ Run the installation rake task (runs migrations)
83
+
84
+ ```
85
+ RAILS_ENV=production rake chili_presentations:install
86
+ ```
87
+
88
+ Cycle your application server (mongrel, unicorn, etc) and enable the module in
89
+ a project.
90
+
91
+
92
+ ## UNINSTALL:
93
+
94
+ Run the uninstall rake task (reverts migrations)
95
+
96
+ ```
97
+ RAILS_ENV=production rake chili_videos:uninstall
98
+ ```
99
+
100
+ In your 'Rakefile', remove:
101
+
102
+ ``` ruby
103
+ require 'tasks/chili_presentations_tasks'
104
+ ```
105
+
106
+ In your 'Gemfile', remove:
107
+
108
+ ``` ruby
109
+ gem 'chili_presentations'
110
+ ```
111
+
112
+ Cycle your application server (mongrel, unicorn, whatevs)...
113
+
114
+ Then, uninstall the chili_presentations gem:
115
+
116
+ ```
117
+ gem uninstall chili_presentations
118
+ ```
119
+
120
+ Done.
121
+
122
+ ## CONTRIBUTING AND/OR SUPPORT:
123
+
124
+ ### Found a bug? Have a feature request?
125
+
126
+ Please file a ticket on the '[Issues](https://github.com/tomkersten/chili_videos/issues)'
127
+ page of the Github project site
128
+
129
+ You can also drop me a message on Twitter [@tomkersten](http://twitter.com/tomkersten).
130
+ ### Want to contribute?
131
+
132
+ (Better instructions coming soon)
133
+
134
+ 1. Fork the project
135
+ 1. Create a feature branch and implement your idea (preferably with tests)
136
+ 1. Update the History.txt file in the 'Next Release' section (at the top)
137
+ 1. Send a pull request
138
+
139
+ ## LICENSE:
140
+
141
+ Refer to the [LICENSE](https://github.com/tomkersten/chili_presentations/blob/master/LICENSE) file
data/Rakefile ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift('lib')
3
+ require 'redmine_plugin_support'
4
+ require 'chili_presentations'
5
+ require 'tasks/contributor_tasks'
6
+ require 'tasks/chili_presentations_tasks'
7
+
8
+ RedminePluginSupport::Base.setup do |plugin|
9
+ plugin.project_name = 'redmine_chili_presentations'
10
+ plugin.default_task = [:test]
11
+ plugin.tasks = [:db, :doc, :release, :clean, :test]
12
+ plugin.redmine_root = File.expand_path(File.dirname(__FILE__) + '/../../../')
13
+ end
14
+
15
+ Dir["/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
16
+
17
+ task :default => [:test]
18
+
19
+ ChiliPresentationsTasks.new
20
+
21
+ begin
22
+ require 'hoe'
23
+ Hoe.plugin :git
24
+
25
+ $hoe = Hoe.spec('chili_presentations') do
26
+ developer('Tom Kersten', 'tom@whitespur.com')
27
+
28
+ self.readme_file = 'README.md'
29
+ self.version = ChiliPresentations::VERSION
30
+ self.extra_rdoc_files = FileList['README.md', 'LICENSE', 'History.txt']
31
+ self.summary = "ChiliProject (/Redmine) plugin which makes it easy to upload an HTML-presentation and associate it with a project. The plugin adds 'Presentations' tab to a project site which contains any associated presentations."
32
+ self.extra_deps = [
33
+ ['friendly_id', '3.2.1.1'],
34
+ ['paperclip', '2.7.0']
35
+ ]
36
+ end
37
+
38
+ ContributorTasks.new
39
+ rescue LoadError
40
+ puts "You are missing the 'hoe' gem, which is used for gem packaging & release management."
41
+ puts "Install using 'gem install hoe' if you need packaging & release rake tasks."
42
+ end
@@ -0,0 +1,77 @@
1
+ class PresentationsController < ApplicationController
2
+ unloadable
3
+
4
+ before_filter :find_project_by_project_id, :authorize
5
+
6
+ def index
7
+ @presentations = @project.presentations
8
+ end
9
+
10
+ def new
11
+ @versions = @project.versions.open
12
+ end
13
+
14
+ def create
15
+ @presentation = @project.presentations.new(presentation_params)
16
+
17
+ if @presentation.save
18
+ redirect_to project_presentations_path(@project)
19
+ else
20
+ render :action => :new
21
+ end
22
+ end
23
+
24
+ # Defers serving files to nginx via the X-Accel-Redirect header
25
+ def show
26
+ if presentation.blank?
27
+ flash[:error] = "The requested presentation does not exist. Please verify the link or send the project owner a message."
28
+ redirect_to(project_presentations_path(@project))
29
+ end
30
+
31
+ head :x_accel_redirect => presentation.path_to(params[:static_asset_path]), :content_type => requested_content_type
32
+ end
33
+
34
+ def destroy
35
+ presentation && presentation.destroy
36
+ flash[:notice] = l(:presentation_deleted_message)
37
+ redirect_to project_presentations_path(@project)
38
+ end
39
+
40
+ def edit
41
+ if presentation.blank?
42
+ flash[:error] = "The requested presentation does not exist. Please verify the link or send the project owner a message."
43
+ redirect_to(project_presentations_path(@project))
44
+ else
45
+ @versions = @project.versions.open.push(presentation.version).compact.sort.uniq
46
+ end
47
+ end
48
+
49
+ def update
50
+ if presentation.blank?
51
+ flash[:error] = "Hmmm....we couldn't find the presentation you were editing. Someone may have deleted it while you were performing your edits. You may want to send an email to the project owner to find out who has permissions to administer the project presentations."
52
+ else
53
+ presentation.title = presentation_params[:title]
54
+ presentation.description = presentation_params[:description]
55
+ presentation.save!
56
+ end
57
+
58
+ redirect_to project_presentations_path(@project)
59
+ end
60
+
61
+ private
62
+ def presentation_params
63
+ params[:presentation].merge({:user_id => User.current.id})
64
+ end
65
+
66
+ def presentation
67
+ @presentation ||= @project.presentations.find_by_cached_slug(params[:id])
68
+ end
69
+
70
+ def requested_content_type
71
+ case presentation.path_to(params[:static_asset_path])
72
+ when /\.css$/ then "text/css"
73
+ when /\.js$/ then "text/javascript"
74
+ else "text/html"
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,21 @@
1
+ module PresentationsHelper
2
+ extend self
3
+
4
+ def link_to_presentation_macro_markup(presentation)
5
+ "{{presentation_link(#{presentation.permalink})}}"
6
+ end
7
+
8
+ def link_to_presentation(presentation)
9
+ return "[Presentation not provided]" unless presentation.instance_of?(Presentation)
10
+ "<a href='#{prjct_presentation_path(presentation.project, presentation)}' class='presentation-link'>#{presentation.title}</a>"
11
+ end
12
+
13
+ private
14
+ def prjct_presentation_path(project, presentation)
15
+ "/projects/#{project.to_param}/presentations/#{presentation.to_param}/"
16
+ end
17
+
18
+ def usr_path(user)
19
+ "/users/#{user.to_param}"
20
+ end
21
+ end
@@ -0,0 +1,37 @@
1
+ class Presentation < ActiveRecord::Base
2
+ INDEX_FILENAME = "index.html"
3
+ UNPACKED_DIRNAME = "unpacked"
4
+
5
+ unloadable
6
+
7
+ validates_presence_of :title
8
+
9
+ has_friendly_id :title, :use_slug => true
10
+ has_attached_file :contents,
11
+ :path => ":rails_root/uploaded_presentations/:attachment/:id_partition/:style/:filename"
12
+
13
+ has_attached_file :alternative_format
14
+
15
+ belongs_to :user
16
+ belongs_to :project
17
+ belongs_to :version
18
+
19
+ validates_attachment_presence :contents
20
+
21
+
22
+ def index_path
23
+ File.join(UNPACKED_DIRNAME, INDEX_FILENAME)
24
+ end
25
+
26
+ def path_to(some_asset)
27
+ some_asset.blank? ? index_path : File.join(UNPACKED_DIRNAME, *some_asset)
28
+ end
29
+
30
+ def permalink
31
+ friendly_id
32
+ end
33
+
34
+ def to_s
35
+ title
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ require 'fileutils'
2
+ require 'tmpdir'
3
+ require 'find'
4
+
5
+ class PresentationObserver < ActiveRecord::Observer
6
+ def after_save(presentation)
7
+ Rails.logger.info "Executing PresentationObserver (#{__FILE__}:#{__LINE__})"
8
+
9
+ # location of existing compressed (zipped) file
10
+ compressed_file = presentation.contents.path
11
+
12
+ # Converts /.../path/original/something.zip -> /.../path/original/unpacked/
13
+ destination_path = File.join(File.dirname(presentation.contents.path),
14
+ Presentation::UNPACKED_DIRNAME)
15
+
16
+ Dir.mktmpdir {|tmpdir_path|
17
+ Rails.logger.info "Temporarily unpacking presentation into #{tmpdir_path}"
18
+ Paperclip.run("unzip", "#{compressed_file} -d #{tmpdir_path}")
19
+
20
+ index_container = Find.find(tmpdir_path) do |file|
21
+ break File.dirname(file) if file =~ /index\.html/
22
+ end
23
+
24
+ if index_container.blank?
25
+ Rails.logger.warn "No index.html file found in uploaded zipfile for presentation with ID of #{presentation.id}! Skipping."
26
+ else
27
+ # move index-containing directory to one named
28
+ # Presentation::UNPACKED_DIRNAME, regardless of original name/structure
29
+ Rails.logger.info "Moving #{index_container} to #{destination_path}"
30
+ FileUtils.move index_container, destination_path
31
+ end
32
+ Rails.logger.info "Uncompressing uploaded presentation completed successfully."
33
+ }
34
+ end
35
+ end
@@ -0,0 +1,14 @@
1
+ <p>
2
+ <%= f.text_field :title, :size => 50, :required => true %>
3
+ </p>
4
+
5
+ <p>
6
+ <%= f.text_area :description, :width => 50 %>
7
+ </p>
8
+
9
+ <%- unless versions.blank? %>
10
+ <p>
11
+ <label for="presentation_version_id">Version:</label>
12
+ <%= f.collection_select :version_id, versions, :id, :name, :include_blank => true %>
13
+ </p>
14
+ <%- end %>
@@ -0,0 +1,16 @@
1
+ <% content_for :header_tags do %>
2
+ <%= stylesheet_link_tag '/plugin_assets/chili_presentations/stylesheets/forms' %>
3
+ <% end %>
4
+
5
+ <h2>Updating "<%= @presentation %>" presentation...</h2>
6
+
7
+
8
+ <% labelled_tabular_form_for :presentation, @presentation, :url => project_presentation_path(@project, @presentation), :html => {:method => :put, :id => 'presentation-upload', :class => 'tabular', :multipart => true} do |f| %>
9
+ <div class="box">
10
+ <%= render :partial => 'shared_form', :locals => {:f => f, :versions => @versions} %>
11
+ </div>
12
+
13
+ <%= f.submit "Save updates" %>
14
+ or
15
+ <%= link_to "Cancel", project_presentation_path(@project, @presentation) %>
16
+ <%- end %>
@@ -0,0 +1,49 @@
1
+ <% content_for :header_tags do %>
2
+ <%= stylesheet_link_tag '/plugin_assets/chili_presentations/stylesheets/presentations' %>
3
+ <% end %>
4
+
5
+ <div class="contextual">
6
+ <%= link_to(l(:new_presentation_label), new_project_presentation_path(@project), :class => 'icon icon-add') if User.current.allowed_to?(:add_presentation, nil, :global => true) %>
7
+ </div>
8
+
9
+ <h2>Presentations (newest first)</h2>
10
+
11
+ <%- if @presentations.empty? %>
12
+ <p class="nodata">
13
+ No presentations uploaded yet!
14
+ <%= link_to "Add one...", new_project_presentation_path(@project) if User.current.allowed_to?(:add_presentation, nil, :global => true) %>
15
+ <p>
16
+ <%- else %>
17
+ <ul class="presentations">
18
+ <%- @presentations.each do |presentation| %>
19
+ <li class="presentation">
20
+ <h2>
21
+ <%= link_to presentation.title, project_presentation_path(@project, presentation, :trailing_slash => true) %>
22
+ <span class="manage-links">
23
+ <%= link_to(l(:view_specific_presentation_label), project_presentation_path(@project, presentation, :trailing_slash => true), :class => 'icon icon-file presentation-show') if User.current.allowed_to?(:view_specific_presentation, nil, :global => true) %>
24
+ <%= link_to(l(:edit_presentation_label), edit_project_presentation_path(@project, presentation), :class => 'icon icon-edit presentation-edit') if User.current.allowed_to?(:modify_presentations, nil, :global => true) %>
25
+ <%= link_to(l(:delete_presentation_label), project_presentation_path(@project, presentation), :class => 'icon icon-del presentation-del', :confirm => l(:confirm_presentation_deletion), :method => :delete) if User.current.allowed_to?(:delete_presentation, nil, :global => true) %>
26
+ </span>
27
+ </h2>
28
+
29
+ <p class="description"><%= presentation.description.blank? ? "(No description provided)" : presentation.description %></p>
30
+
31
+ <dl>
32
+ <dt>Uploaded on:</dt>
33
+ <dd><%= h presentation.created_at.strftime("%d-%b-%Y") %></dd>
34
+ <dt>Uploaded by:</dt>
35
+ <dd><%= link_to presentation.user, user_path(presentation.user) %></dd>
36
+
37
+ <%- if presentation.version %>
38
+ <dt>Version:</dt>
39
+ <dd><%= link_to presentation.version, project_version_path(@project, presentation.version) %></dd>
40
+ <%- end %>
41
+
42
+ <dt><label for="<%= presentation.to_param %>_link">Embed code:</label></dt>
43
+ <dd>(for wiki pages, news items etc):</dd>
44
+ <input type="text" id="<%= presentation.to_param %>_link" class="embed standard" value="<%= link_to_presentation_macro_markup(presentation) %>" />
45
+ </dl>
46
+ </li>
47
+ <%- end %>
48
+ </ul>
49
+ <%- end %>
@@ -0,0 +1,21 @@
1
+ <% content_for :header_tags do %>
2
+ <%= stylesheet_link_tag '/plugin_assets/chili_presentations/stylesheets/forms' %>
3
+ <% end %>
4
+
5
+ <h2>Upload project presentation...</h2>
6
+
7
+ <%= error_messages_for 'presentation' %>
8
+
9
+ <% labelled_tabular_form_for :presentation, @presentation, :url => project_presentations_path(@project), :html => {:id => 'presentation-upload', :class => 'tabular', :multipart => true} do |f| %>
10
+ <div class="box">
11
+ <%= render :partial => 'shared_form', :locals => {:f => f, :versions => @versions} %>
12
+
13
+ <p>
14
+ <%= f.file_field :contents, :label => 'Select file to upload', :required => true %>
15
+ </p>
16
+ </div>
17
+
18
+ <input type="submit" value="Upload Presentation" />
19
+ or
20
+ <%= link_to "Cancel", project_presentations_path(@project) %>
21
+ <%- end %>
@@ -0,0 +1,7 @@
1
+ input[type="text"], textarea {
2
+ width: 300px;
3
+ }
4
+
5
+ textarea {
6
+ height: 100px;
7
+ }
@@ -0,0 +1,69 @@
1
+ ul.presentations li {
2
+ list-style-type: none;
3
+ float: left;
4
+ margin-right: 25px;
5
+ border-bottom: 1px dashed #EEE;
6
+ width: 100%;
7
+ }
8
+
9
+ ul.presentations li:hover {
10
+ background-color: #EEE;
11
+ }
12
+
13
+ .presentation h2 {
14
+ padding: 5px 0 0 0;
15
+ margin: 0;
16
+ }
17
+
18
+ .presentation {
19
+ padding-bottom: 30px;
20
+ }
21
+
22
+ .presentation .description {
23
+ width: 75%;
24
+ display: inline-block;
25
+ margin-top: 10px;
26
+ margin-left: 10px;
27
+ }
28
+
29
+ .presentation .gravatar {
30
+ float: right;
31
+ }
32
+
33
+ .presentation input {
34
+ width: 250px;
35
+ }
36
+
37
+ .presentation-cell span {
38
+ position:relative;
39
+ top: 81px;
40
+ padding-right: 3px;
41
+ color: #CCC;
42
+ display: block;
43
+ }
44
+
45
+ .presentation dl {
46
+ margin-top: 10px;
47
+ margin-left: 5px;
48
+ float: right;
49
+ width: 22%;
50
+ }
51
+
52
+ .presentation dt {
53
+ float:left;
54
+ text-align: right;
55
+ width:25%; /* adjust the width; make sure the total of both is 100% */
56
+ }
57
+
58
+ .presentation dd {
59
+ float:left;
60
+ padding-left: 5px;
61
+ width:70%; /* adjust the width; make sure the total of both is 100% */
62
+ }
63
+
64
+ .presentation .manage-links {
65
+ font-size: 10px;
66
+ float: right;
67
+ padding-right: 5px;
68
+ padding-top: 7px;
69
+ }
@@ -0,0 +1,4 @@
1
+ Autotest.add_discovery do
2
+ "rails"
3
+ end
4
+
@@ -0,0 +1,16 @@
1
+ # English strings go here for Rails i18n
2
+ en:
3
+ permission_view_presentation_list: View presentation list
4
+ permission_view_specific_presentation: View specific presentation
5
+ permission_modify_presentations: Modify presentations
6
+ permission_delete_presentation: Delete presentations
7
+ permission_add_presentation: Add presentations
8
+ default_presentation_title: (none provided)
9
+ new_presentation_label: Add presentation
10
+ delete_presentation_label: Delete this presentation
11
+ edit_presentation_label: Edit this presentation
12
+ view_specific_presentation_label: View presentation
13
+ confirm_presentation_deletion: Are you sure you want to delete this presentation?
14
+ presentation_deleted_message: "Booyah! The requested presentation has been deleted."
15
+ field_contents: "'Select file to upload' field"
16
+ field_contents_file_name: "'Select file to upload' field"
data/config/routes.rb ADDED
@@ -0,0 +1,4 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+ map.resources :presentations, :name_prefix => 'project_', :path_prefix => '/projects/:project_id', :collection => {:view => :get}
3
+ map.connect '/projects/:project_id/presentations/:id/*static_asset_path', :controller => 'presentations', :action => 'show'
4
+ end
@@ -0,0 +1,22 @@
1
+ class CreatePresentations < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :presentations do |t|
4
+ t.column :title, :string
5
+ t.column :description, :text
6
+ t.column :unzipped_location, :string
7
+ t.integer :project_id, :user_id, :version_id
8
+ t.string :cached_slug
9
+ t.has_attached_file :contents
10
+ t.has_attached_file :alternative_format
11
+ t.timestamps
12
+ end
13
+
14
+ add_index :presentations, :cached_slug, :unique => true
15
+ end
16
+
17
+ def self.down
18
+ remove_index :presentations, :column => :cached_slug
19
+
20
+ drop_table :presentations
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ class CreateSlugs < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :slugs do |t|
4
+ t.string :name
5
+ t.integer :sluggable_id
6
+ t.integer :sequence, :null => false, :default => 1
7
+ t.string :sluggable_type, :limit => 40
8
+ t.string :scope
9
+ t.datetime :created_at
10
+ end
11
+ add_index :slugs, :sluggable_id
12
+ add_index :slugs, [:name, :sluggable_type, :sequence, :scope], :name => "index_slugs_on_n_s_s_and_s", :unique => true
13
+ end
14
+
15
+ def self.down
16
+ drop_table :slugs
17
+ end
18
+ end
data/init.rb ADDED
@@ -0,0 +1,49 @@
1
+ require 'redmine'
2
+ require 'chili_presentations'
3
+
4
+ # Patches to the Redmine core.
5
+ require 'dispatcher'
6
+
7
+ Dispatcher.to_prepare :chili_presentations do
8
+ require_dependency 'project'
9
+ Project.send(:include, PresentationProjectPatch) unless Project.included_modules.include? PresentationProjectPatch
10
+
11
+ require_dependency 'user'
12
+ User.send(:include, PresentationUserPatch) unless User.included_modules.include? PresentationUserPatch
13
+
14
+ require_dependency 'version'
15
+ Version.send(:include, PresentationVersionPatch) unless Version.included_modules.include? PresentationVersionPatch
16
+ end
17
+
18
+
19
+ Redmine::Plugin.register 'chili_presentations' do
20
+ name 'Chili Presentations plugin'
21
+ author 'Tom Kersten'
22
+ description 'Adds "Presentations" module which allows you to upload a zipped prentation folder including an index.html file and view it in the context of your project-site.'
23
+ version ChiliPresentations::VERSION
24
+ url 'https://github.com/tomkersten/chili_presentations'
25
+ author_url 'http://tomkersten.com/'
26
+
27
+ project_module :presentations do
28
+ permission :view_presentation_list, {:presentations => [:index]}
29
+ permission :view_specific_presentation, {:presentations => [:show]}
30
+ permission :modify_presentation, {:presentations => [:edit,:update]}, {:require => :member}
31
+ permission :delete_presentation, {:presentations => [:destroy]}, {:require => :member}
32
+ permission :add_presentation, {:presentations => [:new, :create]}, {:require => :member}
33
+ end
34
+
35
+ menu :project_menu, :presentations, { :controller => 'presentations', :action => 'index' }, :caption => 'Presentations', :param => :project_id
36
+
37
+ ActiveRecord::Base.observers << :presentation_observer
38
+ end
39
+
40
+ Redmine::WikiFormatting::Macros.register do
41
+ desc "Provides a link to a Presentation with the title of the Presentation as the link text.\n" +
42
+ "Usage examples:\n\n" +
43
+ " !{{presentation_link(id)}}\n"
44
+ macro :presentation_link do |o, args|
45
+ presentation_id = args[0]
46
+ presentation = Presentation.find(presentation_id)
47
+ PresentationsHelper.link_to_presentation(presentation)
48
+ end
49
+ end
data/lang/en.yml ADDED
@@ -0,0 +1,16 @@
1
+
2
+
3
+ permission_view_presentation_list: View presentation list
4
+ permission_view_specific_presentation: View specific presentation
5
+ permission_modify_presentations: Modify presentations
6
+ permission_delete_presentation: Delete presentations
7
+ permission_add_presentation: Add presentations
8
+ default_presentation_title: (none provided)
9
+ new_presentation_label: Add presentation
10
+ delete_presentation_label: Delete this presentation
11
+ edit_presentation_label: Edit this presentation
12
+ view_specific_presentation_label: View presentation
13
+ confirm_presentation_deletion: Are you sure you want to delete this presentation?
14
+ presentation_deleted_message: "Booyah! The requested presentation has been deleted."
15
+ field_contents: "'Select file to upload' field"
16
+ field_contents_file_name: "'File name'"
@@ -0,0 +1,4 @@
1
+ module ChiliPresentations
2
+ VERSION = '0.1.0'
3
+ end
4
+
@@ -0,0 +1,7 @@
1
+ require 'friendly_id'
2
+ require 'paperclip'
3
+
4
+ require 'chili_presentations/version'
5
+
6
+ module ChiliPresentations
7
+ end
@@ -0,0 +1,9 @@
1
+ module PresentationProjectPatch
2
+ def self.included(base) # :nodoc:
3
+ base.class_eval do
4
+ unloadable # Send unloadable so it will not be unloaded in development
5
+ has_many :presentations, :dependent => :destroy, :order => "created_at DESC"
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,9 @@
1
+ module PresentationUserPatch
2
+ def self.included(base) # :nodoc:
3
+ base.class_eval do
4
+ unloadable # Send unloadable so it will not be unloaded in development
5
+ has_many :presentations, :dependent => :destroy
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,9 @@
1
+ module PresentationVersionPatch
2
+ def self.included(base) # :nodoc:
3
+ base.class_eval do
4
+ unloadable # Send unloadable so it will not be unloaded in development
5
+ has_many :presentations, :dependent => :destroy
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,95 @@
1
+ require 'rake'
2
+ require 'rake/tasklib'
3
+
4
+ class ChiliPresentationsTasks < Rake::TaskLib
5
+ VALID_DJ_ACTIONS = %w(start restart stop status)
6
+
7
+ def initialize
8
+ define
9
+ end
10
+
11
+ def define
12
+ namespace :chili_presentations do
13
+ desc "Install ChiliPresentations plugin (migrate database, include assets, etc)"
14
+ task :install => [:migrate_db, :symlink_assets]
15
+
16
+ desc "Uninstalls ChiliPresentations plugin (removes database modifications, removes assets, etc)"
17
+ task :uninstall => [:environment] do
18
+ puts "Removing ChiliPresentations database modifications..."
19
+ migrate_db(:to_version => 0)
20
+
21
+ puts "Removing link to ChiliPresentations assets (stylesheets, js, etc)..."
22
+ remove_symlink asset_destination_dir
23
+ puts post_uninstall_steps
24
+ end
25
+
26
+ task :migrate_db => :environment do
27
+ puts "Migrating chili_presentations..."
28
+ ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
29
+ ActiveRecord::Migrator.migrate(gem_db_migrate_dir, ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
30
+ Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
31
+ end
32
+
33
+ task :symlink_assets => [:environment] do
34
+ # HACK: Symlinks the files from plugindir/assets to the appropriate place in
35
+ # the rails application
36
+ puts "Symlinking assets (stylesheets, etc)..."
37
+ add_symlink asset_source_dir, asset_destination_dir
38
+ end
39
+ end
40
+ end
41
+
42
+ private
43
+ def application_root
44
+ File.expand_path(RAILS_ROOT)
45
+ end
46
+
47
+ def gem_root
48
+ @gem_root ||= File.expand_path(File.dirname(__FILE__) + "/../..")
49
+ end
50
+
51
+ def asset_destination_dir
52
+ @destination_dir ||= File.expand_path("#{application_root}/public/plugin_assets/chili_presentations")
53
+ end
54
+
55
+ def asset_source_dir
56
+ @source_dir ||= File.expand_path(gem_root + "/assets")
57
+ end
58
+
59
+ def remove_symlink(symlink_file)
60
+ system("unlink #{symlink_file}") if File.exists?(symlink_file)
61
+ end
62
+
63
+ def add_symlink(source, destination)
64
+ remove_symlink destination
65
+ system("ln -s #{source} #{destination}")
66
+ end
67
+
68
+ def gem_db_migrate_dir
69
+ @gem_db_migrate_dir ||= File.expand_path(gem_root + "/db/migrate")
70
+ end
71
+
72
+ def migrate_db(options = {})
73
+ ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
74
+ ActiveRecord::Migrator.migrate(gem_db_migrate_dir, options[:to_version])
75
+ Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
76
+ end
77
+
78
+ def post_uninstall_steps
79
+ [
80
+ "!!!!! MANUAL STEPS !!!!!",
81
+ "\t1. In your 'Gemfile', remove:",
82
+ "\t\tgem 'chili_presentations'",
83
+ "",
84
+ "\t2. In your 'Rakefile', remove:",
85
+ "\t\trequire 'tasks/chili_presentations_tasks'",
86
+ "",
87
+ "\t3. Run 'bundle' (or 'bundle install') to update your Gemfile.lock",
88
+ "",
89
+ "\t4. Cycle your application server (mongrel, unicorn, etc)",
90
+ "\n",
91
+ ].join("\n")
92
+ end
93
+ end
94
+
95
+ ChiliPresentationsTasks.new
@@ -0,0 +1,73 @@
1
+ require 'rake'
2
+ require 'rake/tasklib'
3
+
4
+ class ContributorTasks < Rake::TaskLib
5
+ def initialize
6
+ define
7
+ end
8
+
9
+ def define
10
+ desc "Update contributors list in README"
11
+ task :update_contributors do
12
+ if new_contributors?
13
+ puts "New contributors!"
14
+ new_contributors.each {|name| puts "- #{name}"}
15
+ puts ""
16
+
17
+ print "Updating the 'Contributors' section of README..."
18
+
19
+ File.open("README.md", "w+") do |file|
20
+ file.puts readme_without_contributors_section
21
+ file.puts "## Contributors (sorted alphabetically)"
22
+ file.puts ""
23
+ committers.each {|name| file.puts "* #{name}"}
24
+ end
25
+ puts "done!"
26
+ else
27
+ puts "No new contributors."
28
+ end
29
+ end
30
+
31
+ task :release do
32
+ puts "#####################"
33
+ puts "For the twitters"
34
+ puts "#####################"
35
+ puts "[ANN] chili_presentations v#{ChiliPresentations::VERSION} released. Changes: [link], Repo: [link] #chiliproject"
36
+ puts "#####################"
37
+
38
+ end
39
+ end
40
+
41
+ private
42
+ def all_committers
43
+ all_names = `git shortlog -s |cut -s -f2`
44
+ all_names.gsub!(/\sand\s/, "\n").split("\n").uniq!.sort!
45
+ end
46
+
47
+ def committers
48
+ excluded_committers = ["Tom Kersten"]
49
+ @committers ||= all_committers - excluded_committers
50
+ end
51
+
52
+ def readme_file_contents
53
+ @readme_contents ||= `cat README.md`
54
+ end
55
+
56
+ def existing_contributors
57
+ existing_contributors = readme_file_contents[/## Contributors(.|\n)*/].strip.split("\n* ")
58
+ existing_contributors.shift # remove "Contributors..." line
59
+ existing_contributors
60
+ end
61
+
62
+ def new_contributors
63
+ @new_contributors ||= committers - existing_contributors
64
+ end
65
+
66
+ def new_contributors?
67
+ !new_contributors.empty?
68
+ end
69
+
70
+ def readme_without_contributors_section
71
+ readme_file_contents.sub(/## Contributors(.|\n)*/, '')
72
+ end
73
+ end
data/rails/init.rb ADDED
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + "/../init"
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,182 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chili_presentations
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Tom Kersten
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain:
12
+ - !binary |-
13
+ LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNRENDQWhpZ0F3SUJB
14
+ Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREErTVF3d0NnWURWUVFEREFOMGIy
15
+ MHgKR1RBWEJnb0praWFKay9Jc1pBRVpGZ2wzYUdsMFpYTndkWEl4RXpBUkJn
16
+ b0praWFKay9Jc1pBRVpGZ05qYjIwdwpIaGNOTVRFd05ESXlNRFF6T1RBNVdo
17
+ Y05NVEl3TkRJeE1EUXpPVEE1V2pBK01Rd3dDZ1lEVlFRRERBTjBiMjB4CkdU
18
+ QVhCZ29Ka2lhSmsvSXNaQUVaRmdsM2FHbDBaWE53ZFhJeEV6QVJCZ29Ka2lh
19
+ SmsvSXNaQUVaRmdOamIyMHcKZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJ
20
+ QkR3QXdnZ0VLQW9JQkFRRHB4b3pEUWdWTi9vWmxqR2xJOW9wbQpDcmhOVkEv
21
+ bHNOaVhaQlVtamZRQzVYUlBZSHptbHVvbjJaejQwNTBsak9ES1grYi90a3ov
22
+ V1ZaNng3YStMb3AyCnlDTExXTGNITmdCMTBqM2ozazZiTTBsM2NmQ2RDdnpl
23
+ dkU3WmdwdzNvL2J6YXpTVDV4MHBOenVyYXNTMW91UWsKeC8ybzlFNnFxSlJ1
24
+ QjUxa2h1WktuaCtNYTUyL0kxS1FhTUo0Ylc2Tk9ncXVGQ0VJdW04TUpKQkpX
25
+ RWRHbTRJdAp2aFMvZGFSZS9BRGtZbGdXbDFZMWs3THh1SCsxVkN4N3pNRk1l
26
+ MUUwQ01KemhHZjd6dU1TMHcrZHF3Ykw1bTNOCk1MRTh2Z3h3VEVPc093R3o0
27
+ d0Q2ek1VZEJZNkZHWXdSazhMR2p2bG9rbjBwWjFqeVdIV1NnMmJVdi8xR0My
28
+ aTkKQWdNQkFBR2pPVEEzTUFrR0ExVWRFd1FDTUFBd0N3WURWUjBQQkFRREFn
29
+ U3dNQjBHQTFVZERnUVdCQlRONjFBegp5a0RZaGVSSHR6c2p3RTdmaUxoWW16
30
+ QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFMd29Jbld1YkpYSllWSDJOClhu
31
+ Q01UNFlseE5zUW9ZZERTeEVhZ05PbVpqSzJlS3RqdTBWOUdqWkFueVlCMnEy
32
+ TExpbHZiTXlWdGcvNkFOMEkKWGhDanlZWlJSQ0FEeXZGR1Y0YUJWdjd5aktG
33
+ UXJJeVh5OEpUMWlYeEhDMU4ybzFESmxaVWx0Q1lOb3pKQmhzTwpWTmJuU3Fl
34
+ OFlZY2V6c3VRMi93OWlhdldYQ2Y5MVFQd25yZkhQWlRyRlBPdmVza0pjdG04
35
+ SGluRjQxZkt3RzVCCmlVSHk4cVZXR0JDcERGWXo2S3orSnRpZ2FJQ2NtMkQ0
36
+ L1dHTHNEVk9tZ0orZzR4b09pQ2U5WkVrZGE4SytsL0YKeVhXcUluUmxGSWxU
37
+ dXdGVHhqMjZqYXVCb3NrQlBvejViZmtaRmphVlJoeVVuUm5Ha2E2Nmx2Y0RP
38
+ R2ZrUlpXUQpOVkFESkE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
39
+ date: 2012-09-25 00:00:00.000000000 Z
40
+ dependencies:
41
+ - !ruby/object:Gem::Dependency
42
+ name: friendly_id
43
+ requirement: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - '='
47
+ - !ruby/object:Gem::Version
48
+ version: 3.2.1.1
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - '='
55
+ - !ruby/object:Gem::Version
56
+ version: 3.2.1.1
57
+ - !ruby/object:Gem::Dependency
58
+ name: paperclip
59
+ requirement: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - '='
63
+ - !ruby/object:Gem::Version
64
+ version: 2.7.0
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - '='
71
+ - !ruby/object:Gem::Version
72
+ version: 2.7.0
73
+ - !ruby/object:Gem::Dependency
74
+ name: rdoc
75
+ requirement: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ~>
79
+ - !ruby/object:Gem::Version
80
+ version: '3.10'
81
+ type: :development
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ version: '3.10'
89
+ - !ruby/object:Gem::Dependency
90
+ name: hoe
91
+ requirement: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ none: false
101
+ requirements:
102
+ - - ~>
103
+ - !ruby/object:Gem::Version
104
+ version: '3.0'
105
+ description: ! 'ChiliProject/Redmine plugin which allows you to upload a zipped directory
106
+
107
+ containing a "web-friendly" presentation (HTML/JS/CSS) and associate it
108
+
109
+ with a project. The plugin will unzip it and filter viewing permissions
110
+
111
+ according to your ''permissions'' settings.'
112
+ email:
113
+ - tom@whitespur.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files:
117
+ - History.txt
118
+ - Manifest.txt
119
+ - README.md
120
+ - LICENSE
121
+ files:
122
+ - Gemfile
123
+ - Gemfile.lock
124
+ - History.txt
125
+ - LICENSE
126
+ - Manifest.txt
127
+ - README.md
128
+ - Rakefile
129
+ - app/controllers/presentations_controller.rb
130
+ - app/helpers/presentations_helper.rb
131
+ - app/models/presentation.rb
132
+ - app/models/presentation_observer.rb
133
+ - app/views/presentations/_shared_form.html.erb
134
+ - app/views/presentations/edit.html.erb
135
+ - app/views/presentations/index.html.erb
136
+ - app/views/presentations/new.html.erb
137
+ - assets/stylesheets/forms.css
138
+ - assets/stylesheets/presentations.css
139
+ - autotest/discover.rb
140
+ - config/locales/en.yml
141
+ - config/routes.rb
142
+ - db/migrate/20120920025054_create_presentations.rb
143
+ - db/migrate/20120920025554_create_slugs.rb
144
+ - init.rb
145
+ - lang/en.yml
146
+ - lib/chili_presentations.rb
147
+ - lib/chili_presentations/version.rb
148
+ - lib/presentation_project_patch.rb
149
+ - lib/presentation_user_patch.rb
150
+ - lib/presentation_version_patch.rb
151
+ - lib/tasks/chili_presentations_tasks.rb
152
+ - lib/tasks/contributor_tasks.rb
153
+ - rails/init.rb
154
+ homepage: http://github.com/tomkersten/chili_presentations
155
+ licenses: []
156
+ post_install_message:
157
+ rdoc_options:
158
+ - --main
159
+ - README.md
160
+ require_paths:
161
+ - lib
162
+ required_ruby_version: !ruby/object:Gem::Requirement
163
+ none: false
164
+ requirements:
165
+ - - ! '>='
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ required_rubygems_version: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ requirements: []
175
+ rubyforge_project: chili_presentations
176
+ rubygems_version: 1.8.23
177
+ signing_key:
178
+ specification_version: 3
179
+ summary: ChiliProject (/Redmine) plugin which makes it easy to upload an HTML-presentation
180
+ and associate it with a project. The plugin adds 'Presentations' tab to a project
181
+ site which contains any associated presentations.
182
+ test_files: []
metadata.gz.sig ADDED
Binary file