pull/560/head
Kartones 10 years ago
parent 42160ed212
commit bf0ce96925

@ -8,13 +8,18 @@ module CartoDB
# @param id String (uuid)
# @param owner_id String (uuid)
# @param owner_username String
# @param entity_id String (uuid)
# @param entity_type String
ACCESS_READONLY = 'r'
ACCESS_READWRITE = 'rw'
ACCESS_NONE = 'n'
TYPE_USER = 'user'
TYPE_ORGANIZATION = 'org'
ENTITY_TYPE_VISUALIZATION = 'vis'
DEFAULT_ACL_VALUE = '[]'
# Format: requested_permission => [ allowed_permissions_list ]
@ -81,6 +86,16 @@ module CartoDB
self.owner_username = value.username
end
# @param value Mixed
def entity=(value)
if value.kind_of? CartoDB::Visualization::Member
self.entity_type = ENTITY_TYPE_VISUALIZATION
self.entity_id = value.id
else
raise PermissionError.new('Unsupported entity type')
end
end
def validate
super
errors.add(:owner_id, 'cannot be nil') if (self.owner_id.nil? || self.owner_id.empty?)

@ -0,0 +1,33 @@
# encoding: utf-8
module CartoDB
# A shared entity is just a relating model that joins entities (currently only visualizations)
# shared but not owned by users.
# Initially there's no need to include full objects and is kept as ids only on purpose
class SharedEntity < Sequel::Model
# @param recipient_id String (uuid)
# @param recipient_type String From RECIPIENT_TYPE_xxxx constants
# @param entity_id String (uuid)
# @param entity_type String From ENTITY_TYPE_xxxx constants
ENTITY_TYPE_VISUALIZATION = 'vis'
RECIPIENT_TYPE_USER = 'user'
RECIPIENT_TYPE_ORGANIZATION = 'org'
def validate
super
validates_presence([:recipient_id, :recipient_type, :entity_id, :entity_type])
validates_unique([:recipient_id, :entity_id])
errors.add(:entity_type, 'unsupported type') unless self.entity_type == ENTITY_TYPE_VISUALIZATION
end #validate
def before_save
super
self.updated_at = Time.now
end
end
end

@ -0,0 +1,9 @@
Sequel.migration do
up do
add_column :organizations, :avatar_url, :text
end
down do
drop_column :organizations, :avatar_url
end
end

@ -0,0 +1,21 @@
Sequel.migration do
up do
create_table :shared_entities do
primary_key :id
Uuid :user_id, null: false, :index => true
Uuid :entity_id, null: false
Text :type, null: false
DateTime :created_at, default: Sequel::CURRENT_TIMESTAMP
DateTime :updated_at, default: Sequel::CURRENT_TIMESTAMP
end
alter_table(:shared_entities) do
add_index [:user_id, :entity_id], :unique => true
end
end
down do
drop_table :shared_entities
end
end

@ -0,0 +1,11 @@
Sequel.migration do
up do
add_column :permissions, :entity_id, :uuid
add_column :permissions, :entity_type, :text
end
down do
drop_column :permissions, :entity_id
drop_column :permissions, :entity_type
end
end

@ -0,0 +1,14 @@
Sequel.migration do
up do
rename_column :shared_entities, :user_id, :recipient_id
rename_column :shared_entities, :type, :entity_type
add_column :shared_entities, :recipient_type, :text
run "ALTER TABLE shared_entities ADD CONSTRAINT recipient_type_check CHECK (recipient_type IN ('user', 'org'));"
end
down do
drop_column :shared_entities, :recipient_type
rename_column :shared_entities, :entity_type, :type
rename_column :shared_entities, :recipient_id, :user_id
end
end

@ -596,6 +596,46 @@ namespace :cartodb do
puts "\n>Finished :create_default_vis_permissions"
end
desc "Check all visualizations and populate their Permission object's entity_id and entity_type"
task :populate_permission_entity_id, [:page_size, :page] => :environment do |t, args|
page_size = args[:page_size].blank? ? 999999 : args[:page_size].to_i
page = args[:page].blank? ? 1 : args[:page].to_i
require_relative '../../app/models/visualization/collection'
progress_each = (page_size > 10) ? (page_size / 10).ceil : 1
collection = CartoDB::Visualization::Collection.new
begin
items = collection.fetch(page: page, per_page: page_size)
count = items.count
puts "\n>Running :populate_permission_entity_id for page #{page} (#{count} vis)" if count > 0
items.each_with_index { |vis, i|
puts ">Processed: #{i}/#{count} - page #{page}" if i % progress_each == 0
unless vis.permission_id.nil?
begin
raise 'No owner' if vis.user.nil?
if vis.permission.entity_id.nil?
perm = vis.permission
perm.entity = vis
perm.save
end
rescue => e
owner_id = vis.user.nil? ? 'nil' : vis.user.id
message = "FAIL u:#{owner_id} v:#{vis.id}: #{e.message}"
puts message
log(message, :populate_permission_entity_id.to_s)
end
end
}
page += 1
end while count > 0
puts "\n>Finished :populate_permission_entity_id"
end
# Executes a ruby code proc/block on all existing users, outputting some info
# @param task_name string
# @param block Proc

Loading…
Cancel
Save