lentil 0.5.2 → 0.6.0
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.
- checksums.yaml +4 -4
- data/README.md +6 -2
- data/app/assets/javascripts/lentil/addfancybox.js +49 -56
- data/app/assets/javascripts/lentil/buttonhandler.js +2 -2
- data/app/assets/javascripts/lentil/imageerrors.js +1 -1
- data/app/assets/stylesheets/lentil/breakpoint/sass/_components.scss +9 -1
- data/app/assets/stylesheets/lentil/breakpoint/sass/_structure.scss +2 -2
- data/app/models/lentil/image.rb +11 -25
- data/app/models/lentil/tag.rb +3 -1
- data/app/views/admin/lentil_images/_moderation_form_body.html.erb +10 -1
- data/app/views/admin/lentil_images/flagging_history.html.erb +3 -1
- data/app/views/admin/stats/_stats.html.erb +14 -0
- data/app/views/lentil/images/_image_tiles.erb +15 -13
- data/app/views/lentil/thisorthat/_battle_form.html.erb +4 -2
- data/lib/lentil/admin/flags.rb +1 -1
- data/lib/lentil/admin/images.rb +154 -42
- data/lib/lentil/admin/stats.rb +34 -0
- data/lib/lentil/admin/tags.rb +22 -1
- data/lib/lentil/admin/tagsets.rb +5 -2
- data/lib/lentil/version.rb +1 -1
- data/test/dummy/config/database.yml +2 -2
- data/test/dummy/config/environments/test.rb +6 -0
- data/test/integration/lentil/javascript/image_modal_test.rb +2 -2
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0071e0e9cac7e3e22897146471625cdc522ca8b
|
4
|
+
data.tar.gz: d25b8819f50541f248855b0ac6584bad2ce256d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6fd1f6e993cfa866b1448ba22e0a07a7f5750cc3a527d1a9a2b247c39fcdb324ae97fb177ad4cb4f7a91f0f61cdac0f81a2e12e5ee230920f1adabed2977358
|
7
|
+
data.tar.gz: 878f9f2cbadd5fb71b9804c07d2235a90390c13c126086b6cecca2dd6cdbd09992c426e680280bd554485c7b8c62a403b006c757583056a9fb2fdbd1faaa0b89
|
data/README.md
CHANGED
@@ -17,14 +17,18 @@ Although we are using this gem in production, **this gem should be considered an
|
|
17
17
|
|
18
18
|
lentil has been tested under Ruby 1.9.3 through 2.2.0.
|
19
19
|
|
20
|
+
> We are currently warning against using MySQL due to issues when encoding emoji. PostgreSQL is preferred, but if this is not an option, you may want to follow [this guide](http://tech.taskrabbit.com/blog/2014/04/24/active-record-mysql-and-emoji/).
|
21
|
+
|
20
22
|
### Create a new Rails app with Rails 3.2.x
|
21
23
|
|
22
24
|
```sh
|
23
|
-
rails
|
25
|
+
gem install rails -v '~> 3.2'
|
26
|
+
rails _3.2.22_ new your_app_name
|
24
27
|
cd your_app_name
|
25
28
|
```
|
29
|
+
> In the example above, `3.2.22` should be the version of Rails 3.x that is installed by the `gem` command.
|
26
30
|
|
27
|
-
### Add lentil and therubyracer (or another ExecJS runtime) to your Gemfile and `bundle`
|
31
|
+
### Add lentil and therubyracer (or another ExecJS runtime) to your Gemfile and run `bundle update`
|
28
32
|
|
29
33
|
```ruby
|
30
34
|
gem 'lentil'
|
@@ -18,7 +18,7 @@ function listenforpopstate() {
|
|
18
18
|
// and this doesn't look like an image url
|
19
19
|
// switch to page that matches the url
|
20
20
|
if (!/images\/[0-9]/.test(window.location.pathname)) {
|
21
|
-
|
21
|
+
window.location.href = window.location.pathname;
|
22
22
|
}
|
23
23
|
} else {
|
24
24
|
|
@@ -26,7 +26,7 @@ function listenforpopstate() {
|
|
26
26
|
// but the url looks like an image url
|
27
27
|
// switch to the image page that matches the url
|
28
28
|
if (/images\/[0-9]/.test(window.location.pathname)) {
|
29
|
-
|
29
|
+
window.location.href = window.location.pathname;
|
30
30
|
}
|
31
31
|
}
|
32
32
|
};
|
@@ -45,28 +45,28 @@ function pushimageurl() {
|
|
45
45
|
replacementUrl = replacementUrl.replace("//","/");
|
46
46
|
}
|
47
47
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
48
|
+
// push the url for the displayed image to the browser
|
49
|
+
window.history.pushState(null, null, replacementUrl);
|
50
|
+
|
51
|
+
Lentil.ga_track(['_trackPageview', replacementUrl]);
|
52
|
+
|
53
|
+
// listen for popstate (back/forward button)
|
54
|
+
window.onpopstate = function(){
|
55
|
+
if (/images\/[0-9]/.test(window.location.pathname)) {
|
56
|
+
// if this url looks like an image show url then switch
|
57
|
+
// the browser to the displayed url
|
58
|
+
window.location.href = window.location.pathname;
|
59
|
+
} else {
|
60
|
+
// otherwise switch the popcalled state to true
|
61
|
+
// and close the fancybox
|
62
|
+
FancyBoxCloseFunctionState.popcalled = true;
|
63
|
+
$.fancybox.close();
|
64
|
+
// switch the popcalled flag to false
|
65
|
+
// and the fancybox visible flag to false
|
66
|
+
FancyBoxCloseFunctionState.popcalled = false;
|
67
|
+
FancyBoxCloseFunctionState.fancyboxvisible = false;
|
68
|
+
}
|
69
|
+
};
|
70
70
|
}
|
71
71
|
|
72
72
|
function addfancybox() {
|
@@ -78,42 +78,38 @@ function addfancybox() {
|
|
78
78
|
prevEffect : 'none',
|
79
79
|
live : true,
|
80
80
|
loop : false,
|
81
|
-
|
81
|
+
autoSize : true,
|
82
|
+
fitToView: true,
|
83
|
+
minWidth : 250,
|
84
|
+
scrolling : 'no',
|
82
85
|
type: 'html',
|
83
86
|
helpers : {
|
84
87
|
title : { type : 'inside' },
|
85
88
|
overlay : { locked : false }
|
86
89
|
},
|
87
90
|
aspectRatio : true,
|
88
|
-
|
91
|
+
beforeLoad: function() {
|
92
|
+
var img = $(this.element).children(".instagram-img");
|
89
93
|
|
90
|
-
|
91
|
-
|
92
|
-
|
94
|
+
if($(img).attr("data-media-type") === "video") {
|
95
|
+
this.content = '<video class="fancybox-video" controls="controls" height="100%" width="100%" src="' + this.href + '" oncanplay="$.fancybox.update()"></video>';
|
96
|
+
} else {
|
97
|
+
this.content = '<img class="fancybox-img" src="' + this.href + '" onload="$.fancybox.update()"/>';
|
98
|
+
}
|
99
|
+
return true;
|
100
|
+
},
|
101
|
+
afterLoad: function(current, previous) {
|
102
|
+
// pushing base url so that back/close returns to image gallery
|
103
|
+
// instead of image show
|
104
|
+
window.history.pushState(null,null,FancyBoxCloseFunctionState.pathname);
|
93
105
|
},
|
94
106
|
beforeShow : function() {
|
95
|
-
var img = $(this.element).children(".instagram-img");
|
96
|
-
if($(img).attr("data-media-type") === "video") {
|
97
|
-
var video_url = $(img).attr("src");
|
98
|
-
//this.content = "<video src='" + video_url + "' height='320' width='320' controls='controls'></video>";
|
99
|
-
$(".fancybox-inner").html('<video controls="controls" height="100%" width="90%" src="' + video_url + '"></video>');
|
100
|
-
var vid = $(".fancybox-inner").children("video")[0];
|
101
|
-
vid.oncanplay = function() {
|
102
|
-
$.fancybox.reposition();
|
103
|
-
}
|
104
|
-
}
|
105
|
-
else {
|
106
|
-
var image_url = $(img).attr("src");
|
107
|
-
$(".fancybox-inner").html('<img class="fancybox-image" src="' + image_url + '" />');
|
108
|
-
}
|
109
|
-
|
110
107
|
this.title = $(this.element).next(".text-overlay").html();
|
111
108
|
imageId = $(this.element).parents("div").attr("id");
|
112
109
|
$(".fancybox-wrap").attr('id', imageId);
|
113
110
|
pushimageurl(imageId);
|
114
111
|
},
|
115
112
|
afterShow : function() {
|
116
|
-
|
117
113
|
// checks whether browser understands touch events
|
118
114
|
// if so the next/prev buttons are disabled
|
119
115
|
// and swipe down/right is added to advance slides
|
@@ -130,9 +126,6 @@ function addfancybox() {
|
|
130
126
|
});
|
131
127
|
}
|
132
128
|
|
133
|
-
// adds button handling script to displayed fancybox buttons
|
134
|
-
buttonhandler();
|
135
|
-
|
136
129
|
// this is to check that the fancybox is really visible
|
137
130
|
// afterClose is fired off on fancybox open -- a bug
|
138
131
|
FancyBoxCloseFunctionState.fancyboxvisible = true;
|
@@ -155,14 +148,14 @@ function addfancybox() {
|
|
155
148
|
afterClose : function() {
|
156
149
|
if (FancyBoxCloseFunctionState.popcalled === false && FancyBoxCloseFunctionState.fancyboxvisible === true) {
|
157
150
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
151
|
+
// if after closing the fancybox there is no pop event
|
152
|
+
// and the fancybox is visible
|
153
|
+
// (this afterClose event also fires when fancybox opens
|
154
|
+
// -- a bug we're getting around with this hack)
|
155
|
+
// switch the flags and point the url at the previous page
|
156
|
+
// should be an image tile view (recent, popular, staff picks, etc.)
|
157
|
+
FancyBoxCloseFunctionState.fancyboxvisible = false;
|
158
|
+
window.history.back();
|
166
159
|
}
|
167
160
|
}
|
168
161
|
});
|
@@ -1,6 +1,6 @@
|
|
1
1
|
function buttonhandler() {
|
2
2
|
|
3
|
-
$(".like-btn, .flag-confirm"
|
3
|
+
$("body").on("click", ".like-btn, .flag-confirm", function(e) {
|
4
4
|
button = $(this);
|
5
5
|
imageId = $(".fancybox-wrap, .image-show").attr("id");
|
6
6
|
if (!$(button).is(".already-clicked")) {
|
@@ -20,4 +20,4 @@ function buttonhandler() {
|
|
20
20
|
}
|
21
21
|
e.preventDefault();
|
22
22
|
});
|
23
|
-
}
|
23
|
+
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
function addimageerrors() {
|
2
|
-
$(".instagram-img, .battle-img, .fancybox-img").off("error").on("error", function () {
|
2
|
+
$(".instagram-img, .battle-img, .fancybox-img, .fancybox-video").off("error").on("error", function () {
|
3
3
|
$(this).parents("div.image-tile, li.image-animate-tile").remove();
|
4
4
|
/*if ($("body.images_animate") || $("body.images_staff_picks_animate")) {
|
5
5
|
addanimatedimages();
|
@@ -140,6 +140,14 @@ div.images {
|
|
140
140
|
border-radius: 3px;
|
141
141
|
}
|
142
142
|
|
143
|
+
.fancybox-inner {
|
144
|
+
min-width: 250px;
|
145
|
+
}
|
146
|
+
|
147
|
+
.fancybox-nav {
|
148
|
+
height:90%;
|
149
|
+
}
|
150
|
+
|
143
151
|
.pagination .disabled, .pagination .current {
|
144
152
|
color: #000;
|
145
153
|
}
|
@@ -312,4 +320,4 @@ body.lt-ie8 {
|
|
312
320
|
|
313
321
|
body.lt-ie8 div.image-tile {
|
314
322
|
width: 300px;
|
315
|
-
}
|
323
|
+
}
|
@@ -29,7 +29,7 @@
|
|
29
29
|
.side-filler { width: fluid(0); }
|
30
30
|
|
31
31
|
ul {
|
32
|
-
margin-top:
|
32
|
+
margin-top: 25px;
|
33
33
|
}
|
34
34
|
|
35
35
|
.navbar .library-brand {
|
@@ -219,4 +219,4 @@
|
|
219
219
|
|
220
220
|
@include breakpoint(124, $label: 'microtile'){
|
221
221
|
.image-tile { width: fluid(8); }
|
222
|
-
}
|
222
|
+
}
|
data/app/models/lentil/image.rb
CHANGED
@@ -38,7 +38,7 @@ class Lentil::Image < ActiveRecord::Base
|
|
38
38
|
:do_not_request_donation, :donor_agreement_rejected, :media_type, :video_url, :suppressed
|
39
39
|
|
40
40
|
attr_protected :original_metadata
|
41
|
-
|
41
|
+
|
42
42
|
has_many :won_battles, :class_name => "Battle"
|
43
43
|
has_many :losers, :through => :battles
|
44
44
|
has_many :lost_battles, :class_name => "Battle", :foreign_key => "loser_id"
|
@@ -97,8 +97,8 @@ class Lentil::Image < ActiveRecord::Base
|
|
97
97
|
|
98
98
|
def service_tags
|
99
99
|
begin
|
100
|
-
tag_ids = self.taggings.
|
101
|
-
tags =
|
100
|
+
tag_ids = self.taggings.select { |tagging| tagging.staff_tag == false }.map(&:tag_id)
|
101
|
+
tags = self.tags.select { |tag| tag_ids.include? tag.id}.sort_by(&:name)
|
102
102
|
rescue
|
103
103
|
Rails.logger.error "Error retrieving service_tags"
|
104
104
|
tags = []
|
@@ -107,31 +107,19 @@ class Lentil::Image < ActiveRecord::Base
|
|
107
107
|
|
108
108
|
def staff_tags
|
109
109
|
begin
|
110
|
-
tag_ids = self.taggings.
|
111
|
-
tags =
|
110
|
+
tag_ids = self.taggings.select { |tagging| tagging.staff_tag == true }.map(&:tag_id)
|
111
|
+
tags = self.tags.select { |tag| tag_ids.include? tag.id}.sort_by(&:name)
|
112
112
|
rescue
|
113
113
|
Rails.logger.error "Error retrieving staff_tags"
|
114
114
|
tags = []
|
115
115
|
end
|
116
116
|
end
|
117
117
|
|
118
|
-
def available_staff_tags
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
tags = []
|
124
|
-
else
|
125
|
-
tags = []
|
126
|
-
Lentil::Tag.all.each do |tag|
|
127
|
-
unless system_tag_ids.include? tag.id
|
128
|
-
tags.push(tag)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
if tags.length > 0
|
133
|
-
tags = tags.sort_by(&:name)
|
134
|
-
end
|
118
|
+
def available_staff_tags(all_tags)
|
119
|
+
tags = all_tags - (self.tags - self.staff_tags)
|
120
|
+
|
121
|
+
if tags.length > 0
|
122
|
+
tags = tags.sort_by(&:name)
|
135
123
|
end
|
136
124
|
end
|
137
125
|
|
@@ -189,7 +177,6 @@ class Lentil::Image < ActiveRecord::Base
|
|
189
177
|
}
|
190
178
|
|
191
179
|
state_machine :state, :initial => :pending do
|
192
|
-
|
193
180
|
States.each do |name, value|
|
194
181
|
state name, :value => value
|
195
182
|
end
|
@@ -201,9 +188,8 @@ class Lentil::Image < ActiveRecord::Base
|
|
201
188
|
event :reject do
|
202
189
|
transition all => :rejected
|
203
190
|
end
|
204
|
-
|
205
191
|
end
|
206
|
-
|
192
|
+
|
207
193
|
def original_metadata=(meta)
|
208
194
|
write_attribute(:original_metadata, meta.to_hash)
|
209
195
|
end
|
data/app/models/lentil/tag.rb
CHANGED
@@ -20,7 +20,9 @@ class Lentil::Tag < ActiveRecord::Base
|
|
20
20
|
validates_presence_of :name
|
21
21
|
|
22
22
|
scope :harvestable, where(:lentil_tagsets => {:harvest => true}).includes(:tagsets)
|
23
|
-
|
23
|
+
scope :not_harvestable, where(:lentil_tagsets => {:harvest => false}).includes(:tagsets)
|
24
|
+
scope :no_tagsets, where(:lentil_tagset_assignments => {:tag_id => nil}).includes(:tagset_assignments)
|
25
|
+
|
24
26
|
#Stripping tags on write
|
25
27
|
def name=(new_name)
|
26
28
|
write_attribute(:name, new_name.sub(/^#/, ''))
|
@@ -6,6 +6,7 @@
|
|
6
6
|
<th>Description</th>
|
7
7
|
<th>Username</th>
|
8
8
|
<th>Service Tags</th>
|
9
|
+
<th>Harvesting Tags</th>
|
9
10
|
<th>Staff Tags</th>
|
10
11
|
<th>Staff Like</th>
|
11
12
|
<th>DNR</th>
|
@@ -31,8 +32,16 @@
|
|
31
32
|
<td><%= image.service_tags.map{|tag| tag.name}.join(' | ') %>
|
32
33
|
<%= f.input "service_tags", :as => :hidden, :collection => image.service_tags, :wrapper_html => {:style => "list-style: none"} %>
|
33
34
|
</td>
|
35
|
+
<td><%= image.service_tags.select{|tag| @harvestable_tag_ids.include? tag.id}.map{|tag| tag.name}.join(' | ') %></td>
|
34
36
|
<td class="moderation_tag">
|
35
|
-
|
37
|
+
<% if defined? @tags %>
|
38
|
+
<%= f.input :tags, :label => false, :as => :select, :collection => image.available_staff_tags(@tags), :input_html => {:multiple => true, :class => "chzn-select", :'data-placeholder' => 'Select Tag', :style => "width:190px" }%>
|
39
|
+
<% else %>
|
40
|
+
<% if image.staff_tags.length > 0 %>
|
41
|
+
<p><%= image.staff_tags.map{|tag| tag.name}.join(' | ') %></p>
|
42
|
+
<% end %>
|
43
|
+
<%= link_to('Edit Staff Tags', update_image_admin_lentil_image_path(image)) %>
|
44
|
+
<% end %>
|
36
45
|
</td>
|
37
46
|
<td><%= f.input :staff_like, :label => "Staff Like", :wrapper_html => { :class => "moderation_checkbox" } %></td>
|
38
47
|
<td><%= f.input :do_not_request_donation, :label => "Don't request donation", :wrapper_html => { :class => "moderation_checkbox" } %></td>
|
@@ -7,6 +7,7 @@
|
|
7
7
|
<th>Description</th>
|
8
8
|
<th>Username</th>
|
9
9
|
<th>All Tags</th>
|
10
|
+
<th>Harvesting Tags</th>
|
10
11
|
<th>Moderator</th>
|
11
12
|
<th>Status</th>
|
12
13
|
</tr>
|
@@ -19,6 +20,7 @@
|
|
19
20
|
<td><%= image.description %></td>
|
20
21
|
<td><%= image.user.user_name %></td>
|
21
22
|
<td><%= image.tags.map{|tag| tag.name}.join(' | ') %></td>
|
23
|
+
<td><%= image.service_tags.select{|tag| @harvestable_tag_ids.include? tag.id}.map{|tag| tag.name}.join(' | ') %></td>
|
22
24
|
<td><%= image.moderator.email if image.moderator %></td>
|
23
25
|
<td><%= image.state_name %></td>
|
24
26
|
<% end -%>
|
@@ -30,4 +32,4 @@
|
|
30
32
|
<div class="blank_slate_container">
|
31
33
|
<span class="blank_slate">No Flagging History Found</span>
|
32
34
|
</div>
|
33
|
-
<% end -%>
|
35
|
+
<% end -%>
|
@@ -1,18 +1,20 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<div class="images">
|
2
|
+
<% @images.each do |image| %>
|
3
3
|
<div id="image_<%= image.id %>" class="grid__cell image-tile">
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
<% unless image.media_type == "video" %>
|
5
|
+
<%= link_to url_for(image), 'data-fancybox-href' => image.jpeg, 'data-fancybox-group' => "image-tile-gallery", :class => :fancybox do %>
|
6
|
+
<%= image_tag(image.jpeg, :class => "instagram-img " + image.id.to_s, :alt => image.description, :data => {:battles_count => image.battles_count, :win_pct => image.win_pct, :popularity => image.popular_score, :staff_like => image.staff_like, :like_votes_count => image.like_votes_count, :media_type => image.media_type}) %>
|
7
|
+
<% end %>
|
7
8
|
<% else %>
|
8
|
-
|
9
|
+
<%= link_to url_for(image), 'data-fancybox-href' => image.video_url, 'data-fancybox-group' => "image-tile-gallery", :class => :fancybox do %>
|
10
|
+
<%= video_tag(image.video_url, :autoplay => "true", :muted => "true", :loop => "true", :class => "instagram-img-" + image.id.to_s, :class => "instagram-img " + image.id.to_s, :height => "100%", :width => "100%", :poster => image.jpeg, :data => {:battles_count => image.battles_count, :win_pct => image.win_pct, :popularity => image.popular_score, :staff_like => image.staff_like, :like_votes_count => image.like_votes_count, :media_type => image.media_type}) %>
|
11
|
+
<% end %>
|
9
12
|
<% end %>
|
10
|
-
<% end %>
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
<%= render "/layouts/lentil/image_popup", :image => image %>
|
15
|
+
<% if params[:controller] == "lentil/thisorthat" %>
|
16
|
+
<div class="battle-leader-overlay"><%= number_to_percentage(image.win_pct, :precision => 0) %></div>
|
17
|
+
<% end -%>
|
16
18
|
</div>
|
17
|
-
|
18
|
-
|
19
|
+
<% end -%>
|
20
|
+
</div>
|
@@ -4,10 +4,11 @@
|
|
4
4
|
<div class="battle-image-wrap grid__cell">
|
5
5
|
<%= semantic_fields_for "image[#{image.id}]", image do |f| %>
|
6
6
|
<div id="image_<%= image.id %>" class="battle-image-tile">
|
7
|
-
<a href="<%= url_for(image) %>" data-fancybox-href= "<%= image.jpeg %>" class="fancybox">
|
8
7
|
<% unless image.media_type == "video" %>
|
8
|
+
<a href="<%= url_for(image) %>" data-fancybox-href= "<%= image.jpeg %>" class="fancybox">
|
9
9
|
<%= image_tag(image.jpeg, :class => "battle-img instagram-img", :data => {:battles_count => image.battles_count, :win_pct => image.win_pct, :popularity => image.popular_score, :staff_like => image.staff_like, :like_votes_count => image.like_votes_count, :media_type => image.media_type}) %>
|
10
10
|
<% else %>
|
11
|
+
<a href="<%= url_for(image) %>" data-fancybox-href= "<%= image.video_url %>" class="fancybox">
|
11
12
|
<%= video_tag(image.video_url, :class => "instagram-img " + image.id.to_s, :height => "100%", :width => "100%", :poster => image.jpeg, :controls => "controls", :data => {:battles_count => image.battles_count, :win_pct => image.win_pct, :popularity => image.popular_score, :staff_like => image.staff_like, :like_votes_count => image.like_votes_count, :media_type => image.media_type}) %>
|
12
13
|
<% end %>
|
13
14
|
<div class="battle-image-desc trunc-small"><div class="battle-image-inner-desc"><%= truncate(image.description, :length => 35) %></div></div>
|
@@ -28,10 +29,11 @@
|
|
28
29
|
<% @prev_images.each do |image| %>
|
29
30
|
<div class="battle-image-wrap grid__cell" style="background:#e6e6e6">
|
30
31
|
<div id="image_<%= image.id %>" class="battle-image-tile">
|
31
|
-
<a href="<%= url_for(image) %>" data-fancybox-href= "<%= image.jpeg %>" class="fancybox">
|
32
32
|
<% unless image.media_type == "video" %>
|
33
|
+
<a href="<%= url_for(image) %>" data-fancybox-href= "<%= image.jpeg %>" class="fancybox">
|
33
34
|
<%= image_tag(image.jpeg, :class => "battle-img instagram-img", :data => {:battles_count => image.battles_count, :win_pct => image.win_pct, :popularity => image.popular_score, :staff_like => image.staff_like, :like_votes_count => image.like_votes_count, :media_type => image.media_type}) %>
|
34
35
|
<% else %>
|
36
|
+
<a href="<%= url_for(image) %>" data-fancybox-href= "<%= image.video_url %>" class="fancybox">
|
35
37
|
<%= video_tag(image.video_url, :class => "instagram-img " + image.id.to_s, :height => "100%", :width => "100%", :poster => image.jpeg, :controls => "controls", :data => {:battles_count => image.battles_count, :win_pct => image.win_pct, :popularity => image.popular_score, :staff_like => image.staff_like, :like_votes_count => image.like_votes_count, :media_type => image.media_type}) %>
|
36
38
|
<% end %>
|
37
39
|
<div class="battle-image-desc trunc-small"><div class="battle-image-inner-desc"><%= truncate(image.description, :length => 35) %></div></div>
|
data/lib/lentil/admin/flags.rb
CHANGED
data/lib/lentil/admin/images.rb
CHANGED
@@ -2,10 +2,41 @@ if defined?(ActiveAdmin)
|
|
2
2
|
ActiveAdmin.register Lentil::Image do
|
3
3
|
actions :index, :show
|
4
4
|
|
5
|
-
config.batch_actions =
|
5
|
+
config.batch_actions = true
|
6
6
|
config.per_page = 10
|
7
7
|
|
8
|
-
|
8
|
+
batch_action :destroy, false
|
9
|
+
|
10
|
+
batch_action :approve_all do |ids|
|
11
|
+
images = Lentil::Image.where(id: ids)
|
12
|
+
total_images = images.size
|
13
|
+
image_counter = 0
|
14
|
+
errors = []
|
15
|
+
|
16
|
+
images.each do |image|
|
17
|
+
second_moderation = true
|
18
|
+
unless image.moderator_id.nil?
|
19
|
+
second_moderation = false
|
20
|
+
end
|
21
|
+
|
22
|
+
begin
|
23
|
+
image.update_attributes!(:state => 1, :moderator => current_admin_user, :moderated_at => DateTime.now,
|
24
|
+
:second_moderation => second_moderation)
|
25
|
+
rescue Exception => e
|
26
|
+
errors << "image_id #{image.id}: #{e.message}"
|
27
|
+
next
|
28
|
+
end
|
29
|
+
|
30
|
+
image_counter += 1
|
31
|
+
end
|
32
|
+
|
33
|
+
if errors.length > 0
|
34
|
+
redirect_to collection_path, notice: "#{image_counter} #{'Image'.pluralize(image_counter)} approved (out of #{total_images})", alert: errors.join('<br>').html_safe
|
35
|
+
else
|
36
|
+
redirect_to collection_path, notice: "#{image_counter} #{'Image'.pluralize(image_counter)} approved (out of #{total_images})"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
9
40
|
filter :suppressed
|
10
41
|
filter :media_type, :as => :select
|
11
42
|
filter :user_user_name, :as => :string, :label => "Username"
|
@@ -22,16 +53,40 @@ if defined?(ActiveAdmin)
|
|
22
53
|
filter :url, :label => "Service URL"
|
23
54
|
filter :id
|
24
55
|
|
56
|
+
scope :all
|
57
|
+
scope :new, :default => true do |images|
|
58
|
+
images.where(:state => Lentil::Image::States[:pending])
|
59
|
+
end
|
60
|
+
scope :approved do |images|
|
61
|
+
images.where(:state => Lentil::Image::States[:approved])
|
62
|
+
end
|
63
|
+
scope :rejected do |images|
|
64
|
+
images.where(:state => Lentil::Image::States[:rejected])
|
65
|
+
end
|
66
|
+
scope :skipped do |images|
|
67
|
+
images.where(:state => Lentil::Image::States[:pending]).where("moderator_id IS NOT NULL")
|
68
|
+
end
|
69
|
+
# scope :flagged do |images|
|
70
|
+
# # images.where(:state => Lentil::Image::States[:pending]).where("moderator_id IS NOT NULL")
|
71
|
+
# images.includes(:user, :tags, :taggings, :flags).joins(:flags).where(:second_moderation => false).uniq.all
|
72
|
+
# end
|
73
|
+
|
25
74
|
action_item :only => :show do
|
26
75
|
link_to('Update Image', update_image_admin_lentil_image_path(lentil_image))
|
27
76
|
end
|
28
77
|
action_item { link_to "Moderate New", moderate_admin_lentil_images_path }
|
29
78
|
action_item { link_to "Moderate Skipped", moderate_skipped_admin_lentil_images_path }
|
30
79
|
action_item { link_to "Moderate Flagged", moderate_flagged_admin_lentil_images_path }
|
80
|
+
action_item { link_to "Moderate Approved", moderate_approved_admin_lentil_images_path }
|
81
|
+
action_item { link_to "Moderate Rejected", moderate_rejected_admin_lentil_images_path }
|
31
82
|
action_item { link_to "Flagging History", flagging_history_admin_lentil_images_path }
|
32
83
|
action_item { link_to "Add Instagram Image", manual_input_admin_lentil_images_path }
|
33
84
|
|
34
85
|
index do
|
86
|
+
harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
|
87
|
+
if current_scope.name == 'New'
|
88
|
+
selectable_column
|
89
|
+
end
|
35
90
|
column "Image" do |image|
|
36
91
|
unless image.media_type == "video"
|
37
92
|
link_to(image_tag(image.image_url, :class => "moderation_thumbnail"), admin_lentil_image_path(image))
|
@@ -50,6 +105,9 @@ if defined?(ActiveAdmin)
|
|
50
105
|
column "All Tags" do |image|
|
51
106
|
image.tags.map{|tag| tag.name}.join(' | ')
|
52
107
|
end
|
108
|
+
column "Harvesting Tags" do |image|
|
109
|
+
image.service_tags.select{|tag| harvestable_tag_ids.include? tag.id}.map{|tag| tag.name}.join(' | ')
|
110
|
+
end
|
53
111
|
column "Likes", :like_votes_count
|
54
112
|
column :staff_like
|
55
113
|
column "Battles", :battles_count, :sortable => false
|
@@ -68,6 +126,7 @@ if defined?(ActiveAdmin)
|
|
68
126
|
end
|
69
127
|
|
70
128
|
show :title => :id do |image|
|
129
|
+
harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
|
71
130
|
attributes_table do
|
72
131
|
row :id
|
73
132
|
row :description
|
@@ -90,6 +149,13 @@ if defined?(ActiveAdmin)
|
|
90
149
|
"Image has not been tagged."
|
91
150
|
end
|
92
151
|
end
|
152
|
+
row "Harvesting Tags" do |image|
|
153
|
+
unless image.service_tags.select{|tag| harvestable_tag_ids.include? tag.id}.empty?
|
154
|
+
image.service_tags.select{|tag| harvestable_tag_ids.include? tag.id}.map{|tag| tag.name}.join(' | ')
|
155
|
+
else
|
156
|
+
"Image has no harvesting tags."
|
157
|
+
end
|
158
|
+
end
|
93
159
|
row :staff_like
|
94
160
|
row :do_not_request_donation
|
95
161
|
row :donor_agreement_submitted_date
|
@@ -99,51 +165,88 @@ if defined?(ActiveAdmin)
|
|
99
165
|
image.state_name
|
100
166
|
end
|
101
167
|
row :image do
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
168
|
+
unless image.media_type == "video"
|
169
|
+
link_to(image_tag(image.image_url), admin_lentil_image_path(image))
|
170
|
+
else
|
171
|
+
video_tag(image.video_url, controls: true, size: "640x640")
|
172
|
+
end
|
107
173
|
end
|
108
174
|
end
|
109
175
|
active_admin_comments
|
110
176
|
end
|
111
177
|
|
112
178
|
controller do
|
179
|
+
def scoped_collection
|
180
|
+
super.includes :user, :taggings, :tags
|
181
|
+
end
|
182
|
+
|
183
|
+
# TODO: This method may need optimization
|
113
184
|
def update_images(images, images_params, second_moderation)
|
185
|
+
total_images = images.size
|
186
|
+
image_counter = 0
|
187
|
+
errors = []
|
188
|
+
|
114
189
|
images.each do |image|
|
115
190
|
image_params = images_params[image.id.to_s]
|
116
191
|
|
117
|
-
|
118
|
-
|
119
|
-
|
192
|
+
if image_params.key?(:tag_ids)
|
193
|
+
incoming_tag_ids = image_params['tag_ids'].reject(&:empty?)
|
194
|
+
existing_tag_ids = []
|
195
|
+
service_tag_ids = []
|
120
196
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
197
|
+
image.taggings.each do |tagging|
|
198
|
+
existing_tag_ids << tagging[:tag_id]
|
199
|
+
if tagging[:staff_tag] == false
|
200
|
+
service_tag_ids << tagging[:tag_id]
|
201
|
+
end
|
125
202
|
end
|
126
|
-
end
|
127
203
|
|
128
|
-
|
129
|
-
|
204
|
+
new_tag_ids = incoming_tag_ids - existing_tag_ids
|
205
|
+
tag_ids_to_keep = incoming_tag_ids - new_tag_ids + service_tag_ids
|
130
206
|
|
131
|
-
|
132
|
-
|
133
|
-
|
207
|
+
new_taggings = []
|
208
|
+
new_tag_ids.each do |id|
|
209
|
+
new_taggings << image.taggings.build(:tag_id => id, :staff_tag => true)
|
210
|
+
end
|
211
|
+
|
212
|
+
taggings_to_keep = image.taggings.select{ |tagging| tag_ids_to_keep.include? tagging.tag_id}
|
213
|
+
taggings = new_taggings + taggings_to_keep
|
214
|
+
|
215
|
+
# Save Updated Image with new tags
|
216
|
+
begin
|
217
|
+
image.update_attributes!(:state => image_params['state'], :taggings => taggings, :staff_like => image_params['staff_like'],
|
218
|
+
:moderator => current_admin_user, :moderated_at => DateTime.now, :second_moderation => second_moderation,
|
219
|
+
:do_not_request_donation => image_params['do_not_request_donation'], :suppressed => image_params['suppressed'])
|
220
|
+
rescue Exception => e
|
221
|
+
errors << "image_id #{image.id}: #{e.message}"
|
222
|
+
next
|
223
|
+
end
|
224
|
+
else
|
225
|
+
# Save Updated Image with same tags
|
226
|
+
begin
|
227
|
+
image.update_attributes!(:state => image_params['state'], :staff_like => image_params['staff_like'],
|
228
|
+
:moderator => current_admin_user, :moderated_at => DateTime.now, :second_moderation => second_moderation,
|
229
|
+
:do_not_request_donation => image_params['do_not_request_donation'], :suppressed => image_params['suppressed'])
|
230
|
+
rescue Exception => e
|
231
|
+
errors << "image_id #{image.id}: #{e.message}"
|
232
|
+
next
|
233
|
+
end
|
134
234
|
end
|
135
235
|
|
136
|
-
|
137
|
-
|
236
|
+
image_counter += 1
|
237
|
+
end
|
138
238
|
|
139
|
-
|
140
|
-
|
141
|
-
|
239
|
+
if errors.length > 0
|
240
|
+
redirect_to :back, notice: "#{image_counter} #{'Image'.pluralize(image_counter)} moderated (out of #{total_images})", alert: errors.join('<br>').html_safe
|
241
|
+
else
|
242
|
+
redirect_to :back, notice: "#{image_counter} #{'Image'.pluralize(image_counter)} moderated (out of #{total_images})"
|
142
243
|
end
|
143
244
|
end
|
144
245
|
end
|
145
246
|
|
146
247
|
member_action :update_image do
|
248
|
+
@tags = Lentil::Tag.all
|
249
|
+
@harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
|
147
250
|
id = params['id']
|
148
251
|
@second_moderation = false
|
149
252
|
@images = Lentil::Image.where(id: id)
|
@@ -151,42 +254,51 @@ if defined?(ActiveAdmin)
|
|
151
254
|
end
|
152
255
|
|
153
256
|
collection_action :moderate do
|
257
|
+
@harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
|
154
258
|
@second_moderation = false
|
155
|
-
@images = Lentil::Image.where(state: Lentil::Image::States[:pending], moderator_id: nil).paginate(:page => params[:page], :per_page => 10)
|
259
|
+
@images = Lentil::Image.includes(:user, :taggings, :tags).where(state: Lentil::Image::States[:pending], moderator_id: nil).paginate(:page => params[:page], :per_page => 10)
|
260
|
+
end
|
261
|
+
|
262
|
+
collection_action :moderate_approved do
|
263
|
+
@harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
|
264
|
+
@second_moderation = false
|
265
|
+
@images = Lentil::Image.includes(:user, :taggings, :tags).where(state: Lentil::Image::States[:approved]).paginate(:page => params[:page], :per_page => 10)
|
266
|
+
render "/admin/lentil_images/moderate"
|
267
|
+
end
|
268
|
+
|
269
|
+
collection_action :moderate_rejected do
|
270
|
+
@harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
|
271
|
+
@second_moderation = false
|
272
|
+
@images = Lentil::Image.includes(:user, :taggings, :tags).where(state: Lentil::Image::States[:rejected]).paginate(:page => params[:page], :per_page => 10)
|
273
|
+
render "/admin/lentil_images/moderate"
|
156
274
|
end
|
157
275
|
|
158
276
|
collection_action :moderate_skipped do
|
277
|
+
@harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
|
159
278
|
@second_moderation = false
|
160
|
-
@images = Lentil::Image.where(state: Lentil::Image::States[:pending]).where("moderator_id IS NOT NULL").paginate(:page => params[:page], :per_page => 10)
|
279
|
+
@images = Lentil::Image.includes(:user, :taggings, :tags).where(state: Lentil::Image::States[:pending]).where("moderator_id IS NOT NULL").paginate(:page => params[:page], :per_page => 10)
|
161
280
|
render "/admin/lentil_images/moderate"
|
162
281
|
end
|
163
282
|
|
164
283
|
collection_action :moderate_flagged do
|
284
|
+
@harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
|
165
285
|
@second_moderation = true
|
166
|
-
|
286
|
+
temp_images = Lentil::Image.includes(:user, :tags, :taggings, :flags).joins(:flags).where(:second_moderation => false).uniq.all
|
287
|
+
@images = Kaminari.paginate_array(temp_images).page(params[:page]).per(10)
|
167
288
|
render "/admin/lentil_images/moderate"
|
168
289
|
end
|
169
290
|
|
170
291
|
collection_action :do_moderation, :method => :post do
|
171
|
-
images = Lentil::Image.find(params[:image].keys)
|
292
|
+
images = Lentil::Image.find(params[:image].keys, :include => [:user, :taggings, :tags])
|
172
293
|
images_params = params[:image]
|
173
294
|
second_moderation = params[:moderation]['second_moderation']
|
174
|
-
|
175
|
-
begin
|
176
|
-
update_images(images, images_params, second_moderation)
|
177
|
-
rescue => e
|
178
|
-
message = "Error moderating images: " + e.to_s
|
179
|
-
redirect_to :back, :flash => {:error => message}
|
180
|
-
else
|
181
|
-
number_of_images = params['image'].size
|
182
|
-
plural = 'image'.pluralize(number_of_images)
|
183
|
-
message = number_of_images.to_s + " " + plural + " moderated."
|
184
|
-
redirect_to :back, notice: message
|
185
|
-
end
|
295
|
+
update_images(images, images_params, second_moderation)
|
186
296
|
end
|
187
297
|
|
188
298
|
collection_action :flagging_history do
|
189
|
-
@
|
299
|
+
@harvestable_tag_ids = Lentil::Tag.harvestable.map(&:id)
|
300
|
+
temp_images = Lentil::Image.includes(:user, :tags, :flags, :moderator).joins(:flags).uniq.all
|
301
|
+
@images = Kaminari.paginate_array(temp_images).page(params[:page]).per(10)
|
190
302
|
end
|
191
303
|
|
192
304
|
collection_action :manual_input do
|
@@ -0,0 +1,34 @@
|
|
1
|
+
ActiveAdmin.register_page "Stats" do
|
2
|
+
content do
|
3
|
+
render partial: 'stats'
|
4
|
+
end
|
5
|
+
|
6
|
+
controller do
|
7
|
+
def index
|
8
|
+
stats = []
|
9
|
+
|
10
|
+
images = Lentil::Image.all
|
11
|
+
battles = Lentil::Battle.count
|
12
|
+
like_votes = Lentil::LikeVote.count
|
13
|
+
users = Lentil::User.count
|
14
|
+
tags = Lentil::Tag.count
|
15
|
+
taggings = Lentil::Tagging.count
|
16
|
+
|
17
|
+
submitted_agreements = images.map(&:donor_agreement_submitted_date).compact.count
|
18
|
+
rejected_agreements = images.map(&:donor_agreement_rejected).compact.count
|
19
|
+
accepted_aggrements = submitted_agreements - rejected_agreements
|
20
|
+
|
21
|
+
stats << {name: 'Number of Images', value: images.count}
|
22
|
+
stats << {name: 'Number of Battles', value: battles}
|
23
|
+
stats << {name: 'Number of Like Votes', value: like_votes}
|
24
|
+
stats << {name: 'Number of Users', value: users}
|
25
|
+
stats << {name: 'Number of Submitted Donor Agreements', value: submitted_agreements}
|
26
|
+
stats << {name: 'Number of Accepted Donor Agreements (implicit)', value: accepted_aggrements}
|
27
|
+
stats << {name: 'Number of Rejected Donor Agreements (explicit)', value: rejected_agreements}
|
28
|
+
stats << {name: 'Number of Unique Tags', value: tags}
|
29
|
+
stats << {name: 'Number of Taggings', value: taggings}
|
30
|
+
|
31
|
+
@stats = stats
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/lentil/admin/tags.rb
CHANGED
@@ -6,13 +6,34 @@ if defined?(ActiveAdmin)
|
|
6
6
|
config.sort_order = "name_asc"
|
7
7
|
|
8
8
|
filter :name
|
9
|
+
filter :tagsets_title, :as => :string, :label => "Tagsets"
|
10
|
+
|
11
|
+
scope :all, :default => true
|
12
|
+
scope "Harvesting", :harvestable
|
13
|
+
scope "Not Harvesting", :not_harvestable
|
14
|
+
scope "Not in a Tagset", :no_tagsets
|
9
15
|
|
10
16
|
index :download_links => false do
|
17
|
+
harvestable_ids = Lentil::Tag.harvestable.map(&:id)
|
18
|
+
|
11
19
|
column :id
|
12
20
|
column :name
|
21
|
+
column "Harvestable" do |tag|
|
22
|
+
if harvestable_ids.include?(tag.id)
|
23
|
+
"True"
|
24
|
+
else
|
25
|
+
"False"
|
26
|
+
end
|
27
|
+
end
|
13
28
|
column "Tagsets" do |tag|
|
14
29
|
tag.tagsets.sort_by(&:title).map{ |t| t.title}.join(' | ')
|
15
30
|
end
|
16
31
|
end
|
32
|
+
|
33
|
+
controller do
|
34
|
+
def scoped_collection
|
35
|
+
super.includes :taggings, :tagsets
|
36
|
+
end
|
37
|
+
end
|
17
38
|
end
|
18
|
-
end
|
39
|
+
end
|
data/lib/lentil/admin/tagsets.rb
CHANGED
@@ -6,6 +6,7 @@ if defined?(ActiveAdmin)
|
|
6
6
|
|
7
7
|
filter :title
|
8
8
|
filter :description
|
9
|
+
filter :tags_name, :collection => proc {Lentil::Tag.all.sort_by(&:name)}, :as => :string, :label => "Tags"
|
9
10
|
|
10
11
|
scope :all
|
11
12
|
scope :harvesting, :default => true do |tagsets|
|
@@ -43,9 +44,11 @@ if defined?(ActiveAdmin)
|
|
43
44
|
f.input :title
|
44
45
|
f.input :description
|
45
46
|
f.input :tags, :input_html => {:class => [:"chzn-select"]}, :collection => Lentil::Tag.all.sort_by(&:name)
|
46
|
-
f.input :harvest
|
47
|
+
f.input :harvest do |harvest|
|
48
|
+
harvest.capitalize
|
49
|
+
end
|
47
50
|
end
|
48
51
|
f.actions
|
49
52
|
end
|
50
53
|
end
|
51
|
-
end
|
54
|
+
end
|
data/lib/lentil/version.rb
CHANGED
@@ -4,7 +4,6 @@ sqlite: &sqlite
|
|
4
4
|
|
5
5
|
mysql: &mysql
|
6
6
|
adapter: mysql2
|
7
|
-
encoding: utf8
|
8
7
|
username: travis
|
9
8
|
password:
|
10
9
|
database: lentil_<%= Rails.env %>
|
@@ -20,6 +19,7 @@ defaults: &defaults
|
|
20
19
|
pool: 5
|
21
20
|
timeout: 5000
|
22
21
|
host: 127.0.0.1
|
22
|
+
encoding: utf8
|
23
23
|
<<: *<%= ENV['DB'] || "sqlite" %>
|
24
24
|
|
25
25
|
development:
|
@@ -29,4 +29,4 @@ test:
|
|
29
29
|
<<: *defaults
|
30
30
|
|
31
31
|
production:
|
32
|
-
<<: *defaults
|
32
|
+
<<: *defaults
|
@@ -11,6 +11,12 @@ Dummy::Application.configure do
|
|
11
11
|
config.serve_static_assets = true
|
12
12
|
config.static_cache_control = "public, max-age=3600"
|
13
13
|
|
14
|
+
# Don't fallback to assets pipeline if a precompiled asset is missed
|
15
|
+
#config.assets.compile = false
|
16
|
+
|
17
|
+
# Generate digests for assets URLs
|
18
|
+
#config.assets.digest = true
|
19
|
+
|
14
20
|
# Log error messages when you accidentally call methods on nil
|
15
21
|
config.whiny_nils = true
|
16
22
|
|
@@ -12,10 +12,10 @@ class ImageModalTest < ActionDispatch::IntegrationTest
|
|
12
12
|
test "should see a modal when clicking on an image" do
|
13
13
|
visit lentil.images_path
|
14
14
|
assert page.has_no_content?('six #hunttesting')
|
15
|
-
assert page.has_no_selector?('.fancybox-
|
15
|
+
assert page.has_no_selector?('.fancybox-img')
|
16
16
|
# all('.fancybox').first.click
|
17
17
|
find('.fancybox', match: :first).click
|
18
18
|
assert page.has_content?('six #hunttesting')
|
19
|
-
assert page.has_selector?('.fancybox-
|
19
|
+
assert page.has_selector?('.fancybox-img')
|
20
20
|
end
|
21
21
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lentil
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Casden
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2015-
|
14
|
+
date: 2015-08-26 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rails
|
@@ -271,14 +271,14 @@ dependencies:
|
|
271
271
|
requirements:
|
272
272
|
- - "~>"
|
273
273
|
- !ruby/object:Gem::Version
|
274
|
-
version: 5.0
|
274
|
+
version: 5.1.0
|
275
275
|
type: :runtime
|
276
276
|
prerelease: false
|
277
277
|
version_requirements: !ruby/object:Gem::Requirement
|
278
278
|
requirements:
|
279
279
|
- - "~>"
|
280
280
|
- !ruby/object:Gem::Version
|
281
|
-
version: 5.0
|
281
|
+
version: 5.1.0
|
282
282
|
- !ruby/object:Gem::Dependency
|
283
283
|
name: google-analytics-rails
|
284
284
|
requirement: !ruby/object:Gem::Requirement
|
@@ -609,6 +609,7 @@ files:
|
|
609
609
|
- app/views/admin/lentil_images/flagging_history.html.erb
|
610
610
|
- app/views/admin/lentil_images/manual_input.html.erb
|
611
611
|
- app/views/admin/lentil_images/moderate.html.erb
|
612
|
+
- app/views/admin/stats/_stats.html.erb
|
612
613
|
- app/views/layouts/lentil/_apple_touch_icons.html.erb
|
613
614
|
- app/views/layouts/lentil/_error.html.erb
|
614
615
|
- app/views/layouts/lentil/_flag_button.html.erb
|
@@ -703,6 +704,7 @@ files:
|
|
703
704
|
- lib/lentil/admin/dashboard.rb
|
704
705
|
- lib/lentil/admin/flags.rb
|
705
706
|
- lib/lentil/admin/images.rb
|
707
|
+
- lib/lentil/admin/stats.rb
|
706
708
|
- lib/lentil/admin/tags.rb
|
707
709
|
- lib/lentil/admin/tagsets.rb
|
708
710
|
- lib/lentil/admin/user.rb
|