ns_service_pack 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,8 +1,19 @@
1
+ #== TODO
2
+
1
3
  #==============History:
4
+ #==0.1.7
5
+
6
+ #==0.1.6
7
+ * Fix README 文件中的忘加Ns::的bug
8
+ * 增大page_size的每页限制,原来250改为5000
9
+ * mapping列表中移除键值中的mapping
10
+ * 查找时提供select支持
11
+ * 增加业务删除接口支持: destroy
12
+ * Fix oracle 引用的bug
13
+
2
14
  #==0.1.4
3
15
  * 移除layout中对主项目中application js/css的调用
4
16
 
5
-
6
17
  #==0.1.3
7
18
  * 为内置视图添加layout
8
19
  * 添加对以前版本的兼容(load mapping时的键值变化)
data/README.rdoc CHANGED
@@ -36,8 +36,8 @@
36
36
 
37
37
  * 获取最新版本: gem install ns_service_pack
38
38
  * rails项目根目录下: nsp install && bundle install(此步检查下Gemfile,确保引用最新,或gem 'ns_service_pack', '~>0.1')
39
- * 相关Models中明确引用: include FieldMapping
40
- * ApplicationController或!子类!中添加引用: include ControllerServicable
39
+ * 相关Models中明确引用: include Ns::FieldMapping
40
+ * ApplicationController或!子类!中添加引用: include Ns::ControllerServicable
41
41
 
42
42
  # 验证是否成功?
43
43
  * 访问: http://service_post:port/, 非生产环境会重定向到/interfaces, 点击示例中的链接(动态生成)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.1.6
@@ -5,7 +5,7 @@
5
5
  <%if v.is_a?(Hash)%>
6
6
  <%v.each_with_index do |e1, i|%>
7
7
  <tr>
8
- <td> <%= i==0 ? k : ''%></td>
8
+ <td> <%= i==0 ? k.to_s.gsub('_mapping', '') : ''%></td>
9
9
  <td> <%= e1[0]%> </td>
10
10
  <td> <%= e1[1]%> </td>
11
11
  </tr>
@@ -29,7 +29,7 @@ class Ns::ScaffoldGenerator < Rails::Generators::ScaffoldGenerator
29
29
  #TODO MOVE dev interface TO this gem controller
