wontomedia 0.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.
Files changed (193) hide show
  1. data/COPYING +661 -0
  2. data/COPYING.DOCUMENTATION +450 -0
  3. data/LICENSE +661 -0
  4. data/README.markdown +56 -0
  5. data/Rakefile +185 -0
  6. data/VERSION.yml +4 -0
  7. data/app/controllers/admin_controller.rb +144 -0
  8. data/app/controllers/application_controller.rb +29 -0
  9. data/app/controllers/connections_controller.rb +150 -0
  10. data/app/controllers/items_controller.rb +365 -0
  11. data/app/helpers/connections_helper.rb +67 -0
  12. data/app/helpers/format_helper.rb +154 -0
  13. data/app/helpers/items_helper.rb +105 -0
  14. data/app/models/category_item.rb +23 -0
  15. data/app/models/connection.rb +210 -0
  16. data/app/models/individual_item.rb +23 -0
  17. data/app/models/item.rb +86 -0
  18. data/app/models/property_item.rb +23 -0
  19. data/app/models/qualified_item.rb +23 -0
  20. data/app/views/admin/index.html.erb +74 -0
  21. data/app/views/connections/_index_outbound_links.html.erb +48 -0
  22. data/app/views/connections/_spo_select_controls.html.erb +151 -0
  23. data/app/views/connections/edit.html.erb +70 -0
  24. data/app/views/connections/index.html.erb +84 -0
  25. data/app/views/connections/new.html.erb +61 -0
  26. data/app/views/connections/show.html.erb +110 -0
  27. data/app/views/items/_active_content.html.erb +26 -0
  28. data/app/views/items/_content_examples.html.erb +55 -0
  29. data/app/views/items/_core_tasks.html.erb +23 -0
  30. data/app/views/items/_form_fields.html.erb +69 -0
  31. data/app/views/items/_list_outbound_links.html.erb +58 -0
  32. data/app/views/items/_screen_select.html.erb +24 -0
  33. data/app/views/items/_show_outbound_links.html.erb +70 -0
  34. data/app/views/items/_topic_list.html.erb +26 -0
  35. data/app/views/items/_type_select.html.erb +47 -0
  36. data/app/views/items/edit.html.erb +63 -0
  37. data/app/views/items/index.html.erb +74 -0
  38. data/app/views/items/new.html.erb +124 -0
  39. data/app/views/items/newpop.html.erb +58 -0
  40. data/app/views/items/show.html.erb +209 -0
  41. data/app/views/layouts/_amazon_ads.html.erb +55 -0
  42. data/app/views/layouts/_glossary_help_box.html.erb +43 -0
  43. data/app/views/layouts/_google_ads.html.erb +40 -0
  44. data/app/views/layouts/_language_select.html.erb +24 -0
  45. data/app/views/layouts/_login_controls.html.erb +24 -0
  46. data/app/views/layouts/_master_help.html.erb +24 -0
  47. data/app/views/layouts/_navigation_menu.html.erb +39 -0
  48. data/app/views/layouts/_search_box.html.erb +27 -0
  49. data/app/views/layouts/_status_msgs.html.erb +25 -0
  50. data/app/views/layouts/application.html.erb +67 -0
  51. data/app/views/layouts/base.html.erb +93 -0
  52. data/app/views/layouts/home.html.erb +67 -0
  53. data/app/views/layouts/popup.html.erb +23 -0
  54. data/assets/wontomedia-sample.rb +47 -0
  55. data/config/asset_packages.yml +44 -0
  56. data/config/boot.rb +110 -0
  57. data/config/cucumber.yml +65 -0
  58. data/config/database-mysql-development.yml +47 -0
  59. data/config/database-mysql.yml +26 -0
  60. data/config/environment.rb +94 -0
  61. data/config/environments/cucumber.rb +29 -0
  62. data/config/environments/development.rb +26 -0
  63. data/config/environments/production.rb +33 -0
  64. data/config/environments/test.rb +31 -0
  65. data/config/initializers/inflections.rb +19 -0
  66. data/config/initializers/mime_types.rb +14 -0
  67. data/config/initializers/new_rails_defaults.rb +26 -0
  68. data/config/locales/en.yml +14 -0
  69. data/config/routes.rb +37 -0
  70. data/db/fixtures/connections.yml +96 -0
  71. data/db/fixtures/items.yml +277 -0
  72. data/db/migrate/20090312212805_create_items.rb +31 -0
  73. data/db/migrate/20090406221320_create_connections.rb +32 -0
  74. data/db/migrate/20090411014503_add_type_for_item_subclasses.rb +29 -0
  75. data/db/migrate/20090415142152_rename_item_type.rb +31 -0
  76. data/db/migrate/20090518022918_rename_object_and_self.rb +33 -0
  77. data/db/migrate/20090529171442_add_flags_to_items.rb +27 -0
  78. data/db/migrate/20090529171508_add_flags_to_connections.rb +27 -0
  79. data/db/migrate/20090605213800_flags_columns_not_null.rb +29 -0
  80. data/db/migrate/20090605215028_flags_columns_default_zero.rb +29 -0
  81. data/db/schema.rb +30 -0
  82. data/default-custom/app/views/items/_home_extern_list.html.erb +32 -0
  83. data/default-custom/app/views/items/_home_introductory_text.html.erb +70 -0
  84. data/default-custom/app/views/items/home.html.erb +77 -0
  85. data/default-custom/public/images/logo.png +0 -0
  86. data/default-custom/public/images/logo.svg +74 -0
  87. data/default-custom/public/stylesheets/wm.css +301 -0
  88. data/doc/README.markdown +44 -0
  89. data/doc/README_FOR_APP +82 -0
  90. data/doc/customization.markdown +93 -0
  91. data/doc/scripts/rake-customize.markdown +83 -0
  92. data/lib/helpers/connection_helper.rb +41 -0
  93. data/lib/helpers/item_helper.rb +141 -0
  94. data/lib/helpers/tripple_navigation.rb +158 -0
  95. data/lib/tasks/cucumber.rake +83 -0
  96. data/lib/tasks/customize.rake +70 -0
  97. data/lib/tasks/db.rake +65 -0
  98. data/lib/tasks/javascript_testing_tasks.rake +176 -0
  99. data/public/404.html +50 -0
  100. data/public/422.html +50 -0
  101. data/public/500.html +53 -0
  102. data/public/dispatch.cgi +20 -0
  103. data/public/dispatch.fcgi +34 -0
  104. data/public/dispatch.rb +20 -0
  105. data/public/favicon.ico +0 -0
  106. data/public/images/blank_error_icon.png +0 -0
  107. data/public/images/blank_status_icon.png +0 -0
  108. data/public/images/error_error_icon.png +0 -0
  109. data/public/images/error_status_icon.png +0 -0
  110. data/public/images/good_status_icon.png +0 -0
  111. data/public/images/help_icon.png +0 -0
  112. data/public/images/twitter_icon.png +0 -0
  113. data/public/images/warn_error_icon.png +0 -0
  114. data/public/images/working_status_icon.gif +0 -0
  115. data/public/javascripts/application.js +56 -0
  116. data/public/javascripts/controls.js +963 -0
  117. data/public/javascripts/dragdrop.js +973 -0
  118. data/public/javascripts/effects.js +1128 -0
  119. data/public/javascripts/event.simulate.js +64 -0
  120. data/public/javascripts/fancybox.js +43 -0
  121. data/public/javascripts/forConnectionsForms.js +218 -0
  122. data/public/javascripts/forItemsForms.js +511 -0
  123. data/public/javascripts/itemCreatePopup.js +115 -0
  124. data/public/javascripts/itemTitleToName.js +119 -0
  125. data/public/javascripts/jquery.js +4376 -0
  126. data/public/javascripts/modalbox.js +502 -0
  127. data/public/javascripts/prototype.js +4320 -0
  128. data/public/javascripts/reconcileJQueryAndPrototype.js +19 -0
  129. data/public/robots.txt +7 -0
  130. data/public/stylesheets/blank.gif +0 -0
  131. data/public/stylesheets/fancy_close.png +0 -0
  132. data/public/stylesheets/fancy_loading.png +0 -0
  133. data/public/stylesheets/fancy_nav_left.png +0 -0
  134. data/public/stylesheets/fancy_nav_right.png +0 -0
  135. data/public/stylesheets/fancy_shadow_e.png +0 -0
  136. data/public/stylesheets/fancy_shadow_n.png +0 -0
  137. data/public/stylesheets/fancy_shadow_ne.png +0 -0
  138. data/public/stylesheets/fancy_shadow_nw.png +0 -0
  139. data/public/stylesheets/fancy_shadow_s.png +0 -0
  140. data/public/stylesheets/fancy_shadow_se.png +0 -0
  141. data/public/stylesheets/fancy_shadow_sw.png +0 -0
  142. data/public/stylesheets/fancy_shadow_w.png +0 -0
  143. data/public/stylesheets/fancy_title_left.png +0 -0
  144. data/public/stylesheets/fancy_title_main.png +0 -0
  145. data/public/stylesheets/fancy_title_over.png +0 -0
  146. data/public/stylesheets/fancy_title_right.png +0 -0
  147. data/public/stylesheets/fancybox.css +333 -0
  148. data/public/stylesheets/modalbox.css +110 -0
  149. data/public/stylesheets/scaffold.css +36 -0
  150. data/public/stylesheets/spinner.gif +0 -0
  151. data/script/about +4 -0
  152. data/script/console +3 -0
  153. data/script/cucumber +10 -0
  154. data/script/dbconsole +3 -0
  155. data/script/destroy +3 -0
  156. data/script/generate +3 -0
  157. data/script/performance/benchmarker +3 -0
  158. data/script/performance/profiler +3 -0
  159. data/script/performance/request +3 -0
  160. data/script/plugin +3 -0
  161. data/script/process/inspector +3 -0
  162. data/script/process/reaper +3 -0
  163. data/script/process/spawner +3 -0
  164. data/script/runner +3 -0
  165. data/script/server +3 -0
  166. data/vendor/plugins/asset_packager/CHANGELOG +122 -0
  167. data/vendor/plugins/asset_packager/README +178 -0
  168. data/vendor/plugins/asset_packager/Rakefile +22 -0
  169. data/vendor/plugins/asset_packager/about.yml +8 -0
  170. data/vendor/plugins/asset_packager/init.rb +2 -0
  171. data/vendor/plugins/asset_packager/install.rb +1 -0
  172. data/vendor/plugins/asset_packager/lib/jsmin.rb +205 -0
  173. data/vendor/plugins/asset_packager/lib/synthesis/asset_package.rb +212 -0
  174. data/vendor/plugins/asset_packager/lib/synthesis/asset_package_helper.rb +39 -0
  175. data/vendor/plugins/asset_packager/tasks/asset_packager_tasks.rake +23 -0
  176. data/vendor/plugins/asset_packager/test/asset_package_helper_development_test.rb +100 -0
  177. data/vendor/plugins/asset_packager/test/asset_package_helper_production_test.rb +140 -0
  178. data/vendor/plugins/asset_packager/test/asset_packager_test.rb +92 -0
  179. data/vendor/plugins/asset_packager/test/asset_packages.yml +20 -0
  180. data/vendor/plugins/asset_packager/test/assets/javascripts/application.js +2 -0
  181. data/vendor/plugins/asset_packager/test/assets/javascripts/bar.js +4 -0
  182. data/vendor/plugins/asset_packager/test/assets/javascripts/controls.js +815 -0
  183. data/vendor/plugins/asset_packager/test/assets/javascripts/dragdrop.js +913 -0
  184. data/vendor/plugins/asset_packager/test/assets/javascripts/effects.js +958 -0
  185. data/vendor/plugins/asset_packager/test/assets/javascripts/foo.js +4 -0
  186. data/vendor/plugins/asset_packager/test/assets/javascripts/prototype.js +2006 -0
  187. data/vendor/plugins/asset_packager/test/assets/stylesheets/bar.css +16 -0
  188. data/vendor/plugins/asset_packager/test/assets/stylesheets/foo.css +16 -0
  189. data/vendor/plugins/asset_packager/test/assets/stylesheets/header.css +16 -0
  190. data/vendor/plugins/asset_packager/test/assets/stylesheets/screen.css +16 -0
  191. data/vendor/plugins/asset_packager/test/assets/stylesheets/subdir/bar.css +16 -0
  192. data/vendor/plugins/asset_packager/test/assets/stylesheets/subdir/foo.css +16 -0
  193. metadata +265 -0
