inkwell 1.1.1 → 1.1.7
Sign up to get free protection for your applications and to get access to all the features.
- data/db/migrate/20130212130878_change_community_table_for_adding_types_and_user_access.rb +14 -0
- data/lib/acts_as_inkwell_community/base.rb +212 -43
- data/lib/acts_as_inkwell_user/base.rb +44 -2
- data/lib/common/base.rb +11 -0
- data/lib/inkwell/version.rb +1 -1
- data/test/dummy/app/models/community.rb +1 -1
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20130217135512_change_community_table_for_adding_types_and_user_access.inkwell.rb +15 -0
- data/test/dummy/db/schema.rb +16 -11
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +1501 -0
- data/test/dummy/log/test.log +0 -0
- data/test/dummy/spec/functional/community_spec.rb +907 -35
- data/test/dummy_without_community/db/development.sqlite3 +0 -0
- data/test/dummy_without_community/db/migrate/20130219152805_rename_parent_id_to_parent_comment_id_in_comment_table.inkwell.rb +6 -0
- data/test/dummy_without_community/db/migrate/20130219152806_change_community_table_for_adding_types_and_user_access.inkwell.rb +15 -0
- data/test/dummy_without_community/db/schema.rb +2 -2
- data/test/dummy_without_community/db/test.sqlite3 +0 -0
- data/test/dummy_without_community/log/development.log +58 -0
- data/test/dummy_without_community/log/test.log +8777 -0
- data/test/dummy_without_community/spec/functional/comments_spec.rb +52 -52
- metadata +21 -14
@@ -0,0 +1,14 @@
|
|
1
|
+
class ChangeCommunityTableForAddingTypesAndUserAccess < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
if ::Inkwell::Engine::config.respond_to?('community_table')
|
4
|
+
add_column ::Inkwell::Engine::config.community_table, :default_user_access, :string, :default => 'w'
|
5
|
+
add_column ::Inkwell::Engine::config.community_table, :writers_ids, :text, :default => '[]'
|
6
|
+
add_column ::Inkwell::Engine::config.community_table, :banned_ids, :text, :default => '[]'
|
7
|
+
add_column ::Inkwell::Engine::config.community_table, :muted_ids, :text, :default => '[]'
|
8
|
+
add_column ::Inkwell::Engine::config.community_table, :invitations_uids, :text, :default => '[]'
|
9
|
+
add_column ::Inkwell::Engine::config.community_table, :public, :boolean, :default => true
|
10
|
+
rename_column ::Inkwell::Engine::config.user_table, :communities_ids, :communities_info
|
11
|
+
remove_column ::Inkwell::Engine::config.user_table, :admin_of
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -27,16 +27,22 @@ module Inkwell
|
|
27
27
|
def add_user(options = {})
|
28
28
|
options.symbolize_keys!
|
29
29
|
user = options[:user]
|
30
|
-
|
30
|
+
raise "this user is already in this community" if self.include_user? user
|
31
|
+
raise "this user is banned" if self.include_banned_user? user
|
31
32
|
|
32
33
|
users_ids = ActiveSupport::JSON.decode self.users_ids
|
33
34
|
users_ids << user.id
|
34
35
|
self.users_ids = ActiveSupport::JSON.encode users_ids
|
36
|
+
if (self.default_user_access == CommunityAccessLevels::WRITE) && !(self.include_muted_user? user)
|
37
|
+
writers_ids = ActiveSupport::JSON.decode self.writers_ids
|
38
|
+
writers_ids << user.id
|
39
|
+
self.writers_ids = ActiveSupport::JSON.encode writers_ids
|
40
|
+
end
|
35
41
|
self.save
|
36
42
|
|
37
|
-
|
38
|
-
|
39
|
-
user.
|
43
|
+
communities_info = ActiveSupport::JSON.decode user.communities_info
|
44
|
+
communities_info << Hash[HashParams::COMMUNITY_ID => self.id, HashParams::ACCESS_LEVEL => self.default_user_access]
|
45
|
+
user.communities_info = ActiveSupport::JSON.encode communities_info
|
40
46
|
user.save
|
41
47
|
|
42
48
|
post_class = Object.const_get ::Inkwell::Engine::config.post_table.to_s.singularize.capitalize
|
@@ -73,11 +79,20 @@ module Inkwell
|
|
73
79
|
users_ids = ActiveSupport::JSON.decode self.users_ids
|
74
80
|
users_ids.delete user.id
|
75
81
|
self.users_ids = ActiveSupport::JSON.encode users_ids
|
82
|
+
|
83
|
+
writers_ids = ActiveSupport::JSON.decode self.writers_ids
|
84
|
+
writers_ids.delete user.id
|
85
|
+
self.writers_ids = ActiveSupport::JSON.encode writers_ids
|
86
|
+
|
87
|
+
admins_info = ActiveSupport::JSON.decode self.admins_info
|
88
|
+
admins_info.delete_if{|item| item['admin_id'] == user.id}
|
89
|
+
self.admins_info = ActiveSupport::JSON.encode admins_info
|
90
|
+
|
76
91
|
self.save
|
77
92
|
|
78
|
-
|
79
|
-
|
80
|
-
user.
|
93
|
+
communities_info = ActiveSupport::JSON.decode user.communities_info
|
94
|
+
communities_info.delete_if {|item| item[HashParams::COMMUNITY_ID] == self.id}
|
95
|
+
user.communities_info = ActiveSupport::JSON.encode communities_info
|
81
96
|
user.save
|
82
97
|
|
83
98
|
timeline_items = ::Inkwell::TimelineItem.where(:owner_id => user.id, :owner_type => OwnerTypes::USER).where "from_source like '%{\"community_id\":#{self.id}%'"
|
@@ -91,27 +106,135 @@ module Inkwell
|
|
91
106
|
end
|
92
107
|
end
|
93
108
|
|
109
|
+
def include_writer?(user)
|
110
|
+
check_user user
|
111
|
+
writers_ids = ActiveSupport::JSON.decode self.writers_ids
|
112
|
+
writers_ids.include? user.id
|
113
|
+
end
|
114
|
+
|
94
115
|
def include_user?(user)
|
95
116
|
check_user user
|
96
|
-
|
97
|
-
|
117
|
+
communities_info = ActiveSupport::JSON.decode user.communities_info
|
118
|
+
(communities_info.index{|item| item[HashParams::COMMUNITY_ID] == self.id}) ? true : false
|
119
|
+
end
|
120
|
+
|
121
|
+
def mute_user(options = {})
|
122
|
+
options.symbolize_keys!
|
123
|
+
user = options[:user]
|
124
|
+
admin = options[:admin]
|
125
|
+
raise "user should be passed in params" unless user
|
126
|
+
raise "admin should be passed in params" unless admin
|
127
|
+
check_user user
|
128
|
+
check_user admin
|
129
|
+
raise "admin is not admin" unless self.include_admin? admin
|
130
|
+
raise "user should be a member of this community" unless self.include_user? user
|
131
|
+
raise "this user is already muted" if self.include_muted_user? user
|
132
|
+
raise "it is impossible to mute yourself" if user == admin
|
133
|
+
raise "admin has no permissions to mute this user" if (self.include_admin? user) && (admin_level_of(admin) >= admin_level_of(user))
|
134
|
+
|
135
|
+
|
136
|
+
muted_ids = ActiveSupport::JSON.decode self.muted_ids
|
137
|
+
muted_ids << user.id
|
138
|
+
self.muted_ids = ActiveSupport::JSON.encode muted_ids
|
139
|
+
self.save
|
140
|
+
end
|
141
|
+
|
142
|
+
def unmute_user(options = {})
|
143
|
+
options.symbolize_keys!
|
144
|
+
user = options[:user]
|
145
|
+
admin = options[:admin]
|
146
|
+
raise "user should be passed in params" unless user
|
147
|
+
raise "admin should be passed in params" unless admin
|
148
|
+
check_user user
|
149
|
+
check_user admin
|
150
|
+
raise "admin is not admin" unless self.include_admin? admin
|
151
|
+
raise "user should be a member of this community" unless self.include_user? user
|
152
|
+
raise "this user is not muted" unless self.include_muted_user? user
|
153
|
+
raise "admin has no permissions to unmute this user" if (self.include_admin? user) && (admin_level_of(admin) >= admin_level_of(user))
|
154
|
+
|
155
|
+
muted_ids = ActiveSupport::JSON.decode self.muted_ids
|
156
|
+
muted_ids.delete user.id
|
157
|
+
self.muted_ids = ActiveSupport::JSON.encode muted_ids
|
158
|
+
self.save
|
159
|
+
end
|
160
|
+
|
161
|
+
def include_muted_user?(user)
|
162
|
+
check_user user
|
163
|
+
muted_ids = ActiveSupport::JSON.decode self.muted_ids
|
164
|
+
muted_ids.include? user.id
|
165
|
+
end
|
166
|
+
|
167
|
+
def ban_user(options = {})
|
168
|
+
options.symbolize_keys!
|
169
|
+
user = options[:user]
|
170
|
+
admin = options[:admin]
|
171
|
+
raise "user should be passed in params" unless user
|
172
|
+
raise "admin should be passed in params" unless admin
|
173
|
+
check_user user
|
174
|
+
check_user admin
|
175
|
+
raise "admin is not admin" unless self.include_admin? admin
|
176
|
+
if self.public
|
177
|
+
raise "user should be a member of public community" unless self.include_user?(user)
|
178
|
+
else
|
179
|
+
raise "user should be a member of private community or send invitation request to it" unless self.include_user?(user) || self.include_invitation_request?(user)
|
180
|
+
end
|
181
|
+
raise "this user is already banned" if self.include_banned_user? user
|
182
|
+
raise "admin has no permissions to ban this user" if (self.include_admin? user) && (admin_level_of(admin) >= admin_level_of(user))
|
183
|
+
|
184
|
+
banned_ids = ActiveSupport::JSON.decode self.banned_ids
|
185
|
+
banned_ids << user.id
|
186
|
+
self.banned_ids = ActiveSupport::JSON.encode banned_ids
|
187
|
+
self.save
|
188
|
+
unless self.public
|
189
|
+
self.reject_invitation_request :admin => admin, :user => user if self.include_invitation_request? user
|
190
|
+
end
|
191
|
+
self.remove_user :admin => admin, :user => user
|
192
|
+
end
|
193
|
+
|
194
|
+
def unban_user(options = {})
|
195
|
+
options.symbolize_keys!
|
196
|
+
user = options[:user]
|
197
|
+
admin = options[:admin]
|
198
|
+
raise "user should be passed in params" unless user
|
199
|
+
raise "admin should be passed in params" unless admin
|
200
|
+
check_user user
|
201
|
+
check_user admin
|
202
|
+
raise "admin is not admin" unless self.include_admin? admin
|
203
|
+
raise "this user is not banned" unless self.include_banned_user? user
|
204
|
+
|
205
|
+
banned_ids = ActiveSupport::JSON.decode self.banned_ids
|
206
|
+
banned_ids.delete user.id
|
207
|
+
self.banned_ids = ActiveSupport::JSON.encode banned_ids
|
208
|
+
self.save
|
209
|
+
end
|
210
|
+
|
211
|
+
def include_banned_user?(user)
|
212
|
+
check_user user
|
213
|
+
banned_ids = ActiveSupport::JSON.decode self.banned_ids
|
214
|
+
banned_ids.include? user.id
|
98
215
|
end
|
99
216
|
|
100
217
|
def add_admin(options = {})
|
101
218
|
options.symbolize_keys!
|
102
219
|
user = options[:user]
|
103
220
|
admin = options[:admin]
|
221
|
+
raise "user should be passed in params" unless user
|
104
222
|
raise "admin should be passed in params" unless admin
|
105
|
-
|
106
|
-
|
107
|
-
raise "user
|
223
|
+
check_user user
|
224
|
+
check_user admin
|
225
|
+
raise "user is already admin" if self.include_admin? user
|
226
|
+
raise "admin is not admin" unless self.include_admin? admin
|
227
|
+
raise "user should be a member of this community" unless self.include_user? user
|
108
228
|
|
109
|
-
|
229
|
+
self.unmute_user :user => user, :admin => admin if self.include_muted_user? user
|
110
230
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
231
|
+
unless self.include_writer? user
|
232
|
+
writers_ids = ActiveSupport::JSON.decode self.writers_ids
|
233
|
+
writers_ids << user.id
|
234
|
+
self.writers_ids = ActiveSupport::JSON.encode writers_ids
|
235
|
+
end
|
236
|
+
|
237
|
+
admin_level_granted_for_user = admin_level_of(admin) + 1
|
115
238
|
|
116
239
|
admins_info = ActiveSupport::JSON.decode self.admins_info
|
117
240
|
admins_info << Hash['admin_id' => user.id, 'admin_level' => admin_level_granted_for_user]
|
@@ -130,11 +253,6 @@ module Inkwell
|
|
130
253
|
raise "admin has no permissions to delete this user from admins" if (admin_level_of(admin) >= admin_level_of(user)) && (user != admin)
|
131
254
|
raise "community owner can not be removed from admins" if admin_level_of(user) == 0
|
132
255
|
|
133
|
-
admin_positions = ActiveSupport::JSON.decode user.admin_of
|
134
|
-
admin_positions.delete_if{|rec| rec['community_id'] == self.id}
|
135
|
-
user.admin_of = ActiveSupport::JSON.encode admin_positions
|
136
|
-
user.save
|
137
|
-
|
138
256
|
admins_info = ActiveSupport::JSON.decode self.admins_info
|
139
257
|
admins_info.delete_if{|rec| rec['admin_id'] == user.id}
|
140
258
|
self.admins_info = ActiveSupport::JSON.encode admins_info
|
@@ -142,16 +260,17 @@ module Inkwell
|
|
142
260
|
end
|
143
261
|
|
144
262
|
def admin_level_of(admin)
|
145
|
-
admin_positions = ActiveSupport::JSON.decode
|
146
|
-
index = admin_positions.index{|item| item['
|
263
|
+
admin_positions = ActiveSupport::JSON.decode self.admins_info
|
264
|
+
index = admin_positions.index{|item| item['admin_id'] == admin.id}
|
147
265
|
raise "admin is not admin" unless index
|
148
266
|
admin_positions[index]['admin_level']
|
149
267
|
end
|
150
268
|
|
151
269
|
def include_admin?(user)
|
152
270
|
check_user user
|
153
|
-
|
154
|
-
|
271
|
+
|
272
|
+
admin_positions = ActiveSupport::JSON.decode self.admins_info
|
273
|
+
(admin_positions.index{|item| item['admin_id'] == user.id}) ? true : false
|
155
274
|
end
|
156
275
|
|
157
276
|
def add_post(options = {})
|
@@ -159,7 +278,8 @@ module Inkwell
|
|
159
278
|
user = options[:user]
|
160
279
|
post = options[:post]
|
161
280
|
raise "user should be passed in params" unless user
|
162
|
-
raise "user should be a member of community" unless self.include_user?
|
281
|
+
raise "user should be a member of community" unless self.include_user? user
|
282
|
+
raise "user is muted" if self.include_muted_user? user
|
163
283
|
raise "post should be passed in params" unless post
|
164
284
|
check_post post
|
165
285
|
user_id_attr = "#{::Inkwell::Engine::config.user_table.to_s.singularize}_id"
|
@@ -263,22 +383,74 @@ module Inkwell
|
|
263
383
|
ActiveSupport::JSON.decode self.users_ids
|
264
384
|
end
|
265
385
|
|
386
|
+
def create_invitation_request(user)
|
387
|
+
raise "invitation request was already created" if self.include_invitation_request? user
|
388
|
+
raise "it is impossible to create request. user is banned in this community" if self.include_banned_user? user
|
389
|
+
raise "it is impossible to create request for public community" if self.public
|
390
|
+
|
391
|
+
invitations_uids = ActiveSupport::JSON.decode self.invitations_uids
|
392
|
+
invitations_uids << user.id
|
393
|
+
self.invitations_uids = ActiveSupport::JSON.encode invitations_uids
|
394
|
+
self.save
|
395
|
+
end
|
396
|
+
|
397
|
+
def accept_invitation_request(options = {})
|
398
|
+
options.symbolize_keys!
|
399
|
+
user = options[:user]
|
400
|
+
admin = options[:admin]
|
401
|
+
check_user user
|
402
|
+
check_user admin
|
403
|
+
raise "admin is not admin in this community" unless self.include_admin? admin
|
404
|
+
raise "this user is already in this community" if self.include_user? user
|
405
|
+
raise "there is no invitation request for this user" unless self.include_invitation_request? user
|
406
|
+
|
407
|
+
self.add_user :user => user
|
408
|
+
|
409
|
+
remove_invitation_request user
|
410
|
+
end
|
411
|
+
|
412
|
+
def reject_invitation_request(options = {})
|
413
|
+
options.symbolize_keys!
|
414
|
+
user = options[:user]
|
415
|
+
admin = options[:admin]
|
416
|
+
check_user user
|
417
|
+
check_user admin
|
418
|
+
raise "there is no invitation request for this user" unless self.include_invitation_request? user
|
419
|
+
raise "admin is not admin in this community" unless self.include_admin? admin
|
420
|
+
|
421
|
+
remove_invitation_request user
|
422
|
+
end
|
423
|
+
|
424
|
+
def include_invitation_request?(user)
|
425
|
+
raise "invitations work only for private community. this community is public." if self.public
|
426
|
+
invitations_uids = ActiveSupport::JSON.decode self.invitations_uids
|
427
|
+
(invitations_uids.index{|uid| uid == user.id}) ? true : false
|
428
|
+
end
|
429
|
+
|
430
|
+
|
431
|
+
|
266
432
|
private
|
433
|
+
|
434
|
+
def remove_invitation_request(user)
|
435
|
+
invitations_uids = ActiveSupport::JSON.decode self.invitations_uids
|
436
|
+
invitations_uids.delete user.id
|
437
|
+
self.invitations_uids = ActiveSupport::JSON.encode invitations_uids
|
438
|
+
self.save
|
439
|
+
end
|
440
|
+
|
267
441
|
def processing_a_community
|
268
442
|
user_class = Object.const_get ::Inkwell::Engine::config.user_table.to_s.singularize.capitalize
|
269
|
-
|
443
|
+
owner = user_class.find self.owner_id
|
270
444
|
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
communities_ids << self.id
|
276
|
-
user.communities_ids = ActiveSupport::JSON.encode communities_ids
|
277
|
-
user.save
|
445
|
+
communities_info = ActiveSupport::JSON.decode owner.communities_info
|
446
|
+
communities_info << Hash[HashParams::COMMUNITY_ID => self.id, HashParams::ACCESS_LEVEL => self.default_user_access]
|
447
|
+
owner.communities_info = ActiveSupport::JSON.encode communities_info
|
448
|
+
owner.save
|
278
449
|
|
279
|
-
admins_info = [Hash['admin_id' =>
|
450
|
+
admins_info = [Hash['admin_id' => owner.id, 'admin_level' => 0]]
|
280
451
|
self.admins_info = ActiveSupport::JSON.encode admins_info
|
281
|
-
self.users_ids = ActiveSupport::JSON.encode [
|
452
|
+
self.users_ids = ActiveSupport::JSON.encode [owner.id]
|
453
|
+
self.writers_ids = ActiveSupport::JSON.encode [owner.id]
|
282
454
|
self.save
|
283
455
|
end
|
284
456
|
|
@@ -287,12 +459,9 @@ module Inkwell
|
|
287
459
|
users_ids = ActiveSupport::JSON.decode self.users_ids
|
288
460
|
users_ids.each do |user_id|
|
289
461
|
user = user_class.find user_id
|
290
|
-
|
291
|
-
|
292
|
-
user.
|
293
|
-
communities_ids = ActiveSupport::JSON.decode user.communities_ids
|
294
|
-
communities_ids.delete self.id
|
295
|
-
user.communities_ids = ActiveSupport::JSON.encode communities_ids
|
462
|
+
communities_info = ActiveSupport::JSON.decode user.communities_info
|
463
|
+
communities_info.delete_if {|item| item[HashParams::COMMUNITY_ID] == self.id}
|
464
|
+
user.communities_info = ActiveSupport::JSON.encode communities_info
|
296
465
|
user.save
|
297
466
|
end
|
298
467
|
|
@@ -54,7 +54,7 @@ module Inkwell
|
|
54
54
|
result
|
55
55
|
end
|
56
56
|
|
57
|
-
def create_comment(options={})
|
57
|
+
def create_comment(options = {})
|
58
58
|
options.symbolize_keys!
|
59
59
|
raise "for_object should be passed" unless options[:for_object]
|
60
60
|
raise "comment body should be passed" unless options[:body]
|
@@ -66,7 +66,12 @@ module Inkwell
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def communities_row
|
69
|
-
ActiveSupport::JSON.decode self.
|
69
|
+
communities_info = ActiveSupport::JSON.decode self.communities_info
|
70
|
+
result = []
|
71
|
+
communities_info.each do |item|
|
72
|
+
result << item[HashParams::COMMUNITY_ID]
|
73
|
+
end
|
74
|
+
result
|
70
75
|
end
|
71
76
|
|
72
77
|
def favorite(obj)
|
@@ -306,6 +311,7 @@ module Inkwell
|
|
306
311
|
#wrappers for community methods
|
307
312
|
|
308
313
|
def join(open_community)
|
314
|
+
raise "it is impossible to join private community. use invitation request to do it." unless open_community.public
|
309
315
|
open_community.add_user :user => self
|
310
316
|
end
|
311
317
|
|
@@ -320,10 +326,46 @@ module Inkwell
|
|
320
326
|
from_community.remove_user :user => user, :admin => self
|
321
327
|
end
|
322
328
|
|
329
|
+
def ban(options = {})
|
330
|
+
options.symbolize_keys!
|
331
|
+
in_community = options[:in_community]
|
332
|
+
user = options[:user]
|
333
|
+
in_community.ban_user :user => user, :admin => self
|
334
|
+
end
|
335
|
+
|
336
|
+
def unban(options = {})
|
337
|
+
options.symbolize_keys!
|
338
|
+
in_community = options[:in_community]
|
339
|
+
user = options[:user]
|
340
|
+
in_community.unban_user :user => user, :admin => self
|
341
|
+
end
|
342
|
+
|
343
|
+
def mute(options = {})
|
344
|
+
options.symbolize_keys!
|
345
|
+
in_community = options[:in_community]
|
346
|
+
user = options[:user]
|
347
|
+
in_community.mute_user :user => user, :admin => self
|
348
|
+
end
|
349
|
+
|
350
|
+
def unmute(options = {})
|
351
|
+
options.symbolize_keys!
|
352
|
+
in_community = options[:in_community]
|
353
|
+
user = options[:user]
|
354
|
+
in_community.unmute_user :user => user, :admin => self
|
355
|
+
end
|
356
|
+
|
357
|
+
def can_send_post_to_community?(community)
|
358
|
+
return false unless community.include_user? self
|
359
|
+
return false if community.include_muted_user? self
|
360
|
+
return false unless community.include_writer? self
|
361
|
+
true
|
362
|
+
end
|
363
|
+
|
323
364
|
def send_post_to_community(options = {})
|
324
365
|
options.symbolize_keys!
|
325
366
|
to_community = options[:to_community]
|
326
367
|
post = options[:post]
|
368
|
+
raise "this user have no permissions to send post to this community" unless self.can_send_post_to_community? to_community
|
327
369
|
to_community.add_post :post => post, :user => self
|
328
370
|
end
|
329
371
|
|
data/lib/common/base.rb
CHANGED
data/lib/inkwell/version.rb
CHANGED