cartoonist-tags 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/app/controllers/admin/tags_controller.rb +22 -0
- data/app/controllers/tags_controller.rb +9 -0
- data/app/models/entity_tag.rb +36 -0
- data/app/models/tag.rb +43 -0
- data/app/views/admin/tags/_entity_tags.html.erb +36 -0
- data/app/views/layouts/tags.html.erb +17 -0
- data/app/views/tags/_entity_tags.html.erb +12 -0
- data/app/views/tags/show.html.erb +10 -0
- data/cartoonist-tags.gemspec +15 -0
- data/config/locales/en.yml +7 -0
- data/db/migrate/20120525062923_create_tags.rb +19 -0
- data/lib/cartoonist-tags/engine.rb +34 -0
- data/lib/cartoonist-tags.rb +3 -0
- metadata +69 -0
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
class Admin::TagsController < CartoonistController
|
2
|
+
before_filter :preview!, :only => [:show]
|
3
|
+
before_filter :ensure_ssl!
|
4
|
+
before_filter :check_admin!
|
5
|
+
|
6
|
+
def show
|
7
|
+
@tag = Tag.find params[:id].to_i
|
8
|
+
render "tags/show", :layout => "tags"
|
9
|
+
end
|
10
|
+
|
11
|
+
def create
|
12
|
+
entity_tag = EntityTag.create_tag params
|
13
|
+
redirect_to entity_tag.entity.entity_edit_url
|
14
|
+
end
|
15
|
+
|
16
|
+
def destroy
|
17
|
+
entity_tag = EntityTag.tagged_entity params
|
18
|
+
entity = entity_tag.entity
|
19
|
+
entity_tag.untag!
|
20
|
+
redirect_to entity.entity_edit_url
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class EntityTag < ActiveRecord::Base
|
2
|
+
include BelongsToEntity
|
3
|
+
belongs_to :tag
|
4
|
+
validate :entity_doesnt_change, :on => :update
|
5
|
+
attr_accessible :entity_id, :entity_type, :tag_id
|
6
|
+
|
7
|
+
def posted_header
|
8
|
+
if entity.kind_of?(Postable) && entity.posted_at
|
9
|
+
"#{entity.posted_at.to_time.localtime.strftime "%m/%d/%Y"}:"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def untag!
|
14
|
+
destroy
|
15
|
+
remaining = EntityTag.where(:tag_id => tag.id).count
|
16
|
+
tag.destroy if remaining == 0
|
17
|
+
end
|
18
|
+
|
19
|
+
class << self
|
20
|
+
def create_tag(params)
|
21
|
+
tag = Tag.with_label params[:label]
|
22
|
+
result = where(:tag_id => tag.id, :entity_id => params[:entity_id].to_i, :entity_type => params[:entity_type]).first
|
23
|
+
result = create :tag_id => tag.id, :entity_id => params[:entity_id].to_i, :entity_type => params[:entity_type] unless result
|
24
|
+
result
|
25
|
+
end
|
26
|
+
|
27
|
+
def tagged_entity(params)
|
28
|
+
where(:tag_id => params[:id].to_i, :entity_id => params[:entity_id].to_i, :entity_type => params[:entity_type]).first
|
29
|
+
end
|
30
|
+
|
31
|
+
def tags_for(entity)
|
32
|
+
tag_ids = where(:entity_id => entity.id, :entity_type => entity.entity_type).pluck(:tag_id)
|
33
|
+
Tag.where(:id => tag_ids).order(:label).all
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/app/models/tag.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
class Tag < ActiveRecord::Base
|
2
|
+
has_many :entity_tags
|
3
|
+
attr_accessible :label
|
4
|
+
|
5
|
+
def previewable_url(preview)
|
6
|
+
if preview
|
7
|
+
"/admin/tags/#{id}"
|
8
|
+
else
|
9
|
+
"/tags/#{id}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def shown_entity_tags(preview)
|
14
|
+
@shown_entity_tags ||= entity_tags.all.select do |entity_tag|
|
15
|
+
preview || !entity_tag.entity.kind_of?(Postable) || entity_tag.entity.posted?
|
16
|
+
end.sort do |a, b|
|
17
|
+
if a.entity.kind_of?(Postable) && a.entity.posted_at && b.entity.kind_of?(Postable) && b.entity.posted_at
|
18
|
+
b.entity.posted_at.to_date <=> a.entity.posted_at.to_date
|
19
|
+
elsif a.entity.kind_of?(Postable) && a.entity.posted_at
|
20
|
+
1
|
21
|
+
elsif b.entity.kind_of?(Postable) && b.entity.posted_at
|
22
|
+
-1
|
23
|
+
else
|
24
|
+
a.description <=> b.description
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
raise ActiveRecord::RecordNotFound.new("No records found!") if @shown_entity_tags.empty?
|
29
|
+
@shown_entity_tags
|
30
|
+
end
|
31
|
+
|
32
|
+
class << self
|
33
|
+
def existing
|
34
|
+
order(:label).all
|
35
|
+
end
|
36
|
+
|
37
|
+
def with_label(label)
|
38
|
+
tag = where(:label => label).first
|
39
|
+
tag = create :label => label unless tag
|
40
|
+
tag
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<% tags = EntityTag.tags_for entity %>
|
2
|
+
<% existing_tags = Tag.existing %>
|
3
|
+
<% unless tags.empty? %>
|
4
|
+
<h2><%= t "admin.tags.entity_tags.existing_tags" %></h2>
|
5
|
+
|
6
|
+
<ul>
|
7
|
+
<% tags.each do |tag| %>
|
8
|
+
<li>
|
9
|
+
<%= tag.label %>
|
10
|
+
<%= form_tag "/admin/tags/#{tag.id}", :method => :delete, :class => "inline" do %>
|
11
|
+
<input type="hidden" name="entity_id" value="<%= entity.id %>" />
|
12
|
+
<input type="hidden" name="entity_type" value="<%= entity.entity_type %>" />
|
13
|
+
<input type="submit" value="<%= t "admin.tags.entity_tags.delete_tag" %>" />
|
14
|
+
<% end %>
|
15
|
+
</li>
|
16
|
+
<% end %>
|
17
|
+
</ul>
|
18
|
+
<% end %>
|
19
|
+
<%= form_tag "/admin/tags", :method => :post do %>
|
20
|
+
<input type="hidden" name="entity_id" value="<%= entity.id %>" />
|
21
|
+
<input type="hidden" name="entity_type" value="<%= entity.entity_type %>" />
|
22
|
+
<input type="text" name="label" />
|
23
|
+
<input type="submit" value="<%= t "admin.tags.entity_tags.add_tag" %>" />
|
24
|
+
<% end %>
|
25
|
+
<% unless existing_tags.empty? %>
|
26
|
+
<%= form_tag "/admin/tags", :method => :post do %>
|
27
|
+
<input type="hidden" name="entity_id" value="<%= entity.id %>" />
|
28
|
+
<input type="hidden" name="entity_type" value="<%= entity.entity_type %>" />
|
29
|
+
<select name="label">
|
30
|
+
<% existing_tags.each do |tag| %>
|
31
|
+
<option value="<%= tag.label %>"><%= tag.label %></option>
|
32
|
+
<% end %>
|
33
|
+
</select>
|
34
|
+
<input type="submit" value="<%= t "admin.tags.entity_tags.add_tag" %>" />
|
35
|
+
<% end %>
|
36
|
+
<% end %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<% content_for :content_class, "tags-content" %>
|
2
|
+
|
3
|
+
<% content_for :content do %>
|
4
|
+
<div class="tags-page">
|
5
|
+
<h1><%= yield :title %></h1>
|
6
|
+
|
7
|
+
<%= yield %>
|
8
|
+
</div>
|
9
|
+
<% end %>
|
10
|
+
|
11
|
+
<% content_for :admin_content do %>
|
12
|
+
<% if preview? %>
|
13
|
+
<p><a href="/admin/main">admin</a></p>
|
14
|
+
<% end %>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
<%= render :template => "layouts/cartoonist" %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<% content_for :title, "Things tagged '#{@tag.label}'" %>
|
2
|
+
|
3
|
+
<ul>
|
4
|
+
<% @tag.shown_entity_tags(preview?).each do |entity_tag| %>
|
5
|
+
<li>
|
6
|
+
<%= entity_tag.posted_header %>
|
7
|
+
<a href="<%= entity_tag.entity.entity_relative_previewable_url preview? %>"><%= entity_tag.description %></a>
|
8
|
+
</li>
|
9
|
+
<% end %>
|
10
|
+
</ul>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
raise "Cannot find version file!" unless File.exists?(File.join(File.dirname(__FILE__), "../CARTOONIST_VERSION"))
|
3
|
+
cartoonist_version = File.read(File.join(File.dirname(__FILE__), "../CARTOONIST_VERSION")).strip
|
4
|
+
s.name = "cartoonist-tags"
|
5
|
+
s.version = cartoonist_version
|
6
|
+
s.date = Time.now.strftime "%Y-%m-%d"
|
7
|
+
s.summary = "Cartoonist Tags"
|
8
|
+
s.description = "Plugin for tagging cartoonist entities."
|
9
|
+
s.authors = ["Mike Virata-Stone"]
|
10
|
+
s.email = "reasonnumber@gmail.com"
|
11
|
+
s.files = `git ls-files`.split("\n")
|
12
|
+
s.require_paths = ["lib"]
|
13
|
+
s.homepage = "http://reasonnumber.com/cartoonist"
|
14
|
+
s.add_dependency "cartoonist", cartoonist_version
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class CreateTags < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :tags do |t|
|
4
|
+
t.string :label, :null => false
|
5
|
+
t.timestamps
|
6
|
+
end
|
7
|
+
|
8
|
+
add_index :tags, :label, :unique => true
|
9
|
+
|
10
|
+
create_table :entity_tags do |t|
|
11
|
+
t.integer :entity_id, :null => false
|
12
|
+
t.string :entity_type, :null => false
|
13
|
+
t.integer :tag_id, :null => false
|
14
|
+
t.timestamps
|
15
|
+
end
|
16
|
+
|
17
|
+
add_index :entity_tags, [:entity_id, :entity_type, :tag_id], :unique => true
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module CartoonistTags
|
2
|
+
class EntityHooks
|
3
|
+
class << self
|
4
|
+
def edit_entity_before_partial
|
5
|
+
"admin/tags/entity_tags"
|
6
|
+
end
|
7
|
+
|
8
|
+
def show_entity_before_partial
|
9
|
+
"tags/entity_tags"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Engine < ::Rails::Engine
|
15
|
+
Cartoonist::Migration.add_for self
|
16
|
+
Cartoonist::Entity.register_hooks CartoonistTags::EntityHooks
|
17
|
+
|
18
|
+
Cartoonist::Backup.for :tags do
|
19
|
+
Tag.order(:id)
|
20
|
+
end
|
21
|
+
|
22
|
+
Cartoonist::Backup.for :entity_tags do
|
23
|
+
EntityTag.order(:id)
|
24
|
+
end
|
25
|
+
|
26
|
+
Cartoonist::Routes.add do
|
27
|
+
resources :tags
|
28
|
+
|
29
|
+
namespace :admin do
|
30
|
+
resources :tags
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cartoonist-tags
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.11
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Mike Virata-Stone
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-25 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: cartoonist
|
16
|
+
requirement: &13712940 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - =
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.0.11
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *13712940
|
25
|
+
description: Plugin for tagging cartoonist entities.
|
26
|
+
email: reasonnumber@gmail.com
|
27
|
+
executables: []
|
28
|
+
extensions: []
|
29
|
+
extra_rdoc_files: []
|
30
|
+
files:
|
31
|
+
- .gitignore
|
32
|
+
- app/controllers/admin/tags_controller.rb
|
33
|
+
- app/controllers/tags_controller.rb
|
34
|
+
- app/models/entity_tag.rb
|
35
|
+
- app/models/tag.rb
|
36
|
+
- app/views/admin/tags/_entity_tags.html.erb
|
37
|
+
- app/views/layouts/tags.html.erb
|
38
|
+
- app/views/tags/_entity_tags.html.erb
|
39
|
+
- app/views/tags/show.html.erb
|
40
|
+
- cartoonist-tags.gemspec
|
41
|
+
- config/locales/en.yml
|
42
|
+
- db/migrate/20120525062923_create_tags.rb
|
43
|
+
- lib/cartoonist-tags.rb
|
44
|
+
- lib/cartoonist-tags/engine.rb
|
45
|
+
homepage: http://reasonnumber.com/cartoonist
|
46
|
+
licenses: []
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
requirements: []
|
64
|
+
rubyforge_project:
|
65
|
+
rubygems_version: 1.8.17
|
66
|
+
signing_key:
|
67
|
+
specification_version: 3
|
68
|
+
summary: Cartoonist Tags
|
69
|
+
test_files: []
|