30
30
  gsub_file('config/routes.rb', /^\s*resources :#{plural_name}$/) do
31
31
  <<-Doc
32
- resources :#{plural_name}, :except=>[:edit, :destroy]
32
+ resources :#{plural_name}, :except=>[:edit]
33
33
  Doc
34
34
  end
35
35
  end
@@ -18,6 +18,7 @@ module Ns
18
18
  end
19
19
 
20
20
  def self.delete()
21
+ request('delete', url, params)
21
22
  end
22
23
 
23
24
  def self.request(action = 'get', url = '', data_params = {})
@@ -32,6 +33,12 @@ module Ns
32
33
  raise ResultError.new(result)
33
34
  end
34
35
  end
36
+
37
+ def self.ajax_request(action = 'get', url = '', data_params = {})
38
+ #TODO 网路异常处理
39
+ json_response = RestClient.send(action, url, :data=>data_params)
40
+ #render :json=>json_response
41
+ end
35
42
 
36
43
  def self.unpack(json_response_str = nil)
37
44
  Result.new(JSON.parse(json_response_str))
@@ -2,55 +2,24 @@
2
2
  module Ns
3
3
  module ControllerServicable
4
4
  def index
5
- @result = paginate(params) do |start, page_size|
5
+ @result = model_class.paginate(params) do |start, page_size|
6
6
  get_page_data(start, page_size, params)
7
7
  end
8
8
  render :json=>ResultPacker.data(@result.as_json)
9
9
  end
10
-
10
+
11
11
  #return [total_count, page_data]
12
12
  #可在子类中覆盖定制
13
13
  def get_page_data(start = 0, size = 10, params = {})
14
- where_conds = if @conds.present?
15
- @conds
16
- else
17
- query_conditionize(params, @conds)
18
- end
14
+ where_conds = @conds.present? ? @conds : model_class.arrayify_conds(params)
19
15
  logger.debug "====>conds: #{where_conds.inspect}"
20
16
  conds = {:conditions=>where_conds}
21
17
  total_count = model_class.count(conds)
22
- page_params = conds.merge!(:offset=>start, :limit=>size, :order=>params[:order])
18
+ page_params = conds.merge!(:select=>model_class.select_fields(params[:select]),
19
+ :offset=>start, :limit=>size, :order=>params[:order])
23
20
  page_data = model_class.all(page_params)
24
21
  [total_count, page_data]
25
22
  end
26
-
27
- def query_conditionize(params = {}, conds = {})
28
- #清除空条件
29
- params.delete_if{|k, v| v.blank? }
30
- #TODO 有@conds时如何融入???
31
- #hash结构
32
- conds = model_class.db_hashize(params)
33
- end
34
-
35
- #分页方法 # 加入文档说明
36
- def paginate(params = {})
37
- current_page = params[:current_page].to_i
38
- current_page = current_page < 1 ? 1 : current_page
39
- page_size = params[:page_size].to_i
40
- page_size = page_size <= 0 ? 10 : page_size
41
- page_size = page_size > 250 ? 250 : page_size
42
- offset = (current_page-1)*page_size
43
- #返回总数和当前页数据 起始位置, 数量
44
- total_count, page_data = yield(offset, page_size)
45
- {
46
- :total_size=>total_count,
47
- :page_size=>page_size,
48
- :current_page=>current_page,
49
- :page_from=>offset + 1,
50
- :page_to=>offset + page_data.size,
51
- :page_items=>page_data
52
- }
53
- end
54
23
 
55
24
  #get a new buz obj with db default value
56
25
  def new
@@ -60,15 +29,15 @@ module Ns
60
29
 
61
30
  #查找单条记录
62
31
  def show
63
- @_obj = model_class.find(params[:id])
64
- render :json=>ResultPacker.data(@_obj.as_json)
32
+ @_obj = model_class._find_resource(params)
33
+ render :json=>ResultPacker.data(@_obj, "获取#{model_class.name}##{@_obj.respond_to?(:id) ? @_obj.id : @_obj.object_id}成功!")
65
34
  end
66
-
35
+
67
36
  #创建记录
68
37
  def create
69
38
  @_obj = model_class.new_from_buz(params[:data])
70
39
  if @_obj.save
71
- render :json=>ResultPacker.data(@_obj)
40
+ render :json=>ResultPacker.data(@_obj, "创建#{model_class.name}##{@_obj.respond_to?(:id) ? @_obj.id : @_obj.object_id}成功!")
72
41
  else
73
42
  render :json=>ResultPacker.help(valid_errors(model_class.buz_hashize(@_obj.errors.to_hash)))
74
43
  end
@@ -78,12 +47,27 @@ module Ns
78
47
  def update
79
48
  @_obj = model_class.find(params[:id])
80
49
  if @_obj.update_from_buz(params[:data])
81
- render :json=>ResultPacker.data(@_obj)
50
+ render :json=>ResultPacker.data(@_obj, "更新#{model_class.name}##{@_obj.respond_to?(:id) ? @_obj.id : @_obj.object_id}成功!")
82
51
  else
83
52
  render :json=>ResultPacker.help(valid_errors(model_class.buz_hashize(@_obj.errors.to_hash)))
84
53
  end
85
54
  end
86
55
 
56
+ #更新记录 # 在获取时要做过滤判断!! TODO
57
+ def destroy
58
+ @_obj = model_class.find(params[:id])
59
+ if model_class.mapping.keys.include?(:status) && !params.key?(:force_del)
60
+ if @_obj.update_from_buz(:status=>'作废')
61
+ render :json=>ResultPacker.data(@_obj, "该记录已被逻辑删除(状态标记为:作废!)")
62
+ else
63
+ render :json=>ResultPacker.help(valid_errors(model_class.buz_hashize(@_obj.errors.to_hash)))
64
+ end
65
+ else
66
+ @_obj.destroy
67
+ render :json=>ResultPacker.data(@_obj, "警告:资源(#{model_class.name}##{@_obj.respond_to?(:id) ? @_obj.id : @_obj.object_id})已被物理删除!此资源不具备逻辑删除条件具有status业务属性或被内部强制删除!")
68
+ end
69
+ end
70
+
87
71
  protected
88
72
  #验证错误回传
89
73
  def valid_errors(error_hash = {})
@@ -40,8 +40,119 @@ module Ns
40
40
  def update_from_buz(params={})
41
41
  update_attributes(self.class.db_hashize(params))
42
42
  end
43
+
44
+ #获取对象的某个属性的业务值
45
+ def buz_value(buz_attr = nil)
46
+ result = nil
47
+ if buz_attr
48
+ db_key = self.class.mapping[buz_attr.to_sym]
49
+ if db_key
50
+ db_value = send(db_key)
51
+ #TODO BETTER
52
+ result = self.class.buz_hashize(db_key=>db_value)[buz_attr.to_sym]
53
+ end
54
+ end
55
+ result
56
+ end
57
+
58
+ def erp_admin?(params = {})
59
+ self.class.erp_admin?(params)
60
+ end
43
61
 
44
62
  module ClassMethods
63
+
64
+ def _find_resource(params = {})
65
+ obj = find(params[:id])
66
+ if mapping.keys.include?(:status) && !erp_admin?(params)
67
+ buz_value = get_map_value(:status, obj.send(mapping[:status]))
68
+ if buz_value == '作废'
69
+ raise "资源#{name}##{obj.object_id}已经作废不可用!"
70
+ end
71
+ end
72
+ obj
73
+ end
74
+
75
+ #convert buz array to db array
76
+ def dbize_array(buz_array = [])
77
+ result = nil
78
+ if buz_array && buz_array.is_a?(Array)
79
+ result = buz_array.map do |e|
80
+ db_key = mapping[e.to_sym] rescue nil
81
+ end.compact
82
+ end
83
+ result
84
+ end
85
+
86
+ def select_fields(array = [])
87
+ db_keys = dbize_array(array) || mapping.values
88
+ #FIXME 添加是否是数据属性的判断 better
89
+ attrs = new.attributes.keys.map(&:to_sym)
90
+ db_keys & attrs
91
+ rescue nil
92
+ end
93
+
94
+ #分页方法 # 加入文档说明
95
+ def paginate(params = {})
96
+ current_page = params[:current_page].to_i
97
+ current_page = current_page < 1 ? 1 : current_page
98
+ page_size = params[:page_size].to_i
99
+ page_size = page_size <= 0 ? 10 : page_size
100
+ #increment the limit
101
+ page_size = page_size > 5000 ? 5000 : page_size
102
+ offset = (current_page-1)*page_size
103
+ #返回总数和当前页数据 起始位置, 数量
104
+ total_count, page_data = yield(offset, page_size)
105
+ {
106
+ :total_size=>total_count,
107
+ :page_size=>page_size,
108
+ :current_page=>current_page,
109
+ :page_from=>offset + 1,
110
+ :page_to=>offset + page_data.size,
111
+ :page_items=>page_data
112
+ }
113
+ end
114
+
115
+ #将外界条件转化为一个数组
116
+ def arrayify_conds(params = {})
117
+ #清除空条件
118
+ params.delete_if{|k, v| v.blank? }
119
+
120
+ field_hash = {}
121
+ mapping_hash = {}
122
+ params.each do |k, v|
123
+ the_key = k.to_sym
124
+ if mapping.keys.include?(the_key)
125
+ field_hash[the_key] = get_map_value(the_key, v)
126
+ mapping_hash[the_key] = mapping[the_key]
127
+ end
128
+ end
129
+ result_array = []
130
+ cond_str = ""
131
+ if params[:extra_where_sql]
132
+ cond_str << params[:extra_where_sql].to_s
133
+ end
134
+
135
+ if mapping_hash.present?
136
+ cond_str << " and "
137
+ cond_str << mapping_hash.map do |buz_key, db_key|
138
+ "#{db_key} = :#{buz_key}"
139
+ end.join(" and ")
140
+ end
141
+ unless erp_admin?(params) && mapping.keys.include?(:status)
142
+ cond_str << " and " if cond_str.present?
143
+ cond_str << " #{mapping[:status]} != -1" #TODO FIXME -1 use
144
+ end
145
+
146
+ result_array << cond_str
147
+ result_array << field_hash
148
+ result_array
149
+ end
150
+
151
+ #@params invoke_src: erp_admin
152
+ def erp_admin?(params = {})
153
+ params[:invoke_src] == 'erp_admin'
154
+ end
155
+
45
156
  #Fix a bug on 20111117 by shang, this override the original method name
46
157
  def __model_clazz_name
47
158
  self.name.underscore
@@ -1,4 +1,4 @@
1
- #coding: utf-8
1
+ #encoding: utf-8
2
2
  =begin
3
3
  * 20111115 find bug
4
4
  避免每次重新生成CodeHash的对象
@@ -4,7 +4,7 @@
4
4
  # It is recommended to set time zone in TZ environment variable so that the same timezone will be used by Ruby and by Oracle session
5
5
  #ENV['TZ'] = 'UTC'
6
6
 
7
- if defined?(ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter)
7
+ if defined?(ActiveRecord::ConnectionAdapters::OracleEnhancedRailtie)
8
8
  ActiveSupport.on_load(:active_record) do
9
9
  ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.class_eval do
10
10
  # id columns and columns which end with _id will always be converted to integers
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "ns_service_pack"
8
- s.version = "0.1.5"
8
+ s.version = "0.1.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Caory, Shang, Geogeous"]
12
- s.date = "2011-12-05"
12
+ s.date = "2011-12-07"
13
13
  s.description = "abstract some common pattern to service pack"
