Feature #6004 ยป 6004_git.diff
| lib/generators/redmine_plugin_scaffold/USAGE | ||
|---|---|---|
| 1 |
Description: |
|
| 2 |
Scaffolds an entire resource, from model and migration to controller and views, |
|
| 3 |
in a Redmine plugin. |
|
| 4 | ||
| 5 |
Examples: |
|
| 6 |
`./script/generate redmine_plugin_scaffold MyPlugin post` |
|
| 7 |
`./script/generate redmine_plugin_scaffold MyPlugin post title:string body:text published:boolean` |
|
| 8 |
`./script/generate redmine_plugin_scaffold MyPlugin purchase order_id:integer amount:decimal` |
|
| lib/generators/redmine_plugin_scaffold/redmine_plugin_scaffold_generator.rb | ||
|---|---|---|
| 1 |
require 'rails_generator/base' |
|
| 2 |
require 'rails_generator/generators/components/scaffold/scaffold_generator' |
|
| 3 | ||
| 4 |
class RedminePluginScaffoldGenerator < ScaffoldGenerator |
|
| 5 |
attr_reader :plugin_path, :plugin_name, :plugin_pretty_name |
|
| 6 |
|
|
| 7 |
def initialize(runtime_args, runtime_options = {})
|
|
| 8 |
runtime_args = runtime_args.dup |
|
| 9 |
usage if runtime_args.empty? |
|
| 10 |
@plugin_name = "redmine_" + runtime_args.shift.underscore |
|
| 11 |
@plugin_pretty_name = plugin_name.titleize |
|
| 12 |
@plugin_path = "vendor/plugins/#{plugin_name}"
|
|
| 13 |
super(runtime_args, runtime_options) |
|
| 14 |
end |
|
| 15 |
|
|
| 16 |
def destination_root |
|
| 17 |
File.join(RAILS_ROOT, plugin_path) |
|
| 18 |
end |
|
| 19 |
|
|
| 20 |
def manifest |
|
| 21 |
record do |m| |
|
| 22 |
# Check for class naming collisions. |
|
| 23 |
m.class_collisions("#{controller_class_name}Controller", "#{controller_class_name}Helper")
|
|
| 24 |
m.class_collisions(class_name) |
|
| 25 | ||
| 26 |
# Controller, helper, views, test and stylesheets directories. |
|
| 27 |
m.directory(File.join('app/models', class_path))
|
|
| 28 |
m.directory(File.join('app/controllers', controller_class_path))
|
|
| 29 |
m.directory(File.join('app/helpers', controller_class_path))
|
|
| 30 |
m.directory(File.join('app/views', controller_class_path, controller_file_name))
|
|
| 31 |
m.directory(File.join('test/functional', controller_class_path))
|
|
| 32 |
m.directory(File.join('test/unit', class_path))
|
|
| 33 |
m.directory(File.join('test/unit/helpers', class_path))
|
|
| 34 | ||
| 35 |
for action in scaffold_views |
|
| 36 |
m.template( |
|
| 37 |
"view_#{action}.html.erb",
|
|
| 38 |
File.join('app/views', controller_class_path, controller_file_name, "#{action}.html.erb")
|
|
| 39 |
) |
|
| 40 |
end |
|
| 41 |
m.template( |
|
| 42 |
"view_form.html.erb", |
|
| 43 |
File.join('app/views', controller_class_path, controller_file_name, "_form.html.erb")
|
|
| 44 |
) if scaffold_views.include?("edit") || scaffold_views.include?("new")
|
|
| 45 | ||
| 46 |
# Layout and stylesheet. |
|
| 47 |
m.template( |
|
| 48 |
'controller.rb', File.join('app/controllers', controller_class_path, "#{controller_file_name}_controller.rb")
|
|
| 49 |
) |
|
| 50 | ||
| 51 |
m.template('functional_test.rb', File.join('test/functional', controller_class_path, "#{controller_file_name}_controller_test.rb"))
|
|
| 52 |
m.template('helper.rb', File.join('app/helpers', controller_class_path, "#{controller_file_name}_helper.rb"))
|
|
| 53 |
m.template('helper_test.rb', File.join('test/unit/helpers', controller_class_path, "#{controller_file_name}_helper_test.rb"))
|
|
| 54 |
|
|
| 55 |
route_file = File.join('config','routes.rb')
|
|
| 56 |
m.template('routes.rb', route_file) unless File.file?(File.join(destination_root,route_file))
|
|
| 57 | ||
| 58 |
m.route_resources controller_file_name |
|
| 59 | ||
| 60 |
m.dependency 'redmine_plugin_model', [@plugin_name.gsub(/redmine_/,''),name] + @args, :collision => :skip |
|
| 61 |
end |
|
| 62 |
end |
|
| 63 | ||
| 64 |
protected |
|
| 65 |
# Override with your own usage banner. |
|
| 66 |
def banner |
|
| 67 |
"Usage: #{$0} redmine_plugin_scaffold PluginName ModelName [field:type, field:type]"
|
|
| 68 |
end |
|
| 69 |
end |
|
| lib/generators/redmine_plugin_scaffold/templates/controller.rb | ||
|---|---|---|
| 1 |
class <%= controller_class_name %>Controller < ApplicationController |
|
| 2 |
unloadable |
|
| 3 |
|
|
| 4 |
#layout 'admin' |
|
| 5 |
#menu_item :issues |
|
| 6 |
|
|
| 7 |
def index |
|
| 8 |
@<%= table_name %> = <%= class_name %>.all |
|
| 9 |
end |
|
| 10 |
|
|
| 11 |
def show |
|
| 12 |
@<%= file_name %> = <%= class_name %>.find(params[:id]) |
|
| 13 |
end |
|
| 14 |
|
|
| 15 |
def new |
|
| 16 |
@<%= file_name %> = <%= class_name %>.new |
|
| 17 |
end |
|
| 18 |
|
|
| 19 |
def edit |
|
| 20 |
@<%= file_name %> = <%= class_name %>.find(params[:id]) |
|
| 21 |
end |
|
| 22 |
|
|
| 23 |
def create |
|
| 24 |
@<%= file_name %> = <%= class_name %>.new(params[:<%= file_name %>]) |
|
| 25 |
if @<%= file_name %>.save |
|
| 26 |
flash[:notice] = l(:notice_successful_create) |
|
| 27 |
redirect_to(@<%= file_name %>) |
|
| 28 |
else |
|
| 29 |
render :action => "new" |
|
| 30 |
end |
|
| 31 |
end |
|
| 32 |
|
|
| 33 |
def update |
|
| 34 |
@<%= file_name %> = <%= class_name %>.find(params[:id]) |
|
| 35 |
if @<%= file_name %>.update_attributes(params[:<%= file_name %>]) |
|
| 36 |
flash[:notice] = l(:notice_successful_update) |
|
| 37 |
redirect_to(@<%= file_name %>) |
|
| 38 |
else |
|
| 39 |
render :action => "edit" |
|
| 40 |
end |
|
| 41 |
end |
|
| 42 |
|
|
| 43 |
def destroy |
|
| 44 |
@<%= file_name %> = <%= class_name %>.find(params[:id]) |
|
| 45 |
@<%= file_name %>.destroy |
|
| 46 |
flash[:notice] = l(:notice_successful_delete) |
|
| 47 |
redirect_to(<%= table_name %>_url) |
|
| 48 |
end |
|
| 49 |
end |
|
| lib/generators/redmine_plugin_scaffold/templates/functional_test.rb | ||
|---|---|---|
| 1 |
require File.dirname(__FILE__) + '/../test_helper' |
|
| 2 | ||
| 3 |
class <%= controller_class_name %>ControllerTest < ActionController::TestCase |
|
| 4 |
test "should get index" do |
|
| 5 |
get :index |
|
| 6 |
assert_response :success |
|
| 7 |
assert_not_nil assigns(:<%= table_name %>) |
|
| 8 |
end |
|
| 9 | ||
| 10 |
test "should get new" do |
|
| 11 |
get :new |
|
| 12 |
assert_response :success |
|
| 13 |
end |
|
| 14 | ||
| 15 |
test "should create <%= file_name %>" do |
|
| 16 |
assert_difference('<%= class_name %>.count') do
|
|
| 17 |
post :create, :<%= file_name %> => { }
|
|
| 18 |
end |
|
| 19 | ||
| 20 |
assert_redirected_to <%= file_name %>_path(assigns(:<%= file_name %>)) |
|
| 21 |
end |
|
| 22 | ||
| 23 |
test "should show <%= file_name %>" do |
|
| 24 |
get :show, :id => <%= class_name %>.find(1).to_param |
|
| 25 |
assert_response :success |
|
| 26 |
end |
|
| 27 | ||
| 28 |
test "should get edit" do |
|
| 29 |
get :edit, :id => <%= class_name %>.find(1).to_param |
|
| 30 |
assert_response :success |
|
| 31 |
end |
|
| 32 | ||
| 33 |
test "should update <%= file_name %>" do |
|
| 34 |
put :update, :id => <%= class_name %>.find(1).to_param, :<%= file_name %> => { }
|
|
| 35 |
assert_redirected_to <%= file_name %>_path(assigns(:<%= file_name %>)) |
|
| 36 |
end |
|
| 37 | ||
| 38 |
test "should destroy <%= file_name %>" do |
|
| 39 |
assert_difference('<%= class_name %>.count', -1) do
|
|
| 40 |
delete :destroy, :id => <%= class_name %>.find(1).to_param |
|
| 41 |
end |
|
| 42 | ||
| 43 |
assert_redirected_to <%= table_name %>_path |
|
| 44 |
end |
|
| 45 |
end |
|
| lib/generators/redmine_plugin_scaffold/templates/helper.rb | ||
|---|---|---|
| 1 |
module <%= controller_class_name %>Helper |
|
| 2 |
end |
|
| lib/generators/redmine_plugin_scaffold/templates/helper_test.rb | ||
|---|---|---|
| 1 |
require File.dirname(__FILE__) + '/../../test_helper' |
|
| 2 |
require 'action_view/test_case' |
|
| 3 | ||
| 4 |
class <%= controller_class_name %>HelperTest < ActionView::TestCase |
|
| 5 |
end |
|
| lib/generators/redmine_plugin_scaffold/templates/routes.rb | ||
|---|---|---|
| 1 |
ActionController::Routing::Routes.draw do |map| |
|
| 2 |
end |
|
| lib/generators/redmine_plugin_scaffold/templates/view_edit.html.erb | ||
|---|---|---|
| 1 |
<h2><%%= link_to l(:label_<%=singular_name%>_plural), <%=plural_name%>_path %> » <%%=h @<%=singular_name%>.<%=attributes.first.name %>%></h2> |
|
| 2 | ||
| 3 |
<%% labelled_tabular_form_for :<%=singular_name%>, @<%=singular_name%>, :url => {:controller=>'<%=plural_name%>', :action=>'update'}, :html => { :class => nil, :method => :put } do |f| -%>
|
|
| 4 |
<%%= render :partial => 'form', :locals => { :f => f } %>
|
|
| 5 |
<p><%%= submit_tag l(:button_update) %></p> |
|
| 6 |
<%% end -%> |
|
| lib/generators/redmine_plugin_scaffold/templates/view_form.html.erb | ||
|---|---|---|
| 1 |
<%%= error_messages_for '<%=singular_name%>' %> |
|
| 2 | ||
| 3 |
<!--[form:<%=singular_name%>]--> |
|
| 4 |
<div class="box tabular"> |
|
| 5 |
<% for attribute in attributes -%> |
|
| 6 |
<p><%%= f.<%= attribute.field_type %> :<%= attribute.name %> %></p> |
|
| 7 |
<% end -%> |
|
| 8 |
</div> |
|
| 9 |
<!--[eoform:<%=singular_name%>]--> |
|
| lib/generators/redmine_plugin_scaffold/templates/view_index.html.erb | ||
|---|---|---|
| 1 |
<div class="contextual"> |
|
| 2 |
<%%= link_to l(:label_<%=singular_name%>_new), {:controller=>'<%=plural_name%>',:action=>'new'},
|
|
| 3 |
:class => 'icon icon-add' %> |
|
| 4 |
</div> |
|
| 5 | ||
| 6 |
<h2><%%=l(:label_<%=singular_name%>_plural)%></h2> |
|
| 7 | ||
| 8 |
<%% if @<%=plural_name%>.any? -%> |
|
| 9 |
<table class="list"> |
|
| 10 |
<thead> |
|
| 11 |
<tr> |
|
| 12 |
<% for attribute in attributes -%> |
|
| 13 |
<th><%%= l(:field_<%=attribute.column.name%>)%></th> |
|
| 14 |
<% end -%> |
|
| 15 |
<th> </th> |
|
| 16 |
</tr> |
|
| 17 |
</thead> |
|
| 18 |
<tbody> |
|
| 19 |
<%% @<%= plural_name %>.each do |<%= singular_name %>| -%> |
|
| 20 |
<tr class="<%=singular_name%> <%%= cycle("odd", "even") %>">
|
|
| 21 |
<% for attribute in attributes -%> |
|
| 22 |
<% if attribute==attributes.first %> |
|
| 23 |
<td class="<%=attribute.name%>"><%%=link_to h(<%= singular_name %>.<%= attribute.name %>), {:controller => '<%=plural_name%>', :action => 'show', :id => <%=singular_name%>} %></td>
|
|
| 24 |
<% else %> |
|
| 25 |
<td class="<%=attribute.name%>"><%%=h <%= singular_name %>.<%= attribute.name %> %></td> |
|
| 26 |
<% end %> |
|
| 27 |
<% end -%> |
|
| 28 |
<td class="buttons"> |
|
| 29 |
<%%= link_to l(:button_update), {:controller => '<%=plural_name%>', :action => 'edit', :id => <%=singular_name%>},
|
|
| 30 |
:class => 'icon icon-edit' %> |
|
| 31 |
<%%= link_to l(:button_delete), {:controller => '<%=plural_name%>', :action => 'destroy', :id => <%=singular_name%>},
|
|
| 32 |
:class => 'icon icon-del', :confirm => l(:text_are_you_sure), :method => :delete %> |
|
| 33 |
</td> |
|
| 34 |
</tr> |
|
| 35 |
<%% end -%> |
|
| 36 |
</tbody> |
|
| 37 |
</table> |
|
| 38 | ||
| 39 |
<%% else -%> |
|
| 40 |
<p class="nodata"><%%= l(:label_no_data) %></p> |
|
| 41 |
<%% end -%> |
|
| 42 | ||
| 43 |
<%% html_title(l(:label_<%= singular_name %>_plural)) -%> |
|
| lib/generators/redmine_plugin_scaffold/templates/view_new.html.erb | ||
|---|---|---|
| 1 |
<h2><%%= link_to l(:label_<%=singular_name%>_plural), <%=plural_name%>_path %> » <%%=l(:label_<%=singular_name%>_new) %></h2> |
|
| 2 | ||
| 3 |
<%% labelled_tabular_form_for :<%=singular_name%>, @<%=singular_name%>, :url => {:controller=>'<%=plural_name%>', :action=>'create'}, :html => { :class => nil } do |f| -%>
|
|
| 4 |
<%%= render :partial => 'form', :locals => { :f => f } %>
|
|
| 5 |
<p><%%= submit_tag l(:button_create) %></p> |
|
| 6 |
<%% end -%> |
|
| lib/generators/redmine_plugin_scaffold/templates/view_show.html.erb | ||
|---|---|---|
| 1 |
<div class="contextual"> |
|
| 2 |
<%%= link_to l(:button_update), {:controller => '<%=plural_name%>', :action => 'edit', :id => @<%=singular_name%>},
|
|
| 3 |
:class => 'icon icon-edit' %> |
|
| 4 |
<%%= link_to l(:button_delete), {:controller => '<%=plural_name%>', :action => 'destroy', :id => @<%=singular_name%>},
|
|
| 5 |
:class => 'icon icon-del', :confirm => l(:text_are_you_sure), :method => :delete %> |
|
| 6 |
</div> |
|
| 7 | ||
| 8 |
<h2><%%= link_to l(:label_<%=singular_name%>_plural), <%=plural_name%>_path %> » <%%=h @<%=singular_name%>.<%=attributes.first.name %>%></h2> |
|
| 9 | ||
| 10 |
<% for attribute in attributes -%> |
|
| 11 |
<p> |
|
| 12 |
<b><%%= l(:field_<%=attribute.column.name%>)%>:</b> |
|
| 13 |
<%%=h @<%= singular_name %>.<%= attribute.name %> %> |
|
| 14 |
</p> |
|
| 15 |
<% end -%> |
|
| 16 | ||
| 17 |
<%% html_title(l(:label_<%=singular_name%>_plural)) -%> |
|