graph_starter 0.16.1 → 0.16.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/stylesheets/graph_starter/application.scss +6 -0
- data/app/controllers/graph_starter/application_controller.rb +16 -7
- data/app/controllers/graph_starter/assets_controller.rb +15 -22
- data/app/helpers/graph_starter/application_helper.rb +19 -2
- data/app/models/concerns/graph_starter/authorizable.rb +1 -1
- data/app/models/graph_starter/asset.rb +12 -12
- data/app/models/graph_starter/image.rb +2 -1
- data/app/views/graph_starter/assets/_associations.html.slim +1 -1
- data/app/views/graph_starter/assets/_card.html.slim +4 -3
- data/app/views/graph_starter/assets/_cards.html.slim +1 -2
- data/app/views/graph_starter/assets/_extra_buttons.html +0 -0
- data/lib/graph_starter/configuration.rb +1 -1
- data/lib/graph_starter/query_authorizer.rb +3 -3
- data/lib/graph_starter/version.rb +1 -1
- metadata +7 -7
- data/app/views/graph_starter/assets/_icon.html.slim +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d2e2e8b0afb79a398d41320fef3cd0a88e96ee9
|
4
|
+
data.tar.gz: 0e289c3ba5e588e43e02786f50a3447fb05439e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5d3c17986542ec15587d12462990a11831df53bf7f45b13feb16e2f8b615ce000ee0c415309da03980e64ac9cd91a984dbe4ec0866cbfcd42c83c8eb8df0fa8
|
7
|
+
data.tar.gz: 52b261fcf39547777311d34722cbb485822af0cf228990303d9398698cc88149e3c8c04fe3fa1c736eea5068f80186d18582fa00f76b72c8a7df34724f4386af
|
@@ -6,25 +6,34 @@ module GraphStarter
|
|
6
6
|
def load_session_node
|
7
7
|
session.delete('this_key_should_never_exist') # Make sure we have a session
|
8
8
|
|
9
|
-
@
|
10
|
-
|
11
|
-
session_node.user
|
12
|
-
|
9
|
+
@session_node_thread = Thread.new do
|
10
|
+
Session.merge(session_id: session.id).tap do |session_node|
|
11
|
+
if current_user && session_node.user.nil?
|
12
|
+
session_node.user = current_user
|
13
|
+
end
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
previous_session_id = session['previous_session_id']
|
16
|
+
if previous_session_id && previous_session_id != session.id
|
17
|
+
session_node.previous_session = Session.find_by(session_id: previous_session_id)
|
18
|
+
end
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
20
22
|
session['previous_session_id'] = session.id
|
21
23
|
end
|
22
24
|
|
25
|
+
def session_node
|
26
|
+
puts 'joining...'
|
27
|
+
@session_node_thread.join.value
|
28
|
+
end
|
29
|
+
|
23
30
|
protected
|
24
31
|
|
25
32
|
def model_class
|
26
33
|
@model_slug = params[:model_slug]
|
27
34
|
@model_slug.classify.constantize
|
35
|
+
rescue NameError
|
36
|
+
raise ActionController::RoutingError.new('Not Found')
|
28
37
|
end
|
29
38
|
end
|
30
39
|
end
|
@@ -8,10 +8,12 @@ module GraphStarter
|
|
8
8
|
@assets = asset_set.to_a
|
9
9
|
@title = model_class.name.tableize.humanize
|
10
10
|
|
11
|
-
|
11
|
+
ids = @assets.map(&:categories).flatten.map(&:id)
|
12
|
+
@category_images = Asset.where(id: ids)
|
12
13
|
.query_as(:asset)
|
13
14
|
.match('(asset)-[:HAS_IMAGE]->(image:Image)')
|
14
15
|
.pluck('asset.uuid', :image)
|
16
|
+
|
15
17
|
@category_images = Hash[*@category_images.flatten]
|
16
18
|
end
|
17
19
|
|
@@ -39,28 +41,19 @@ module GraphStarter
|
|
39
41
|
render json: {results: results_data}.to_json
|
40
42
|
end
|
41
43
|
|
42
|
-
def require_model_class
|
43
|
-
# For cases where the route picked up more than it should have and we try to constantize something wrong
|
44
|
-
begin
|
45
|
-
model_class
|
46
|
-
rescue NameError
|
47
|
-
render text: 'Not found', status: :not_found
|
48
|
-
false
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
44
|
def show
|
54
|
-
return if !require_model_class
|
55
|
-
|
56
45
|
@asset = asset
|
57
46
|
@title = @asset.title
|
58
47
|
|
59
48
|
if @asset
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
49
|
+
# Don't wait
|
50
|
+
Thread.new do
|
51
|
+
View.record_view(session_node,
|
52
|
+
@asset,
|
53
|
+
browser_string: request.env['HTTP_USER_AGENT'],
|
54
|
+
ip_address: request.remote_ip)
|
55
|
+
puts 'ending view thread'
|
56
|
+
end
|
64
57
|
else
|
65
58
|
render file: 'public/404.html', status: :not_found, layout: false
|
66
59
|
end
|
@@ -93,8 +86,6 @@ module GraphStarter
|
|
93
86
|
end
|
94
87
|
|
95
88
|
def create
|
96
|
-
return if !require_model_class
|
97
|
-
|
98
89
|
@asset = model_class.create(params[params[:model_slug].singularize])
|
99
90
|
|
100
91
|
if @asset.persisted?
|
@@ -144,7 +135,9 @@ module GraphStarter
|
|
144
135
|
end
|
145
136
|
|
146
137
|
def asset
|
147
|
-
apply_associations(model_class_scope.as(:asset).where('asset.uuid = {id} OR asset.slug = {id}', id: params[:id])).to_a[0]
|
138
|
+
apply_associations(model_class_scope.as(:asset).where('asset.uuid = {id} OR asset.slug = {id}', id: params[:id])).to_a[0].tap do |asset|
|
139
|
+
raise ActionController::RoutingError.new('Asset not found') if asset.blank?
|
140
|
+
end
|
148
141
|
end
|
149
142
|
|
150
143
|
def asset_with_access_level
|
@@ -176,7 +169,7 @@ module GraphStarter
|
|
176
169
|
|
177
170
|
def apply_associations(scope, var = :asset)
|
178
171
|
if associations.present?
|
179
|
-
scope.
|
172
|
+
scope.with_associations(*associations)
|
180
173
|
else
|
181
174
|
scope
|
182
175
|
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module GraphStarter
|
2
2
|
module ApplicationHelper
|
3
|
-
def asset_path(asset
|
4
|
-
graph_starter.asset_path({id: asset.slug, model_slug: asset.class.model_slug}.merge(options))
|
3
|
+
def asset_path(asset)
|
4
|
+
# graph_starter.asset_path({id: asset.slug, model_slug: asset.class.model_slug}.merge(options))
|
5
|
+
# Switched to string for performance
|
6
|
+
"/#{asset.class.model_slug}/#{asset.slug}"
|
5
7
|
end
|
6
8
|
|
7
9
|
def engine_view(&b)
|
@@ -31,5 +33,20 @@ module GraphStarter
|
|
31
33
|
def missing_image_tag
|
32
34
|
@missing_image_tag ||= image_tag 'missing.png'
|
33
35
|
end
|
36
|
+
|
37
|
+
# I know, right?
|
38
|
+
def asset_icon(asset, image = (image_unspecified = true; nil))
|
39
|
+
image_url = if !image_unspecified
|
40
|
+
image.source.url if image.present?
|
41
|
+
elsif (asset.class.has_images? || asset.class.has_image?) && asset.first_image_source_url.present?
|
42
|
+
asset.first_image_source_url
|
43
|
+
end
|
44
|
+
|
45
|
+
if image_url
|
46
|
+
image_tag image_url, class: 'ui avatar image'
|
47
|
+
else
|
48
|
+
content_tag :i, '', class: [asset.class.icon_class || 'folder', 'large', 'icon']
|
49
|
+
end
|
50
|
+
end
|
34
51
|
end
|
35
52
|
end
|
@@ -3,7 +3,7 @@ module GraphStarter
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
5
|
included do
|
6
|
-
property :private,
|
6
|
+
property :private, default: nil
|
7
7
|
validates :private, inclusion: {in: [true, false, nil]}
|
8
8
|
|
9
9
|
if GraphStarter.configuration.user_class
|
@@ -190,10 +190,10 @@ module GraphStarter
|
|
190
190
|
self.class.sanitize_title(title)
|
191
191
|
end
|
192
192
|
|
193
|
+
SANITIZER = Rails::Html::WhiteListSanitizer.new
|
194
|
+
# Should probably save in the DB?
|
193
195
|
def self.sanitize_title(title)
|
194
|
-
|
195
|
-
|
196
|
-
sanitizer.sanitize(title, tags: %w(b em i strong)).try(:html_safe)
|
196
|
+
SANITIZER.sanitize(title, tags: %w(b em i strong)).try(:html_safe)
|
197
197
|
end
|
198
198
|
|
199
199
|
|
@@ -309,11 +309,11 @@ module GraphStarter
|
|
309
309
|
user_label = user_class.mapped_label_name
|
310
310
|
|
311
311
|
query_as(:source)
|
312
|
-
.match('source-[:HAS_CATEGORY]->(category:Category)<-[:HAS_CATEGORY]-(asset:Asset)')
|
312
|
+
.match('(source)-[:HAS_CATEGORY]->(category:Category)<-[:HAS_CATEGORY]-(asset:Asset)')
|
313
313
|
.break
|
314
|
-
.optional_match("source<-[:CREATED]-(creator:#{user_label})-[:CREATED]->asset")
|
314
|
+
.optional_match("(source)<-[:CREATED]-(creator:#{user_label})-[:CREATED]->(asset)")
|
315
315
|
.break
|
316
|
-
.optional_match("source<-[:VIEWED]-(viewer:#{user_label})-[:VIEWED]->asset")
|
316
|
+
.optional_match("(source)<-[:VIEWED]-(viewer:#{user_label})-[:VIEWED]->(asset)")
|
317
317
|
.limit(5)
|
318
318
|
.order('score DESC')
|
319
319
|
.pluck(
|
@@ -336,12 +336,12 @@ module GraphStarter
|
|
336
336
|
categories: categories # DEPRECATED
|
337
337
|
}.tap do |result|
|
338
338
|
result[:image_urls] = image_array.map(&:source_url) if image_array
|
339
|
-
result[:images] = images.map {|image| image.
|
339
|
+
result[:images] = images.map {|image| image.source_url } if self.class.has_images?
|
340
340
|
result[:image] = image.source_url if self.class.has_image? && image
|
341
341
|
|
342
342
|
self.class.category_associations.each do |association_name|
|
343
343
|
result[association_name] = send(association_name)
|
344
|
-
result[association_name].uniq! if result[association_name] && result[association_name].respond_to?(:to_a)
|
344
|
+
result[association_name].to_a.uniq! if result[association_name] && result[association_name].respond_to?(:to_a)
|
345
345
|
end
|
346
346
|
end
|
347
347
|
|
@@ -366,7 +366,7 @@ module GraphStarter
|
|
366
366
|
end
|
367
367
|
|
368
368
|
def self.model_slug
|
369
|
-
name.tableize
|
369
|
+
@model_slug ||= name.tableize
|
370
370
|
end
|
371
371
|
|
372
372
|
def self.properties
|
@@ -389,7 +389,7 @@ module GraphStarter
|
|
389
389
|
:asset, [:category]]
|
390
390
|
else
|
391
391
|
[all(:asset),
|
392
|
-
:asset]
|
392
|
+
:asset, []]
|
393
393
|
end
|
394
394
|
|
395
395
|
::GraphStarter::QueryAuthorizer.new(query, asset: GraphStarter.configuration.scope_filters[self.name.to_sym])
|
@@ -412,13 +412,13 @@ module GraphStarter
|
|
412
412
|
.merge(model: {Model: {name: name}})
|
413
413
|
.on_create_set(model: {private: false})
|
414
414
|
.break
|
415
|
-
.merge('model-[:HAS_PROPERTY]->(property:Property {name: property_name})')
|
415
|
+
.merge('(model)-[:HAS_PROPERTY]->(property:Property {name: property_name})')
|
416
416
|
.on_create_set(property: {private: false})
|
417
417
|
.on_create_set('property.uuid = uuid, property.ruby_type = ruby_type')
|
418
418
|
.with(:property)
|
419
419
|
|
420
420
|
::GraphStarter::Property # rubocop:disable Lint/Void
|
421
|
-
QueryAuthorizer.new(query).authorized_query(:property,
|
421
|
+
QueryAuthorizer.new(query).authorized_query(:property, [], user)
|
422
422
|
end
|
423
423
|
|
424
424
|
def self.property_name_and_uuid_and_ruby_type_query
|
@@ -14,7 +14,8 @@ module GraphStarter
|
|
14
14
|
validates_attachment_content_type :source, content_type: ['image/jpg', 'image/jpeg', 'image/png', 'image/gif']
|
15
15
|
|
16
16
|
def source_url
|
17
|
-
|
17
|
+
default_style = GraphStarter.configuration.default_image_style
|
18
|
+
source.present? ? source.url(default_style) : original_url
|
18
19
|
end
|
19
20
|
end
|
20
21
|
end
|
@@ -17,9 +17,10 @@
|
|
17
17
|
.ui.relaxed.divided.list
|
18
18
|
- categories[0,2].each do |category|
|
19
19
|
.item
|
20
|
-
=
|
21
|
-
|
22
|
-
|
20
|
+
= asset_icon(category, (@category_images || {})[category.id])
|
21
|
+
|
22
|
+
.content = link_to category.safe_title, asset_path(category)
|
23
|
+
|
23
24
|
- if categories.size > 2
|
24
25
|
.item
|
25
26
|
i.ellipsis.horizontal.large.icon
|
File without changes
|
@@ -2,7 +2,7 @@ module GraphStarter
|
|
2
2
|
class Configuration
|
3
3
|
attr_writer :user_class
|
4
4
|
|
5
|
-
attr_accessor :menu_models, :icon_classes, :scope_filters, :editable_properties
|
5
|
+
attr_accessor :menu_models, :icon_classes, :scope_filters, :editable_properties, :default_image_style
|
6
6
|
|
7
7
|
def initialize
|
8
8
|
@icon_classes = {}
|
@@ -89,9 +89,9 @@ module GraphStarter
|
|
89
89
|
end
|
90
90
|
|
91
91
|
def user_authorization_paths(variable, user_variable = :user)
|
92
|
-
["#{variable}<-[#{variable}_created_rel:CREATED]
|
93
|
-
"#{variable}<-[#{variable}_direct_access_rel:CAN_ACCESS]
|
94
|
-
"#{variable}<-[#{variable}_indirect_can_access_rel:CAN_ACCESS]-(:Group)<-[:HAS_SUBGROUP*0..5]-(:Group)<-[:BELONGS_TO]
|
92
|
+
["(#{variable})<-[#{variable}_created_rel:CREATED]-(#{user_variable})",
|
93
|
+
"(#{variable})<-[#{variable}_direct_access_rel:CAN_ACCESS]-(#{user_variable})",
|
94
|
+
"(#{variable})<-[#{variable}_indirect_can_access_rel:CAN_ACCESS]-(:Group)<-[:HAS_SUBGROUP*0..5]-(:Group)<-[:BELONGS_TO]-(#{user_variable})"]
|
95
95
|
end
|
96
96
|
end
|
97
97
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graph_starter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.16.
|
4
|
+
version: 0.16.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Underwood
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: neo4j
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 7.0.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 7.0.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: semantic-ui-sass
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -196,9 +196,9 @@ files:
|
|
196
196
|
- app/views/graph_starter/assets/_card.html.slim
|
197
197
|
- app/views/graph_starter/assets/_cards.html.slim
|
198
198
|
- app/views/graph_starter/assets/_extra_admin_buttons.html
|
199
|
+
- app/views/graph_starter/assets/_extra_buttons.html
|
199
200
|
- app/views/graph_starter/assets/_extra_card_content.html.slim
|
200
201
|
- app/views/graph_starter/assets/_form.html.slim
|
201
|
-
- app/views/graph_starter/assets/_icon.html.slim
|
202
202
|
- app/views/graph_starter/assets/_images.html.slim
|
203
203
|
- app/views/graph_starter/assets/_property_items.html.slim
|
204
204
|
- app/views/graph_starter/assets/_recommendations.html.slim
|
@@ -1,11 +0,0 @@
|
|
1
|
-
- image_url = nil
|
2
|
-
- if defined?(image)
|
3
|
-
- image_url = image.source.url if defined?(image) && image.present?
|
4
|
-
- elsif (asset.class.has_images? || asset.class.has_image?) && asset.first_image_source_url.present?
|
5
|
-
- image_url = asset.first_image_source_url
|
6
|
-
|
7
|
-
- if image_url
|
8
|
-
= image_tag image_url, class: 'ui avatar image'
|
9
|
-
- else
|
10
|
-
i class="#{asset.class.icon_class || 'folder'} large icon"
|
11
|
-
|