From 279ac774d455679b409638661adbf83f1a415377 Mon Sep 17 00:00:00 2001 From: chris Date: Tue, 15 Oct 2013 23:38:16 +0800 Subject: [PATCH] Migrate form old ui to new ui (categories, tags and authorizations) --- .../admin/authorizations_controller.rb | 36 +-- app/helpers/orbit_backend_helper.rb | 2 +- app/models/ad_banner.rb | 2 +- app/models/auth/auth_manager.rb | 1 - app/models/module_app.rb | 19 +- app/models/tag.rb | 5 - lib/orbit_model/authorizable.rb | 1 + lib/tasks/new_ui.rake | 257 ++++++++++++------ vendor/built_in_modules/ad_banner/init.rb | 4 +- 9 files changed, 196 insertions(+), 131 deletions(-) diff --git a/app/controllers/admin/authorizations_controller.rb b/app/controllers/admin/authorizations_controller.rb index 243dc6c7..50951f32 100644 --- a/app/controllers/admin/authorizations_controller.rb +++ b/app/controllers/admin/authorizations_controller.rb @@ -34,38 +34,30 @@ class Admin::AuthorizationsController < OrbitBackendController end def add_roles - roles = Role.find(params[:role_ids]) rescue [] - users = [] - roles.each do |role| - users += role.users.all.entries - end - unless roles.blank? + roles = Role.find(params[:role_ids]) rescue nil + unless roles.nil? authorization = get_or_create_authorization - add_roles_to_auth(authorization, roles) unless @error + add_roles_to_auth(authorization, roles) end @users = authorization.authorized_users render 'admin/authorizations/reload_users' end def add_sub_roles - sub_roles = SubRole.find(params[:sub_role_ids]) rescue [] - users = [] - sub_roles.each do |sub_role| - users += sub_role.users.all.entries - end - unless sub_roles.blank? + sub_roles = SubRole.find(params[:sub_role_ids]) rescue nil + unless sub_roles.nil? authorization = get_or_create_authorization - add_sub_roles_to_auth(authorization, sub_roles) unless @error + add_sub_roles_to_auth(authorization, sub_roles) end @users = authorization.authorized_users render 'admin/authorizations/reload_users' end def add_users - users = User.find(params[:user_ids]) rescue [] - unless users.blank? + users = User.find(params[:user_ids]) rescue nil + unless users.nil? authorization = get_or_create_authorization - add_users_to_auth(authorization, users) unless @error + add_users_to_auth(authorization, users) end @users = authorization.authorized_users render 'admin/authorizations/reload_users' @@ -120,10 +112,6 @@ class Admin::AuthorizationsController < OrbitBackendController protected - def add_managers_to_auth(users) - @module_app.add_managers(users) - end - def add_roles_to_auth(authorization, roles) authorization.add_roles(roles) end @@ -151,7 +139,7 @@ class Admin::AuthorizationsController < OrbitBackendController @error = t(:no_data) end when nil - @module_app.auth_manager || @module_app.create_auth_manager(module_app_id: @module_app.id, title: "#{@type}_#{@module_app.key}") + @module_app.auth_manager || @module_app.create_auth_manager(module_app_id: @module_app.id, title: @module_app.key) else auth = @object.get_authorization_by_title("#{@type}_#{@module_app.key}") unless auth @@ -162,10 +150,6 @@ class Admin::AuthorizationsController < OrbitBackendController end end - def remove_managers_from_auth(users) - @module_app.remove_manager(users) - end - def remove_roles_form_auth(authorization, roles) authorization.remove_roles(roles) end diff --git a/app/helpers/orbit_backend_helper.rb b/app/helpers/orbit_backend_helper.rb index 4d3fbf6d..f636f9f2 100644 --- a/app/helpers/orbit_backend_helper.rb +++ b/app/helpers/orbit_backend_helper.rb @@ -199,7 +199,7 @@ module OrbitBackendHelper objects.join(' ') else objects = Array(objects).map do |object| - display_value(object.send(field)) + display_value(object.send(field)) rescue '' end objects.join(', ') end diff --git a/app/models/ad_banner.rb b/app/models/ad_banner.rb index b5b275dc..b5a43367 100644 --- a/app/models/ad_banner.rb +++ b/app/models/ad_banner.rb @@ -2,8 +2,8 @@ class AdBanner include Mongoid::Document include Mongoid::Timestamps include Mongoid::MultiParameterAttributes - include OrbitCoreLib::ObjectAuthable include OrbitTag::Taggable + include OrbitModel::Authorizable field :title field :transition_msec,type: Integer diff --git a/app/models/auth/auth_manager.rb b/app/models/auth/auth_manager.rb index 6ac3919e..864bf176 100644 --- a/app/models/auth/auth_manager.rb +++ b/app/models/auth/auth_manager.rb @@ -1,4 +1,3 @@ class AuthManager < Authorization - # belongs_to :manager_authorizable, polymorphic: true has_and_belongs_to_many :authorized_users, class_name: 'User', inverse_of: 'managing_apps' end \ No newline at end of file diff --git a/app/models/module_app.rb b/app/models/module_app.rb index 740d0d18..006b8404 100644 --- a/app/models/module_app.rb +++ b/app/models/module_app.rb @@ -7,6 +7,7 @@ class ModuleApp field :auth_approval_users, type: Array, default: nil field :auth_manager_users, type: Array, default: nil field :auth_sub_manager_users, type: Array, default: nil + field :has_category, type: Boolean, default: false field :key field :title field :sidebar_order,type: Integer,default: 0 @@ -189,7 +190,8 @@ class ModuleApp end def update_auth_manager_users - self.update_attribute(:auth_manager_users, self.auth_manager_authorized_users.map{|user| user.id}) + users = self.auth_manager_authorized_users + self.update_attribute(:auth_manager_users, users.map{|user| user.id}) if users end def update_auth_sub_manager_users @@ -207,21 +209,6 @@ class ModuleApp managers.include?(user) end - def add_managers(users) - users = Array(users) - if auth_manager = self.auth_manager - auth_manager.update_attribute(:authorized_users, (auth_manager.authorized_users + users).uniq) - else - self.create_auth_manager(authorized_users: users) - end - end - - def remove_managers(users) - users = Array(users) - users = users.delete_if{|user| user == current_user || is_admin?} - self.auth_manager.update_attribute(:authorized_users, auth_manager.authorized_users - users) - end - def is_manager?(user) if user && !auth_manager_users.blank? auth_manager_users.include?(user.id) diff --git a/app/models/tag.rb b/app/models/tag.rb index 2c8704a9..178b4a98 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -1,8 +1,3 @@ -# class Tag < ProtoTag -# belongs_to :module_app - -# end - class Tag include Mongoid::Document include Mongoid::Timestamps diff --git a/lib/orbit_model/authorizable.rb b/lib/orbit_model/authorizable.rb index 47e31d1b..90c1cc2c 100644 --- a/lib/orbit_model/authorizable.rb +++ b/lib/orbit_model/authorizable.rb @@ -7,6 +7,7 @@ module OrbitModel has_one :auth_approval, as: :approval_authorizable, dependent: :destroy has_one :auth_sub_manager, as: :sub_manager_authorizable, dependent: :destroy delegate :authorized_users, to: :auth_approval, prefix: true, allow_nil: true + delegate :authorized_users, to: :auth_manager, prefix: true, allow_nil: true delegate :authorized_users, to: :auth_sub_manager, prefix: true, allow_nil: true send :include, InstanceMethods end diff --git a/lib/tasks/new_ui.rake b/lib/tasks/new_ui.rake index 365165d1..de6eb033 100644 --- a/lib/tasks/new_ui.rake +++ b/lib/tasks/new_ui.rake @@ -1,96 +1,193 @@ namespace :new_ui do + MODULE_APPS = [ %w(announcement bulletin), + %w(archive archive_file), + %w(ask ask_question ask_category), + %w(asset asset), + %w(faq qa), + %w(gallery gallery_album gallery_category), + %w(location location), + %w(personal_book writing_book), + %w(personal_conference writing_conference), + %w(personal_experience experience), + %w(personal_honor honor), + %w(personal_journal writing_journal), + %w(personal_patent writing_patent), + %w(personal_project project), + %w(web_resource web_link) + ] # app_key, model_name, category_name + + task :migrate => :environment do + @db = Mongoid.database + migrate_tags + migrate_categories + migrate_approval_on_object + migrate_managers + end + # :category_name is optional, depends on the naming of the category model: if no conventional, specify it task :migrate_categories, [:app_key, :model_name, :category_name] => :environment do |t, args| - @db = Mongoid.database - if args[:app_key] && args[:model_name] - migrate_category(args[:app_key], args[:model_name], args[:category_name]) - else - module_apps = [ %w(announcement bulletin), - %w(archive archive_file), - %w(ask ask_question ask), - %w(asset asset), - %w(faq qa), - %w(gallery gallery_album gallery), - %w(personal_book writing_book), - %w(personal_conference writing_conference), - %w(personal_experience experience), - %w(personal_honor honor), - %w(personal_journal writing_journal), - %w(personal_patent writing_patent), - %w(personal_project project), - %w(web_resource web_link) - ] - module_apps.each{|value_array| migrate_category(value_array[0], value_array[1], value_array[2])} - end - end - - def migrate_category(app_key, model_name, category_name=nil) - category_name = model_name unless category_name - # # coll_cat = @db["#{category_name}_categories"] - # # categories = coll_cat.find if coll_cat - module_app = ModuleApp.where(key: app_key)[0] - if module_app.has_category - categories = "#{category_name}_categories".classify.constantize.admin_manager_all rescue nil - categories = "#{category_name}_categories".classify.constantize.all if categories.blank? - categories.each do |category| - new_category = module_app.categories.build - new_category.title_translations = category['title'] - new_category.disable = category['disable'] - new_category.save - model_name.classify.constantize.where("#{category_name}_category_id" => category['_id']).each do |object| - if object.id.is_a?(String) - object.destroy - else - object.category = new_category.id - object.remove_attribute("#{category_name}_category_id") - object.save - end - end - if object_auths = ObjectAuth.where(obj_authable_type: "#{category_name.classify}Category") - object_auths.each do |object_auth| - case object_auth.title - when 'fact_check' - new_object_auth = new_category.get_object_auth_by_title("approval_#{module_app.key}") - else - new_object_auth = new_category.get_object_auth_by_title("category_#{module_app.key}") - end - object_auth.auth_users.each do |user| - new_object_auth.add_user_to_privilege_list(user) - end - object_auth.destroy - end - end - category.destroy - end - end + migrate_categories(args) end task :migrate_tags => :environment do - tags = Tag.where(_type: 'Tag') - tags.each do |tag| - module_app = ModuleApp.find(tag.module_tag_id) - new_tag = module_app.module_tags.build - new_tag.name_translations = tag['name'] - new_tag.is_default = tag['is_default'] - new_tag.save - n_tag = new_tag.tag - n_tag.cloud_view_count = tag['cloud_view_count'] - n_tag.view_count = tag['view_count'] - n_tag.save - tag.taggings.each do |tagging| - tagging.taggable.taggings.create(tag_id: n_tag.id) - end - tag.destroy + migrate_tags + end + + task :fix_tagged_ids => :environment do + fix_tagged_ids + end + + def migrate_categories(args = nil) + if args && args[:app_key] && args[:model_name] + migrate_category(args[:app_key], args[:model_name], args[:category_name]) + else + MODULE_APPS.each{|value_array| migrate_category(value_array[0], value_array[1], value_array[2])} end end - task :change_auth_naming => :environment do - ObjectAuth.where(title: /submit_/).each do |auth| - auth.update_attribute(:title, auth.title.gsub('submit_', 'category_')) + def migrate_category(app_key, model_name, category_name = nil) + @db ||= Mongoid.database + category_name = "#{model_name}_category" unless category_name + collection_category = @db[category_name.pluralize] + categories = collection_category.find.entries if collection_category + collection_model = @db[model_name.pluralize] + collection_buffer_category = @db['buffer_categories'] + collection_prototype_auth = @db['prototype_auths'] + if categories.present? + module_app = ModuleApp.where(key: app_key).first + if module_app.try(:has_category) + categories.each do |category| + new_category = module_app.categories.build + new_category.title_translations = category['title'] + new_category.disable = category['disable'] + new_category.save + collection_model.find("#{category_name}_id" => category['_id']).each do |object| + object['category_id'] = new_category.id + object.delete("#{category_name}_id") + collection_model.save object + collection_buffer_category.save ({ '_type' => 'BufferCategory', 'category_id' => new_category.id, 'categorizable_type' => model_name.camelize, 'categorizable_id' => object['_id'] }) + end + object_auths = collection_prototype_auth.find(_type: 'ObjectAuth', obj_authable_id: category['_id'], '$or' => [{privilege_user_ids: {'$not' => {'$size' => 0}}}, {role_ids: {'$not' => {'$size' => 0}}}, {sub_role_ids: {'$not' => {'$size' => 0}}}]).entries + if object_auths.present? + object_auths.each do |object_auth| + if object_auth['title'].eql?('fact_check') + authorization = new_category.auth_approval || new_category.create_auth_approval(module_app_id: module_app.id, title: "category_approval_#{module_app.key}") + else + authorization = new_category.auth_sub_manager || new_category.create_auth_sub_manager(module_app_id: module_app.id, title: "category_authorization_#{module_app.key}") + end + add_users(object_auth, authorization) + collection_prototype_auth.remove(object_auth) + end + end + end + collection_category.drop + collection_prototype_auth.remove(obj_authable_type: category_name.classify) + end + else + collection_category.drop + collection_prototype_auth.remove(obj_authable_type: category_name.classify) end end + def fix_tagged_ids + Tag.all.each do |tag| + tag.taggings.each do |tagging| + tagged_ids = tagging.taggable.tagged_ids + unless tagged_ids.include?(tag.id.to_s) + tagged_ids << tag.id.to_s + tagging.taggable.update_attribute(:tagged_ids, tagged_ids) + end + end + end + end + + def migrate_tags + @db ||= Mongoid.database + tags = Tag.where(_type: 'Tag').entries + tags.each_with_index do |tag, i| + unless tag.tag_lease + if module_app = ModuleApp.find(tag[:module_tag_id]) + new_tag = module_app.module_tags.build + new_tag.name_translations = tag['name'] + new_tag.is_default = tag['is_default'] + new_tag.save + n_tag = new_tag.tag + n_tag.cloud_view_count = tag['cloud_view_count'] + n_tag.view_count = tag['view_count'] + n_tag.save + tag.taggings.each do |tagging| + tagged_ids = tagging.taggable.tagged_ids + unless tagged_ids.include?(tag.id.to_s) + tagged_ids << tag.id.to_s + tagging.taggable.update_attribute(:tagged_ids, tagged_ids) + end + tagging.taggable.taggings.create(tag_id: n_tag.id) + end + end + tag.destroy + end + end + old_tags = Tag.where(_type: {'$ne' => 'Tag'}).delete + @db = Mongoid.database + @db['proto_tags'].drop + end + + def migrate_approval_on_object + @db ||= Mongoid.database + collection_prototype_auth = @db['prototype_auths'] + object_auths = collection_prototype_auth.find({_type: 'ObjectAuth', obj_authable_type: {'$in' => ["AdBanner", "PageContext"]}, '$or' => [{privilege_user_ids: {'$not' => {'$size' => 0}}}, {role_ids: {'$not' => {'$size' => 0}}}, {sub_role_ids: {'$not' => {'$size' => 0}}}]}).entries + object_auths.each do |object_auth| + case object_auth['obj_authable_type'] + when 'AdBanner' + module_app = ModuleApp.where(key: 'ad_banner').first + when 'PageContext' + module_app = ModuleApp.where(key: 'page_content').first + end + if module_app + object = object_auth['obj_authable_type'].constantize.find(object_auth['obj_authable_id']) rescue nil + if object + authorization = object.create_auth_sub_manager(module_app_id: module_app.id, title: "#{object_auth['obj_authable_type'].underscore}_authorization_#{module_app.key}") + add_users(object_auth, authorization) if authorization + end + end + collection_prototype_auth.remove(object_auth) + end + collection_prototype_auth.remove(obj_authable_type: {'$in' => ["AdBanner", "PageContext"]}) + end + + def add_users(object_auth, authorization) + if authorization + if object_auth['role_ids'].present? + roles = Role.find(object_auth['role_ids']) rescue nil + authorization.add_roles(roles) if roles + end + if object_auth['sub_role_ids'].present? + sub_roles = SubRole.find(object_auth['sub_role_ids']) rescue nil + authorization.add_sub_roles(sub_roles) if sub_roles + end + if object_auth['privilege_user_ids'].present? + users = User.find(object_auth['privilege_user_ids']) rescue nil + authorization.add_users(users) if users + end + end + end + + def migrate_managers + @db ||= Mongoid.database + collection_app_manager = @db['app_managers'] + app_managers = collection_app_manager.find(managing_app_id: {'$not' => {'$size' => 0}}).entries + app_managers.each do |app_manager| + module_app = ModuleApp.find(app_manager['managing_app_id']) rescue nil + user = User.find(app_manager['user_id']) rescue nil + if module_app && user + authorization = module_app.auth_manager || module_app.create_auth_manager(module_app_id: module_app.id, title: module_app.key) + authorization.add_users(user) + end + end + collection_app_manager.drop + end + task :reset_user_position => :environment do User.where(email: /guest/).each{|d|d.update_attribute(:position, nil)} User.not_guest_user.each_with_index do |user, i| diff --git a/vendor/built_in_modules/ad_banner/init.rb b/vendor/built_in_modules/ad_banner/init.rb index a0225730..18364d28 100644 --- a/vendor/built_in_modules/ad_banner/init.rb +++ b/vendor/built_in_modules/ad_banner/init.rb @@ -11,7 +11,9 @@ module AdBanner update_info 'some update_info' taggable - authorizable + authorizable do + authorizable_on('AdBanner') + end # front_end do # app_page 'bulletins'