14
14
  s.email = "cao7113@hotmail.com"
15
15
  s.executables = ["nsp"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ns_service_pack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-05 00:00:00.000000000Z
12
+ date: 2011-12-07 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
16
- requirement: &89924740 !ruby/object:Gem::Requirement
16
+ requirement: &85246320 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.6.7
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *89924740
24
+ version_requirements: *85246320
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: thor
27
- requirement: &89924450 !ruby/object:Gem::Requirement
27
+ requirement: &85246000 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.14.6
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *89924450
35
+ version_requirements: *85246000
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: shoulda
38
- requirement: &89924150 !ruby/object:Gem::Requirement
38
+ requirement: &85245700 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *89924150
46
+ version_requirements: *85245700
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
- requirement: &89923850 !ruby/object:Gem::Requirement
49
+ requirement: &85245420 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.0.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *89923850
57
+ version_requirements: *85245420
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &89923580 !ruby/object:Gem::Requirement
60
+ requirement: &85245180 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.6.4
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *89923580
68
+ version_requirements: *85245180
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rcov
71
- requirement: &89923340 !ruby/object:Gem::Requirement
71
+ requirement: &85244940 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *89923340
79
+ version_requirements: *85244940
80
80
  description: abstract some common pattern to service pack
81
81
  email: cao7113@hotmail.com
82
82
  executables:
@@ -141,7 +141,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
141
141
  version: '0'
142
142
  segments:
143
143
  - 0
144
- hash: 1046210893
144
+ hash: -447924557
145
145
  required_rubygems_version: !ruby/object:Gem::Requirement
146
146
  none: false
147
147
  requirements: