faalis 0.20.0 → 0.21.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/app/controllers/faalis/api_controller.rb +93 -6
- data/app/models/faalis/user.rb +6 -1
- data/app/views/faalis/api/v1/users/index.json.jbuilder +1 -1
- data/lib/faalis/generators/concerns/angular.rb +7 -1
- data/lib/faalis/generators/concerns/dependency.rb +15 -0
- data/lib/faalis/generators/concerns/json_input.rb +5 -3
- data/lib/faalis/generators/concerns/menu.rb +12 -0
- data/lib/faalis/generators/concerns/model.rb +5 -0
- data/lib/faalis/generators/concerns/parent.rb +31 -2
- data/lib/faalis/generators/concerns/required.rb +3 -0
- data/lib/faalis/generators/concerns/resource_fields.rb +37 -0
- data/lib/faalis/generators/concerns/resource_name.rb +1 -0
- data/lib/faalis/generators/concerns/tabs.rb +5 -0
- data/lib/faalis/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e7d77be09881beddd4d13f35ae2ad54576a8ecaf
|
4
|
+
data.tar.gz: 95fac973732a6d0be6cd34a359e71b1d58592201
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da3e1dbe6d99f4954ca6a7774bb97159b95ffc7feab3c849ce5526f62b1df1404ec0e9896b05670253a5f97cd0b5009b591d4fcc058d3ea5d524425321a2989c
|
7
|
+
data.tar.gz: f75f7d92eac57912f2c4a917ef6bbc67876097c04248c2814cd0e1d3015d1ddcc7261b673bb4f4e743ddb1211e602e96e27fda534a9be52c65e06f7f4a064105
|
@@ -19,19 +19,26 @@
|
|
19
19
|
require_dependency "faalis/api_controller"
|
20
20
|
|
21
21
|
|
22
|
+
# This class is the base class of all API controllers in any **Faalis**
|
23
|
+
# host applications. Each host Rails application should have an `APIController`
|
24
|
+
# which inherit from this class.
|
22
25
|
class Faalis::APIController < Faalis::ApplicationController
|
26
|
+
|
27
|
+
@@allowed_fields = []
|
28
|
+
|
29
|
+
# Only support `json` format
|
23
30
|
respond_to :json
|
24
31
|
|
25
|
-
|
32
|
+
# Authenticate user before any action take place
|
33
|
+
before_filter :authenticate
|
26
34
|
|
27
35
|
protect_from_forgery
|
28
36
|
|
37
|
+
# Set csrf cookie after any action
|
29
38
|
after_filter :set_csrf_cookie_for_ng
|
30
39
|
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
|
40
|
+
# Rescue from any access denied exception raised from cancan and
|
41
|
+
# returns a useful error message in json
|
35
42
|
rescue_from CanCan::AccessDenied do |exception|
|
36
43
|
|
37
44
|
render :status => 403, :json => {
|
@@ -41,11 +48,91 @@ class Faalis::APIController < Faalis::ApplicationController
|
|
41
48
|
}
|
42
49
|
end
|
43
50
|
|
51
|
+
def set_csrf_cookie_for_ng
|
52
|
+
cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
|
53
|
+
end
|
54
|
+
|
55
|
+
# User authentication for API services take place here. By default
|
56
|
+
# **Faalis** uses the authentication method of **Devise** to authenticate
|
57
|
+
# access to API service.
|
58
|
+
#
|
59
|
+
# If you want to change authentication method ? just override this method
|
60
|
+
# in you **APIController**
|
61
|
+
def authenticate
|
62
|
+
authenticate_user!
|
63
|
+
end
|
64
|
+
|
65
|
+
# Load resource by using parameters specified in querystring.
|
66
|
+
def load_resource_by_query
|
67
|
+
# If any query string parameter provided and allow fields specified
|
68
|
+
if not request.query_parameters.empty? and not allowed_fields.empty?
|
69
|
+
#load_resource
|
70
|
+
|
71
|
+
# Iterate over parameters in query string
|
72
|
+
request.query_parameters.each do |key, value|
|
73
|
+
# each key can be like filename[__querytype]=value
|
74
|
+
# which `querytype` is string that specify the query type scope
|
75
|
+
# to use in model. For example these is a query type scope called
|
76
|
+
# `gt` which mean the mentioned field should be greater than the
|
77
|
+
# value
|
78
|
+
field, query_type = key.split("__")
|
79
|
+
|
80
|
+
if allowed_fields.include? field
|
81
|
+
# If field name is in the allowed list
|
82
|
+
# If no query type specified we will use assignment scope.
|
83
|
+
if query_type.nil?
|
84
|
+
query_type = "assignment"
|
85
|
+
end
|
86
|
+
|
87
|
+
# If model have an scope with the "#{query_type}_query" name.
|
88
|
+
# Otherwise skip
|
89
|
+
if model_class.respond_to? "#{query_type}_query"
|
90
|
+
|
91
|
+
# If resource already loaded. If there was a instnace variable
|
92
|
+
# with the plural name of the resource exists then resource
|
93
|
+
# already loaded and we should chain new conditions
|
94
|
+
if instance_variable_defined? "@#{controller_name}"
|
95
|
+
instance_variable_get("@#{controller_name}").send("#{query_type}_query".to_sym, field, value)
|
96
|
+
else
|
97
|
+
# Resource did not loaded we make first query
|
98
|
+
# (without touching database) and set the corresponding
|
99
|
+
# instance variables
|
100
|
+
relation_object = model_class.send("#{query_type}_query".to_sym, field, value)
|
101
|
+
instance_variable_set("@#{controller_name}", relation_object)
|
102
|
+
end
|
103
|
+
|
104
|
+
else
|
105
|
+
logger.info "There is no `#{query_type}_query` in `#{model_class.to_s}` model."
|
106
|
+
end
|
107
|
+
else
|
108
|
+
logger.warn "`#{field}` in not in allowed list for `#{self.class.to_s}`."
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
# An array of allowed fields for query loading
|
116
|
+
def allowed_fields
|
117
|
+
@@allowed_fields
|
118
|
+
end
|
119
|
+
|
120
|
+
# Using this query you can activate the query loading system
|
121
|
+
# and specify fields which you want to use in query loading
|
122
|
+
def self.allow_query_on(*args)
|
123
|
+
@@allowed_fields = args.to_a.collect { |x| x.to_s }
|
124
|
+
end
|
125
|
+
|
126
|
+
|
44
127
|
protected
|
45
128
|
|
129
|
+
# Model class related to this controller.
|
130
|
+
def model_class
|
131
|
+
controller_name.singularize.classify.constantize
|
132
|
+
end
|
133
|
+
|
46
134
|
def verified_request?
|
47
135
|
super || form_authenticity_token == request.headers['X-XSRF-TOKEN']
|
48
136
|
end
|
49
137
|
|
50
|
-
|
51
138
|
end
|
data/app/models/faalis/user.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
module Faalis
|
2
2
|
module Generators
|
3
3
|
module Concerns
|
4
|
+
|
5
|
+
# This **Concern** looks for `raw_path` and `path` in scaffold
|
6
|
+
# json file which both of them are optional.
|
7
|
+
# Using `raw_path` you can override the full path of generate file.
|
8
|
+
# and with `path` you can override the directory name inside
|
9
|
+
# `app/assets/javascripts`.
|
4
10
|
module Angular
|
5
11
|
|
6
12
|
def self.included(base)
|
@@ -13,7 +19,7 @@ module Faalis
|
|
13
19
|
|
14
20
|
private
|
15
21
|
|
16
|
-
|
22
|
+
# return the relative path to place where scaffold shoud be created.
|
17
23
|
def angularjs_app_path
|
18
24
|
if not resource_data["raw_path"].blank?
|
19
25
|
resource_data["raw_path"]
|
@@ -1,6 +1,20 @@
|
|
1
1
|
module Faalis
|
2
2
|
module Generators
|
3
3
|
module Concerns
|
4
|
+
|
5
|
+
# This **Concern** adds support of dependencies to scaffold using
|
6
|
+
# `deps` key in json file. You can provide a list of scaffold dependencies
|
7
|
+
# which should mention as dependecy of **Angularjs** module of scaffold.
|
8
|
+
# Example:
|
9
|
+
#
|
10
|
+
#```javascript
|
11
|
+
# ....
|
12
|
+
# "deps": [
|
13
|
+
# "module1",
|
14
|
+
# "module2"
|
15
|
+
# ],
|
16
|
+
# ...
|
17
|
+
#```
|
4
18
|
module Dependency
|
5
19
|
|
6
20
|
def self.included(base)
|
@@ -8,6 +22,7 @@ module Faalis
|
|
8
22
|
#base.class_option :deps, :type => :string, :default => "", :desc => "Dependencies of Angularjs module, comma separated"
|
9
23
|
end
|
10
24
|
|
25
|
+
# Return a list of dependencies.
|
11
26
|
def deps
|
12
27
|
resource_data[:deps]
|
13
28
|
end
|
@@ -6,9 +6,8 @@ module Faalis
|
|
6
6
|
module Concerns
|
7
7
|
# This module Provide an argument for generator which
|
8
8
|
# is needed by other `Concerns`.
|
9
|
-
#
|
10
|
-
#
|
11
|
-
|
9
|
+
# Each Concern will have its own entry in scaffold json
|
10
|
+
# file. For documentation on each entry checkout its concern class
|
12
11
|
module JsonInput
|
13
12
|
|
14
13
|
def self.included(base)
|
@@ -18,11 +17,14 @@ module Faalis
|
|
18
17
|
|
19
18
|
private
|
20
19
|
|
20
|
+
# Read the json file and returns its raw data
|
21
21
|
def json_file_data
|
22
22
|
path = File.expand_path(jsonfile)
|
23
23
|
File.read(path)
|
24
24
|
end
|
25
25
|
|
26
|
+
# Return the hash related to json structure from cache or by
|
27
|
+
# reading file.
|
26
28
|
def resource_data
|
27
29
|
if @data
|
28
30
|
@data
|
@@ -1,6 +1,18 @@
|
|
1
1
|
module Faalis
|
2
2
|
module Generators
|
3
3
|
module Concerns
|
4
|
+
# This **concern** adds support of side menu to scaffold and `menu` key
|
5
|
+
# to jsonfile. `menu` key is an array which each element represent a menu
|
6
|
+
# entry and should be and object with following keys:
|
7
|
+
#
|
8
|
+
# `title`: Title of submenu
|
9
|
+
#
|
10
|
+
# `url`: Url of submenu link
|
11
|
+
#
|
12
|
+
# `action`: Permissions related action to check on resource model.
|
13
|
+
#
|
14
|
+
# `model`: Model of related resource which permission action should be check
|
15
|
+
# against.
|
4
16
|
module Menu
|
5
17
|
|
6
18
|
def self.included(base)
|
@@ -1,6 +1,9 @@
|
|
1
1
|
module Faalis
|
2
2
|
module Generators
|
3
3
|
module Concerns
|
4
|
+
# This **concern** adds support for `model` key inside jsonfile which
|
5
|
+
# allow you to override the name of resource default model name.
|
6
|
+
# Resource model name is used in some processes like permission system.
|
4
7
|
module Model
|
5
8
|
|
6
9
|
def self.included(base)
|
@@ -11,10 +14,12 @@ module Faalis
|
|
11
14
|
|
12
15
|
private
|
13
16
|
|
17
|
+
# Does an alternative `model` is specified ?
|
14
18
|
def model_specified?
|
15
19
|
resource_data.include? "model"
|
16
20
|
end
|
17
21
|
|
22
|
+
# Name of alternative `model`
|
18
23
|
def model
|
19
24
|
if model_specified?
|
20
25
|
resource_data["model"]
|
@@ -1,6 +1,32 @@
|
|
1
1
|
module Faalis
|
2
2
|
module Generators
|
3
3
|
module Concerns
|
4
|
+
|
5
|
+
# This **concern** adds the methods needed to support nested resource
|
6
|
+
# in any dashboad generators. This module adds `parents` key to jsonfile
|
7
|
+
# which is an array of resource parents in right order.
|
8
|
+
# For example if we have a nested resource like:
|
9
|
+
#
|
10
|
+
# ```ruby
|
11
|
+
# resources :blogs do
|
12
|
+
# resources :categories do
|
13
|
+
# resources :posts
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
# ```
|
17
|
+
#
|
18
|
+
# And we want to create an dashboard scaffold for `post` resource we have
|
19
|
+
# to add `parent` key to our json file like this:
|
20
|
+
#
|
21
|
+
# ```json
|
22
|
+
# ...
|
23
|
+
# "parents": [
|
24
|
+
# "blog",
|
25
|
+
# "category"
|
26
|
+
# ]
|
27
|
+
# ...
|
28
|
+
# ```
|
29
|
+
# Please pay attention to singular form of name of parents in json defination
|
4
30
|
module Parent
|
5
31
|
|
6
32
|
def self.included(base)
|
@@ -12,8 +38,10 @@ module Faalis
|
|
12
38
|
|
13
39
|
# check for parent
|
14
40
|
def parent?
|
15
|
-
unless resource_data
|
16
|
-
|
41
|
+
unless resource_data. include? "parents"
|
42
|
+
unless resource_data["parents"].nil?
|
43
|
+
return true
|
44
|
+
end
|
17
45
|
end
|
18
46
|
false
|
19
47
|
end
|
@@ -23,6 +51,7 @@ module Faalis
|
|
23
51
|
path.gsub(/^\//, "")
|
24
52
|
end
|
25
53
|
|
54
|
+
# Return an array of resource parents
|
26
55
|
def parents
|
27
56
|
if parent?
|
28
57
|
_parents = resource_data["parents"]
|
@@ -4,6 +4,32 @@ require "faalis/generators/fields/relation"
|
|
4
4
|
module Faalis
|
5
5
|
module Generators
|
6
6
|
module Concerns
|
7
|
+
# This **concern** module is one of the most important **concerns** in
|
8
|
+
# dashboard scaffold system. This module adds `fields` key to json file
|
9
|
+
# which use for defining the resource fields. `fields` key is an array
|
10
|
+
# of objects which each object represent a field. Each field have following
|
11
|
+
# attributes:
|
12
|
+
#
|
13
|
+
# **name**: Name of field
|
14
|
+
#
|
15
|
+
# **type**: Type of field. some of the most important types are: `string`,
|
16
|
+
# `integer`, `flout`, `belongs_to`, `has_many`, `in`, `datetime`.
|
17
|
+
# For complete list of types take a look at
|
18
|
+
# `app/assets/javascripts/faalis/dashboard/modules/fields/`
|
19
|
+
#
|
20
|
+
# **to**: This attribute is just for `in`, `has_many` and `belongs_to` field
|
21
|
+
# types which define the resource that current resource have dependency
|
22
|
+
# with. Bear in mind that `in` type uses `to` attrbute as an array of
|
23
|
+
# possible value for field and will render as a combobox.
|
24
|
+
#
|
25
|
+
# **options**: An object of type related objects. For example a list of
|
26
|
+
# current resource parents just like `parent` key.
|
27
|
+
#
|
28
|
+
# **bulk**: All fields with true as `bulk` value will be used in bulk editor.
|
29
|
+
#
|
30
|
+
# **tab**: ID of a Tab that this field should be appear on.
|
31
|
+
#
|
32
|
+
# **required**: Field will be non optional.
|
7
33
|
module ResourceFields
|
8
34
|
|
9
35
|
def self.included(base)
|
@@ -19,6 +45,7 @@ module Faalis
|
|
19
45
|
# [name, type]
|
20
46
|
def fields
|
21
47
|
fields = []
|
48
|
+
if have_fields?
|
22
49
|
resource_data["fields"].each do |field|
|
23
50
|
name = field["name"]
|
24
51
|
type = field["type"]
|
@@ -30,6 +57,7 @@ module Faalis
|
|
30
57
|
end
|
31
58
|
|
32
59
|
fields << [name, type]
|
60
|
+
end
|
33
61
|
end
|
34
62
|
fields
|
35
63
|
end
|
@@ -99,6 +127,15 @@ module Faalis
|
|
99
127
|
def no_filter?
|
100
128
|
resource_data.include? "no_filter" && resource_data["no_filter"]
|
101
129
|
end
|
130
|
+
|
131
|
+
def have_fields?
|
132
|
+
unless resource_data.include? "fields"
|
133
|
+
unless resource_data["fields"].nil?
|
134
|
+
return true
|
135
|
+
end
|
136
|
+
end
|
137
|
+
false
|
138
|
+
end
|
102
139
|
end
|
103
140
|
end
|
104
141
|
end
|
@@ -1,6 +1,11 @@
|
|
1
1
|
module Faalis
|
2
2
|
module Generators
|
3
3
|
module Concerns
|
4
|
+
# Using this **concern** module user can specify an array of tab objects
|
5
|
+
# which each one has an `id` and `name` attribute. Tabs will be added to
|
6
|
+
# **new** view of resource. Also this concern will a `tab` key to field
|
7
|
+
# object. All the fields with same `id` as a tab will be grouped in that
|
8
|
+
# tab
|
4
9
|
module Tabs
|
5
10
|
|
6
11
|
def self.included(base)
|
data/lib/faalis/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faalis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.21.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sameer Rahmani
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-03-
|
12
|
+
date: 2014-03-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|