togo 0.6.1 → 0.6.2
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/lib/togo/admin/helpers.rb +8 -8
- data/lib/togo/admin/views/index.erb +2 -1
- data/lib/togo/model/model.rb +26 -3
- data/lib/togo/model/property_wrapper/property_wrapper.rb +21 -0
- data/lib/togo/model/types/belongs_to.erb +6 -5
- data/lib/togo/model/types/boolean.erb +3 -3
- data/lib/togo/model/types/datetime.erb +2 -2
- data/lib/togo/model/types/float.erb +2 -2
- data/lib/togo/model/types/has_n.erb +7 -6
- data/lib/togo/model/types/integer.erb +2 -2
- data/lib/togo/model/types/many_to_many.erb +7 -6
- data/lib/togo/model/types/string.erb +2 -2
- data/lib/togo/model/types/text.erb +2 -2
- metadata +9 -24
data/lib/togo/admin/helpers.rb
CHANGED
@@ -23,20 +23,20 @@ module Helpers
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def column_head_link(property, current_order, qs = {})
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
if property.sortable
|
27
|
+
qs = hash_to_qs(qs)
|
28
|
+
new_order = (current_order[0] == property.name ? (current_order[1] == :asc ? "desc" : "asc") : "asc")
|
29
|
+
link_class = current_order[0] == property.name ? new_order : ''
|
30
|
+
"<a href=\"?o=#{[(property.name.to_s+'.'+new_order.to_s),qs].compact.join('&')}\" class=\"#{link_class}\">#{property.label}</a>"
|
31
|
+
else
|
32
|
+
property.label
|
33
|
+
end
|
30
34
|
end
|
31
35
|
|
32
36
|
def partial(template, options={})
|
33
37
|
erb template, options.merge(:layout => false)
|
34
38
|
end
|
35
39
|
|
36
|
-
def active_menu(name)
|
37
|
-
request.path =~ /#{name}/ ? 'active' : ''
|
38
|
-
end
|
39
|
-
|
40
40
|
def logged_in?
|
41
41
|
return true if not config[:auth_model] or not config[:sessions]
|
42
42
|
config[:auth_model] and session[:user] and session[:user].authenticated?
|
@@ -34,7 +34,8 @@
|
|
34
34
|
<tr>
|
35
35
|
<td class="checkbox"><input type="checkbox" name="selection[<%= c.id %>]" value="1" id="selection_<%= c.id %>" /></td>
|
36
36
|
<% @model.get_list_properties.each_with_index do |p,i| %>
|
37
|
-
|
37
|
+
<% v = c.send(p.name.to_sym) || '-' %>
|
38
|
+
<td><% if i == 0 %><a href="/edit/<%= @model.name %>/<%= c.id %>"><%= v %></a><% else %><%= v %><% end %></td>
|
38
39
|
<% end %>
|
39
40
|
</tr>
|
40
41
|
<% end %>
|
data/lib/togo/model/model.rb
CHANGED
@@ -2,6 +2,7 @@ require 'erubis/tiny'
|
|
2
2
|
%w( relationship_manager many_to_one one_to_many ).each{|l|
|
3
3
|
require "togo/model/relationship_manager/#{l}"
|
4
4
|
}
|
5
|
+
require 'togo/model/property_wrapper/property_wrapper'
|
5
6
|
|
6
7
|
module Togo
|
7
8
|
module DataMapper
|
@@ -44,7 +45,7 @@ module Togo
|
|
44
45
|
|
45
46
|
# Display the form template for a property
|
46
47
|
def form_for(property,content)
|
47
|
-
template = class_variable_get(:@@custom_form_templates)[property.name] || File.join(File.dirname(__FILE__),'types',"#{
|
48
|
+
template = class_variable_get(:@@custom_form_templates)[property.name] || File.join(File.dirname(__FILE__),'types',"#{property.type}.erb")
|
48
49
|
Erubis::TinyEruby.new(File.open(template).read).result(binding)
|
49
50
|
end
|
50
51
|
|
@@ -95,7 +96,7 @@ module Togo
|
|
95
96
|
end
|
96
97
|
|
97
98
|
def field_class_for(property)
|
98
|
-
|
99
|
+
property.type
|
99
100
|
end
|
100
101
|
|
101
102
|
def get_list_properties
|
@@ -131,10 +132,32 @@ module Togo
|
|
131
132
|
end
|
132
133
|
end
|
133
134
|
|
135
|
+
def model_from_property(property)
|
136
|
+
case property
|
137
|
+
when ::DataMapper::Property
|
138
|
+
property.model
|
139
|
+
when ::DataMapper::Associations::ManyToMany::Relationship
|
140
|
+
property.child_model
|
141
|
+
when ::DataMapper::Associations::ManyToOne::Relationship
|
142
|
+
property.parent_model
|
143
|
+
when ::DataMapper::Associations::OneToMany::Relationship
|
144
|
+
property.child_model
|
145
|
+
else
|
146
|
+
self
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def sorting_from_property(property)
|
151
|
+
property.is_a?(::DataMapper::Property)
|
152
|
+
end
|
153
|
+
|
134
154
|
def pick_properties(selection, args)
|
135
155
|
if class_variable_get(:"@@#{selection}_properties").empty?
|
136
156
|
args = shown_properties.map{|p| p.name} if args.empty?
|
137
|
-
class_variable_set(:"@@#{selection}_properties", args.collect{|a|
|
157
|
+
class_variable_set(:"@@#{selection}_properties", args.collect{|a|
|
158
|
+
p = shown_properties.select{|s| s.name == a}.first
|
159
|
+
PropertyWrapper.new({:property => p, :name => a, :type => type_from_property(p), :model => model_from_property(p), :sortable => sorting_from_property(p)})
|
160
|
+
}.compact)
|
138
161
|
end
|
139
162
|
class_variable_get(:"@@#{selection}_properties")
|
140
163
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class PropertyWrapper
|
2
|
+
|
3
|
+
attr_reader :name, :type, :model, :sortable
|
4
|
+
|
5
|
+
def initialize(opts = {})
|
6
|
+
@name = (opts[:property] ? opts[:property].name : opts[:name]).to_sym
|
7
|
+
@model = opts[:model]
|
8
|
+
@type = opts[:type]
|
9
|
+
@sortable = opts[:sortable] || false
|
10
|
+
end
|
11
|
+
|
12
|
+
def humanized_name
|
13
|
+
@name.to_s.humanize.titleize rescue @name
|
14
|
+
end
|
15
|
+
|
16
|
+
def label
|
17
|
+
puts @model.property_options.inspect
|
18
|
+
@model.property_options[@name][:label] rescue humanized_name
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
<% content_count = content.send(property.name
|
2
|
-
<% related_content = [content.send(property.name
|
1
|
+
<% content_count = content.send(property.name).blank? ? 0 : 1 %>
|
2
|
+
<% related_content = [content.send(property.name)].compact %>
|
3
3
|
<% related_ids = related_content.map(&:id) %>
|
4
|
-
<% related_model = property.
|
4
|
+
<% related_model = property.model %>
|
5
5
|
<input type="hidden" name="related_<%= property.name %>" class="related_ids" value="unset" />
|
6
6
|
<label for="<%= property.name %>"><%= related_model.display_name %></label>
|
7
7
|
<div class="search" id="search-<%= related_model.name %>">
|
@@ -17,7 +17,7 @@
|
|
17
17
|
<tr>
|
18
18
|
<th class="checkbox"> </th>
|
19
19
|
<% related_model.get_list_properties.each do |p| %>
|
20
|
-
<th><%= p.
|
20
|
+
<th><%= p.humanized_name %></th>
|
21
21
|
<% end %>
|
22
22
|
</tr>
|
23
23
|
</thead>
|
@@ -42,7 +42,8 @@
|
|
42
42
|
<tr>
|
43
43
|
<td class="checkbox"><input type="radio" name="selection[<%= c.id %>]" value="<%= c.id %>" id="selection_<%= related_model.name %>_<%= c.id %>" checked="checked" /></td>
|
44
44
|
<% related_model.get_list_properties.each_with_index do |p,i| %>
|
45
|
-
|
45
|
+
<% v = c.send(p.name) || '-' %>
|
46
|
+
<td><% if i == 0 %><a href="/edit/<%= related_model.name %>/<%= c.id %>"><%= v || '-' %></a><% else %><%= v %><% end %></td>
|
46
47
|
<% end %>
|
47
48
|
</tr>
|
48
49
|
<% end %>
|
@@ -1,3 +1,3 @@
|
|
1
|
-
<label><%= property.
|
2
|
-
<input type="radio" name="<%= property.name %>" id="<%= property.name %>_true" value="1" <% if content.send(property.name
|
3
|
-
<input type="radio" name="<%= property.name %>" id="<%= property.name %>_false" value="0" <% if not content.send(property.name
|
1
|
+
<label><%= property.label %></label>
|
2
|
+
<input type="radio" name="<%= property.name %>" id="<%= property.name %>_true" value="1" <% if content.send(property.name) %> checked="checked"<% end %>/> <label class="inline" for="<%= property.name %>_true">Yes</label>
|
3
|
+
<input type="radio" name="<%= property.name %>" id="<%= property.name %>_false" value="0" <% if not content.send(property.name) %> checked="checked"<% end %>/> <label class="inline" for="<%= property.name %>_false">No</label>
|
@@ -1,2 +1,2 @@
|
|
1
|
-
<label for="<%= property.name %>"><%= property.
|
2
|
-
<input type="text" name="<%= property.name %>" id="<%= property.name %>" value="<%= (content.send(property.name
|
1
|
+
<label for="<%= property.name %>"><%= property.label %></label>
|
2
|
+
<input type="text" name="<%= property.name %>" id="<%= property.name %>" value="<%= (content.send(property.name) || Time.now).strftime("%B %d, %Y %I:%M%p") %>" />
|
@@ -1,2 +1,2 @@
|
|
1
|
-
<label for="<%= property.name %>"><%= property.
|
2
|
-
<input type="text" name="<%= property.name %>" id="<%= property.name %>" value="<%= content.send(property.name
|
1
|
+
<label for="<%= property.name %>"><%= property.label %></label>
|
2
|
+
<input type="text" name="<%= property.name %>" id="<%= property.name %>" value="<%= content.send(property.name) %>" />
|
@@ -1,7 +1,7 @@
|
|
1
|
-
<% content_count = content.send(property.name
|
2
|
-
<% related_ids = content.send(property.name
|
3
|
-
<% related_content = content.send(property.name
|
4
|
-
<% related_model = property.
|
1
|
+
<% content_count = content.send(property.name).size %>
|
2
|
+
<% related_ids = content.send(property.name).map(&:id) %>
|
3
|
+
<% related_content = content.send(property.name)[0...10] %>
|
4
|
+
<% related_model = property.model %>
|
5
5
|
<input type="hidden" name="related_<%= property.name %>" class="related_ids" value="unset" />
|
6
6
|
<label for="<%= property.name %>"><%= related_model.display_name %></label>
|
7
7
|
<div class="search" id="search-<%= related_model.name %>">
|
@@ -17,7 +17,7 @@
|
|
17
17
|
<tr>
|
18
18
|
<th class="checkbox"> </th>
|
19
19
|
<% related_model.get_list_properties.each do |p| %>
|
20
|
-
<th><%= p.
|
20
|
+
<th><%= p.humanized_name %></th>
|
21
21
|
<% end %>
|
22
22
|
</tr>
|
23
23
|
</thead>
|
@@ -44,7 +44,8 @@
|
|
44
44
|
<tr>
|
45
45
|
<td class="checkbox"><input type="checkbox" name="selection[<%= c.id %>]" value="<%= c.id %>" id="selection_<%= related_model.name %>_<%= c.id %>" checked="checked" /></td>
|
46
46
|
<% related_model.get_list_properties.each_with_index do |p,i| %>
|
47
|
-
|
47
|
+
<% v = c.send(p.name) || '-' %>
|
48
|
+
<td><% if i == 0 %><a href="/edit/<%= related_model.name %>/<%= c.id %>"><%= v %></a><% else %><%= v %><% end %></td>
|
48
49
|
<% end %>
|
49
50
|
</tr>
|
50
51
|
<% end %>
|
@@ -1,2 +1,2 @@
|
|
1
|
-
<label for="<%= property.name %>"><%= property.
|
2
|
-
<input type="text" name="<%= property.name %>" id="<%= property.name %>" value="<%= content.send(property.name
|
1
|
+
<label for="<%= property.name %>"><%= property.label %></label>
|
2
|
+
<input type="text" name="<%= property.name %>" id="<%= property.name %>" value="<%= content.send(property.name) %>" />
|
@@ -1,7 +1,7 @@
|
|
1
|
-
<% content_count = content.send(property.name
|
2
|
-
<% related_ids = content.send(property.name
|
3
|
-
<% related_content = content.send(property.name
|
4
|
-
<% related_model = property.
|
1
|
+
<% content_count = content.send(property.name).size %>
|
2
|
+
<% related_ids = content.send(property.name).map(&:id) %>
|
3
|
+
<% related_content = content.send(property.name)[0...10] %>
|
4
|
+
<% related_model = property.model %>
|
5
5
|
<input type="hidden" name="related_<%= property.name %>" class="related_ids" value="unset" />
|
6
6
|
<label for="<%= property.name %>"><%= related_model.display_name %></label>
|
7
7
|
<div class="search" id="search-<%= related_model.name %>">
|
@@ -17,7 +17,7 @@
|
|
17
17
|
<tr>
|
18
18
|
<th class="checkbox"> </th>
|
19
19
|
<% related_model.get_list_properties.each do |p| %>
|
20
|
-
<th><%= p.
|
20
|
+
<th><%= p.humanized_name %></th>
|
21
21
|
<% end %>
|
22
22
|
</tr>
|
23
23
|
</thead>
|
@@ -44,7 +44,8 @@
|
|
44
44
|
<tr>
|
45
45
|
<td class="checkbox"><input type="checkbox" name="selection[<%= c.id %>]" value="<%= c.id %>" id="selection_<%= related_model.name %>_<%= c.id %>" checked="checked" /></td>
|
46
46
|
<% related_model.get_list_properties.each_with_index do |p,i| %>
|
47
|
-
|
47
|
+
<% v = c.send(p.name) || '-' %>
|
48
|
+
<td><% if i == 0 %><a href="/edit/<%= related_model.name %>/<%= c.id %>"><%= v %></a><% else %><%= v %><% end %></td>
|
48
49
|
<% end %>
|
49
50
|
</tr>
|
50
51
|
<% end %>
|
@@ -1,2 +1,2 @@
|
|
1
|
-
<label for="<%= property.name %>"><%= property.
|
2
|
-
<input type="text" name="<%= property.name %>" id="<%= property.name %>" value="<%= content.send(property.name
|
1
|
+
<label for="<%= property.name %>"><%= property.label %></label>
|
2
|
+
<input type="text" name="<%= property.name %>" id="<%= property.name %>" value="<%= content.send(property.name) %>" />
|
@@ -1,2 +1,2 @@
|
|
1
|
-
<label for="<%= property.name %>"><%= property.
|
2
|
-
<textarea name="<%= property.name %>" id="<%= property.name %>" rows="10" cols="50"><%= content.send(property.name
|
1
|
+
<label for="<%= property.name %>"><%= property.label %></label>
|
2
|
+
<textarea name="<%= property.name %>" id="<%= property.name %>" rows="10" cols="50"><%= content.send(property.name) %></textarea>
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: togo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
version: 0.6.
|
9
|
+
- 2
|
10
|
+
version: 0.6.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Matt King
|
@@ -15,29 +15,13 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-11-
|
18
|
+
date: 2010-11-18 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
22
|
-
name: dm-core
|
23
|
-
prerelease: false
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ">"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 53
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
- 10
|
33
|
-
- 1
|
34
|
-
version: 0.10.1
|
35
|
-
type: :runtime
|
36
|
-
version_requirements: *id001
|
37
21
|
- !ruby/object:Gem::Dependency
|
38
22
|
name: erubis
|
39
23
|
prerelease: false
|
40
|
-
requirement: &
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
41
25
|
none: false
|
42
26
|
requirements:
|
43
27
|
- - ">"
|
@@ -49,8 +33,8 @@ dependencies:
|
|
49
33
|
- 0
|
50
34
|
version: 0.0.0
|
51
35
|
type: :runtime
|
52
|
-
version_requirements: *
|
53
|
-
description: With a few lines of code in your Ruby ORMs, you get a highly configurable and extensive content
|
36
|
+
version_requirements: *id001
|
37
|
+
description: With a few lines of code in your Ruby ORMs, you get a highly configurable and extensive content management tool (CMS).
|
54
38
|
email: matt@mking.me
|
55
39
|
executables:
|
56
40
|
- togo-admin
|
@@ -95,6 +79,7 @@ files:
|
|
95
79
|
- lib/togo/dispatch/dispatch.rb
|
96
80
|
- lib/togo/dispatch.rb
|
97
81
|
- lib/togo/model/model.rb
|
82
|
+
- lib/togo/model/property_wrapper/property_wrapper.rb
|
98
83
|
- lib/togo/model/relationship_manager/many_to_one.rb
|
99
84
|
- lib/togo/model/relationship_manager/one_to_many.rb
|
100
85
|
- lib/togo/model/relationship_manager/relationship_manager.rb
|
@@ -147,6 +132,6 @@ rubyforge_project:
|
|
147
132
|
rubygems_version: 1.3.7
|
148
133
|
signing_key:
|
149
134
|
specification_version: 3
|
150
|
-
summary:
|
135
|
+
summary: CMS Framework for Ruby ORMs
|
151
136
|
test_files: []
|
152
137
|
|