Skip to content

Commit

Permalink
Raw data from stats page (#4654)
Browse files Browse the repository at this point in the history
* Download data as json

* add comments to stats

* download stats with month ranges

* add maps as download content  and style

* implement downlod as csv

* move download logic to range page

* resctrict download of stats to admin
  • Loading branch information
cesswairimu authored and jywarren committed Feb 5, 2019
1 parent 2ef7afd commit 097c117
Show file tree
Hide file tree
Showing 8 changed files with 178 additions and 15 deletions.
8 changes: 7 additions & 1 deletion app/assets/stylesheets/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,12 @@ div.note.moderated h4 {

.is-active{
cursor: default;
opacity: 0.6;
background-color: #e3f2fd;
}
textarea, input {
padding:10px;
font-family: FontAwesome, "Open Sans", Verdana, sans-serif;
font-style: normal;
font-weight: normal;
text-decoration: inherit;
}
61 changes: 61 additions & 0 deletions app/controllers/stats_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,69 @@ def index
end
end

def notes
time
export_as_json(@start, @end, 'note')
end

def wikis
time
export_as_json(@start, @end, 'page')
end

def users
time
data = User.where(created_at: @start..@end).where(status: 1)
respond_to do |format|
format.csv { send_data data.to_csv }
format.json { send_data data.to_json, :type => 'application/json; header=present', :disposition => "attachment; filename=user.json" }
end
end

def questions
time
data = Node.published.questions.where(created: @start.to_i..@end.to_i).all
respond_to do |format|
format.csv { send_data data.to_csv }
format.json { send_data data.to_json, :type => 'application/json; header=present', :disposition => "attachment; filename=questions.json" }
end
end

def answers
time
data = Answer.where(created_at: @start..@end).all
respond_to do |format|
format.csv { send_data data.to_csv }
format.json { send_data data.to_json, :type => 'application/json; header=present', :disposition => "attachment; filename=answers.json" }
end
end

def comments
time
data = Comment.select(%i(status timestamp)).where(status: 1, timestamp: @start.to_i...@end.to_i).all
respond_to do |format|
format.csv { send_data data.to_csv }
format.json { send_data data.to_json, :type => 'application/json; header=present', :disposition => "attachment; filename=comment.json" }
end
end

def export_as_json(starting, ending, type)
data = Node.published.select(%i(created type))
.where(type: type, created: starting.to_i..ending.to_i)
.all
respond_to do |format|
format.csv { send_data data.to_csv }
format.json { send_data data.to_json, :type => 'application/json; header=present', :disposition => "attachment; filename=#{type}.json" }
end
end

private

def time
@start = params[:start] ? Time.parse(params[:start].to_s) : Time.now - 1.month
@end = params[:end] ? Time.parse(params[:end].to_s) : Time.now
end

def to_keyword(param)
1.send(param.downcase)
end
Expand Down
10 changes: 10 additions & 0 deletions app/models/application_record.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
class ApplicationRecord < ActiveRecord::Base
require 'csv'
self.abstract_class = true

def self.to_csv(options = {})
CSV.generate(options) do |csv|
csv << column_names
all.each do |object|
csv << object.attributes.values_at(*column_names)
end
end
end
end
9 changes: 9 additions & 0 deletions app/models/node.rb
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,15 @@ def generate_path
end
end

def self.to_csv(options = {})
CSV.generate(options) do |csv|
csv << column_names
all.each do |object|
csv << object.attributes.values_at(*column_names)
end
end
end

private

def set_path_and_slug
Expand Down
9 changes: 9 additions & 0 deletions app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -434,4 +434,13 @@ def self.count_all_time_contributor
revisions = Revision.where(status: 1).pluck(:uid)
contributors = (notes + answers + questions + comments + revisions).compact.uniq.length
end

def self.to_csv(options = {})
CSV.generate(options) do |csv|
csv << column_names
all.each do |object|
csv << object.attributes.values_at(*column_names)
end
end
end
end
14 changes: 0 additions & 14 deletions app/views/stats/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -78,20 +78,6 @@

<hr />
<br> <br>

<div class="col-md-4 col-md-offset-2">
<i class="fa fa-cloud-download fa-3x" style="color:blue"> </i>
Download as Json
</div>
<div class="col-md-4 col-md-offset-1">
<i class="fa fa-cloud-download fa-3x" style="color:purple"> </i>
Download as CSV
</div>
<br> <br>
<br> <br>
<br> <br>
<br> <br>

</div>

<br> <br>
Expand Down
68 changes: 68 additions & 0 deletions app/views/stats/range.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,74 @@
</table>

<p><i>Member registration may include spam accounts</i></p>

<% if current_user && (current_user.role == "admin") %>
<br>

<div class="btn-group">
<button type="button" class="btn btn-lg btn-default">
<i class="fa fa-cloud-download" style="color:blue"> </i>
Download as json
</button>
<button type="button" class="btn btn-lg btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
<li>
<%= link_to "Notes", stats_notes_path(format: 'json', start: params[:start], end: params[:end]) %>
</li>
<li>
<%= link_to "Wikis", stats_wikis_path(format: 'json', start: params[:start], end: params[:end]) %>
</li>
<li>
<%= link_to "Comments", stats_comments_path(format: 'json', start: params[:start], end: params[:end]) %>
</li>
<li>
<%= link_to "Users", stats_users_path(format: 'json', start: params[:start], end: params[:end]) %>
</li>
<li>
<%= link_to "Questions Asked", stats_questions_path(format: 'json', start: params[:start], end: params[:end]) %>
</li>
<li>
<%= link_to "Questions Answered", stats_answers_path(format: 'json', start: params[:start], end: params[:end]) %>
</li>
</ul>
</div>
&ensp;
<div class="btn-group">
<button type="button" class="btn btn-lg btn-default">
<i class="fa fa-cloud-download" style="color:purple"> </i>
Download as csv
</button>
<button type="button" class="btn btn-lg btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
<li>
<%= link_to "Notes", stats_notes_path(format: 'csv', start: params[:start], end: params[:end]) %>
</li>
<li>
<%= link_to "Wikis", stats_wikis_path(format: 'csv', start: params[:start], end: params[:end]) %>
</li>
<li>
<%= link_to "Comments", stats_comments_path(format: 'csv', start: params[:start], end: params[:end]) %>
</li>
<li>
<%= link_to "Users", stats_users_path(format: 'csv', start: params[:start], end: params[:end]) %>
</li>
<li>
<%= link_to "Questions Asked", stats_questions_path(format: 'csv', start: params[:start], end: params[:end]) %>
</li>
<li>
<%= link_to "Questions Answered", stats_answers_path(format: 'csv', start: params[:start], end: params[:end]) %>
</li>
</ul>
</div>
<br><br>
<% end %>

<br>
<p> Move back or forward using the buttons below </p>
<div class="btn-group" role="group" aria-label="Basic example">
Expand Down
14 changes: 14 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,20 @@
get 'stats' => 'stats#index'
get 'stats/range/:start/:end' => 'stats#range'
get 'stats/subscriptions' => 'stats#subscriptions'
get 'stats/notes' => 'stats#notes'
get 'stats/notes/:start/:end' => 'stats#notes'
get 'stats/wikis' => 'stats#wikis'
get 'stats/wikis/:start/:end' => 'stats#wikis'
get 'stats/comments' => 'stats#comments'
get 'stats/comments/:start/:end' => 'stats#comments'
get 'stats/maps' => 'stats#maps'
get 'stats/maps/:start/:end' => 'stats#maps'
get 'stats/users' => 'stats#users'
get 'stats/users/:start/:end' => 'stats#users'
get 'stats/questions' => 'stats#questions'
get 'stats/questions/:start/:end' => 'stats#questions'
get 'stats/answers' => 'stats#answers'
get 'stats/answers/:start/:end' => 'stats#answers'
get 'feed' => 'notes#rss'
get 'rss.xml' => 'legacy#rss'

Expand Down

0 comments on commit 097c117

Please sign in to comment.