@@ -0,0 +1,105 @@
1
+ #--
2
+ # WontoMedia - a wontology web application
3
+ # Copyright (C) 2010 - Glen E. Ivey
4
+ # www.wontology.com
5
+ #
6
+ # This program is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License version
8
+ # 3 as published by the Free Software Foundation.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Affero General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Affero General Public License
16
+ # along with this program in the file COPYING and/or LICENSE. If not,
17
+ # see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+
21
+ require Rails.root.join( 'app', 'helpers', 'format_helper' )
22
+ include(FormatHelper)
23
+
24
+ # Helpers for app/views/items/* pages
25
+ module ItemsHelper
26
+
27
+ # This method is called with the _ID_ of an Item and returns markup
28
+ # showing the +title+ string for that item which will show a
29
+ # 'tooltip' with the Item's +name+ string on mouse-over. If the
30
+ # argument Item is the same as the Item for which the current view
31
+ # is being generated (the output page's "self", <tt>@item</tt>),
32
+ # then the +title+ will be displayed as simple text. If the
33
+ # argument Item is different from the page's item, then the +title+
34
+ # will be displayed as a link to _that_ Item's +show+ page.
35
+ def self_string_or_other_link(item_id)
36
+ n = @item_hash[item_id]
37
+ title = h filter_parenthetical n.title
38
+ if item_id == @item.id # self
39
+ text_with_tooltip title, h( n.name )
40
+ else # other
41
+ link_with_tooltip title, h( n.name ), item_path(n)
42
+ end
43
+ end
44
+
45
+ # When called, this helper adds to the current page the
46
+ # open-<tt><table></tt> tag and table-heading cells for the table of
47
+ # connection subject-predicate-object Items within the
48
+ # <tt>app/views/items/show</tt> view.
49
+ def output_table_open
50
+ header_style = 'display: block; position: relative;'
51
+ concat(tag 'table', nil, true) # generate an "open" table tag
52
+ concat(content_tag( 'thead',
53
+ content_tag( 'tr',
54
+ content_tag( 'th', '' ) +
55
+ content_tag( 'th',
56
+ content_tag( 'span', '<em>is</em> or <em>has</em>',
57
+ :style => "#{header_style} left: -3em;" )) +
58
+ content_tag( 'th',
59
+ content_tag( 'span', '<em>to</em> or <em>with</em>',
60
+ :style => "#{header_style} left: -1em;" ))
61
+ )
62
+ ))
63
+ end
64
+
65
+ # When called, this helper adds to the current page the closing
66
+ # <tt></table></tt> tag for the table of connection
67
+ # subject-predicate-object Items within the
68
+ # <tt>app/views/items/show</tt> view.
69
+ def output_table_close
70
+ concat('</table>')
71
+ end
72
+
73
+ # When called, this helper adds to the current page "Edit..." and
74
+ # "Delete" links if they are appropriate for the Item instance
75
+ # passed in. Neither link is "appropriate" for Items flagged in the
76
+ # database as <tt>Item::DATA_IS_UNALTERABLE</tt>. In addition, the
77
+ # "Delete" link will be output only if there are no existing
78
+ # connections in the database which reference the +item+ (as
79
+ # determined by the ItemsController and passed to the view in the
80
+ # <tt>@not_in_use_hash</tt>).
81
+ def generate_item_links(item)
82
+ if (item.flags & Item::DATA_IS_UNALTERABLE) == 0
83
+ concat(
84
+ link_with_help_icon({
85
+ :destination => link_to( 'Edit&hellip;', edit_item_path(item),
86
+ :rel => 'nofollow'),
87
+ :already_generated => @edit_help_icon_used,
88
+ :help_alt => 'Help edit item',
89
+ :which_help => 'ItemEdit' }) )
90
+ @edit_help_icon_used = true
91
+
92
+ if @not_in_use_hash[item.id]
93
+ concat(
94
+ link_with_help_icon({
95
+ :destination => link_to( 'Delete', item_path(item),
96
+ :rel => 'nofollow', :method => :delete,
97
+ :confirm => 'Are you sure?'),
98
+ :already_generated => @delete_help_icon_used,
99
+ :help_alt => 'Help delete item',
100
+ :which_help => 'ItemDelete' }) )
101
+ @delete_help_icon_used = true
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,23 @@
1
+ #--
2
+ # WontoMedia - a wontology web application
3
+ # Copyright (C) 2010 - Glen E. Ivey
4
+ # www.wontology.com
5
+ #
6
+ # This program is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License version
8
+ # 3 as published by the Free Software Foundation.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Affero General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Affero General Public License
16
+ # along with this program in the file COPYING and/or LICENSE. If not,
17
+ # see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+
21
+ # This model class is a child of Item using Rails' single-table inheritance.
22
+ class CategoryItem < Item
23
+ end
@@ -0,0 +1,210 @@
1
+ #--
2
+ # WontoMedia - a wontology web application
3
+ # Copyright (C) 2010 - Glen E. Ivey
4
+ # www.wontology.com
5
+ #
6
+ # This program is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License version
8
+ # 3 as published by the Free Software Foundation.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Affero General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Affero General Public License
16
+ # along with this program in the file COPYING and/or LICENSE. If not,
17
+ # see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+
21
+ require Rails.root.join( 'lib', 'helpers', 'item_helper')
22
+ require Rails.root.join( 'lib', 'helpers', 'tripple_navigation')
23
+
24
+ # Model for the representation of "connections" (which are used to
25
+ # make statements about the relationships between "item") in
26
+ # WontoMedia's database. The schema listing the data fields for a
27
+ # Connection is, of course, in db/schema.rb. And Rails'
28
+ # automatically-provided model methods are based on the field names
29
+ # there.
30
+ #
31
+ # A great deal of this model's behavior is provided by Rails
32
+ # <tt>belongs_to</tt> relations between Connection object fields and
33
+ # Item objects (see source).
34
+ class Connection < ActiveRecord::Base
35
+
36
+ # This constant is a bit mask for Item.flags. A non-zero value
37
+ # indicates that the Item instance should not be user-modifiable.
38
+ DATA_IS_UNALTERABLE = 1
39
+
40
+
41
+ before_validation :complex_validations
42
+ # validates_presence_of :subject, :predicate, :obj
43
+ #explicitly do the equivalent of the above in complex_validations because
44
+ #c_v has to be a "before" callback (so it's return value is checked), which
45
+ #means other validations aren't run yet, so can't count on these IDs to
46
+ #be present/valid. Ugh.
47
+ # validates_uniqueness_of :subject_id, :scope => [:predicate_id, :obj_id]
48
+ #this works, but is subsumed by checks in c_v, so eliminated duplication
49
+
50
+ belongs_to :subject, :class_name => "Item"
51
+ belongs_to :predicate, :class_name => "Item"
52
+ belongs_to :obj, :class_name => "Item"
53
+ belongs_to :connection_desc, :class_name => "Item"
54
+
55
+
56
+
57
+ # This method is a hack to provide a legitimate default value for
58
+ # the +flags+ field of an Item that hasn't been initialized yet.
59
+ # Alternative at http://blog.phusion.nl/2008/10/03/47/
60
+ def flags #:nodoc:
61
+ # Note that the default value returned here must/does match the
62
+ # column default specified in the database schema
63
+ self[:flags] or 0
64
+ end
65
+
66
+
67
+ private
68
+
69
+ # This method performs checks to determine whether an individual
70
+ # Connection, if placed in the context of the rest of WontoMedia's
71
+ # database, would violate any rules about the structure of the
72
+ # relationship network. It is automatically invoked using Rails'
73
+ # <tt>before_validation</tt> hook. In the event that one or more
74
+ # checks fail, this method returns +false+ and places the
75
+ # appropriate message(s) in the +errors+ flash.
76
+ def complex_validations() #:doc:
77
+ [ [subject_id, :subject], [predicate_id, :predicate],
78
+ [obj_id, :obj] ].each do |tocheck|
79
+ field, symbol = *tocheck
80
+ if field.nil?
81
+ errors.add symbol, "can't be blank."
82
+ return false
83
+ end
84
+ end
85
+
86
+ # is there an existing connection with a predicate that is a
87
+ # sub-property or super-property of the current predicate?
88
+ # check for duplicate connection and all super-properties
89
+ TrippleNavigation.relation_and_all_superproperties(
90
+ predicate_id) do |super_prop|
91
+ unless (Connection.all( :conditions => [
92
+ "subject_id = ? AND predicate_id = ? AND obj_id = ?",
93
+ subject_id, super_prop, obj_id ] ).empty? )
94
+ errors.add :subject, 'relationship (or equivalent) already exists.'
95
+ return false
96
+ end
97
+ end
98
+
99
+ # check for sub-properties
100
+ TrippleNavigation.relation_and_all_subproperties(
101
+ predicate_id) do |sub_prop|
102
+ unless (Connection.all( :conditions => [
103
+ "subject_id = ? AND predicate_id = ? AND obj_id = ?",
104
+ subject_id, sub_prop, obj_id ] ).empty? )
105
+ errors.add :subject, 'equivalent relationship already exists.'
106
+ return false
107
+ end
108
+ end
109
+
110
+
111
+ # is there an existing implied opposing connection?
112
+ # find all connections back-connecting our subject and object, determine
113
+ # if any of their predicates has an (inherited)
114
+ # inverse_relationship to current predicate
115
+ if connections = Connection.all( :conditions => [
116
+ "subject_id = ? AND obj_id = ?", obj_id, subject_id ] )
117
+
118
+ inverse_id = Item.find_by_name("inverse_relationship").id
119
+
120
+ connections.each do |e|
121
+ TrippleNavigation.relation_and_all_superproperties(
122
+ predicate_id) do |proposed_rel|
123
+ TrippleNavigation.relation_and_all_superproperties(
124
+ e.predicate_id) do |existing_rel|
125
+ if Connection.all( :conditions => [
126
+ "subject_id = ? AND predicate_id = ? AND obj_id = ?",
127
+ proposed_rel, inverse_id, existing_rel ] ).length > 0
128
+ errors.add :subject, 'already has this relationship implied.'
129
+ return false
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+
136
+
137
+ #used in many subsequent tests
138
+ spo_id = Item.find_by_name("sub_property_of").id
139
+
140
+
141
+ # would this create an "individual parent_of category" relationship?
142
+ subItem = Item.find(subject_id)
143
+ objItem = Item.find(obj_id)
144
+ # check for "individual parent_of category"
145
+ if subItem.sti_type == ItemHelper::ITEM_INDIVIDUAL_CLASS_NAME &&
146
+ objItem.sti_type == ItemHelper::ITEM_CATEGORY_CLASS_NAME
147
+ if TrippleNavigation.check_properties(
148
+ :does => predicate_id,
149
+ :inherit_from => Item.find_by_name("parent_of").id,
150
+ :via => spo_id)
151
+ errors.add :predicate,
152
+ 'an individual cannot be the parent of a category.'
153
+ return false
154
+ end
155
+ end
156
+
157
+ # check for "category child_of individual"
158
+ if subItem.sti_type == ItemHelper::ITEM_CATEGORY_CLASS_NAME &&
159
+ objItem.sti_type == ItemHelper::ITEM_INDIVIDUAL_CLASS_NAME
160
+ if TrippleNavigation.check_properties(
161
+ :does => predicate_id,
162
+ :inherit_from => Item.find_by_name("child_of").id,
163
+ :via => spo_id)
164
+ errors.add :predicate,
165
+ 'a category cannot be the child of an individual.'
166
+ return false
167
+ end
168
+ end
169
+
170
+
171
+ # would this create a loop (including connection-to-self) of
172
+ # hierarchical or ordered relationships?
173
+ # if this is the kind of property we have to worry about?
174
+ [
175
+ Item.find_by_name("parent_of").id,
176
+ Item.find_by_name("child_of").id,
177
+ Item.find_by_name("sub_property_of").id,
178
+ Item.find_by_name("predecessor_of").id,
179
+ Item.find_by_name("successor_of").id
180
+ ].each do |prop_id|
181
+ if TrippleNavigation.check_properties(
182
+ :does => predicate_id, :inherit_from => prop_id, :via => spo_id)
183
+ if TrippleNavigation.check_properties(
184
+ :does => obj_id, :link_to => subject_id,
185
+ :through_children_of => prop_id )
186
+ errors.add :subject, 'this relationship would create a loop.'
187
+ return false
188
+ end
189
+ end
190
+ end
191
+
192
+ # is this a "bad" connection-to-self?
193
+ if subject_id == obj_id
194
+ [ "inverse_relationship", "hierarchical_relationship",
195
+ "ordered_relationship" ].each do |relation_name|
196
+ if TrippleNavigation.check_properties(
197
+ :does => predicate_id,
198
+ :inherit_from => Item.find_by_name(relation_name).id,
199
+ :via => spo_id )
200
+ errors.add :subject,
201
+ 'cannot create an ordered/hierarchical relationship from an item to itself'
202
+ return false
203
+ end
204
+ end
205
+ end
206
+
207
+
208
+ true
209
+ end
210
+ end
@@ -0,0 +1,23 @@
1
+ #--
2
+ # WontoMedia - a wontology web application
3
+ # Copyright (C) 2010 - Glen E. Ivey
4
+ # www.wontology.com
5
+ #
6
+ # This program is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License version
8
+ # 3 as published by the Free Software Foundation.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Affero General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Affero General Public License
16
+ # along with this program in the file COPYING and/or LICENSE. If not,
17
+ # see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+
21
+ # This model class is a child of Item using Rails' single-table inheritance.
22
+ class IndividualItem < Item
23
+ end
@@ -0,0 +1,86 @@
1
+ #--
2
+ # WontoMedia - a wontology web application
3
+ # Copyright (C) 2010 - Glen E. Ivey
4
+ # www.wontology.com
5
+ #
6
+ # This program is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License version
8
+ # 3 as published by the Free Software Foundation.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Affero General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Affero General Public License
16
+ # along with this program in the file COPYING and/or LICENSE. If not,
17
+ # see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+
21
+ # Model for the representation of "items" (things that can be related
22
+ # to each other through "connections") in WontoMedia's database. The
23
+ # schema listing the data fields for an Item is, of course, in
24
+ # db/schema.rb. And Rails' automatically-provided model methods are
25
+ # based on the field names there.
26
+ #
27
+ # WontoMedia uses Rails' "single-table inheritance" to create several
28
+ # specialized types of Item objects, all of which are stored in the
29
+ # same database table together. The type of object a particular table
30
+ # row represents is determined by that object's <tt>sti_type</tt>
31
+ # field. There are a number of constants and methods in the module
32
+ # ItemHelper that can be used load or evaluate +sti_type+ and to
33
+ # perform generic operations on Item instances that correctly preserve
34
+ # their child class.
35
+ #
36
+ # A great deal of this model's behavior is provided through Rails
37
+ # validation methods (<tt>validates_...</tt>), see the source for
38
+ # details.
39
+ class Item < ActiveRecord::Base
40
+
41
+ # This constant is a bit mask for Item.flags. A non-zero value
42
+ # indicates that the Item instance should not be user-modifiable.
43
+ DATA_IS_UNALTERABLE = 1
44
+
45
+
46
+ self.inheritance_column = "sti_type"
47
+
48
+ # name
49
+ validates_presence_of :name, :message => "Item's name cannot be blank."
50
+ validates_length_of :name, :maximum => 80,
51
+ :message => "Item name must be 80 characters or less."
52
+ validates_each :name do |record, attr, value|
53
+ if !(value =~ /^[a-zA-Z][a-zA-Z0-9._:-]*$/m) ||
54
+ (value =~ /\n/m)
55
+ record.errors.add attr, "must start with a letter, and can contain only"\
56
+ "letters, numbers, and/or the period, colon, dash, and underscore."
57
+ end
58
+ end
59
+ validates_uniqueness_of :name, :message =>
60
+ "There is already a item with the same name."
61
+
62
+ # title
63
+ validates_presence_of :title, :message => "Item's title cannot be blank."
64
+ validates_length_of :title, :maximum => 255,
65
+ :message => "Item title must be 255 characters or less."
66
+ validates_each :title do |record, attr, value|
67
+ if value =~ /[\n\t]/m
68
+ record.errors.add attr, "should not be multiple lines."
69
+ end
70
+ end
71
+
72
+ validates_length_of :description, :maximum => 65000,
73
+ :allow_nil => true, :allow_blank => true,
74
+ :message => "Item description must be 65,000 characters or less."
75
+
76
+
77
+
78
+ # This method is a hack to provide a legitimate default value for
79
+ # the +flags+ field of an Item that hasn't been initialized yet.
80
+ # Alternative at http://blog.phusion.nl/2008/10/03/47/
81
+ def flags #:nodoc:
82
+ # Note that the default value returned here must/does match the
83
+ # column default specified in the database schema
84
+ self[:flags] or 0
85
+ end
86
+ end