From 256fd5784bce9c49162bb06c75d9e89a962e0b6e Mon Sep 17 00:00:00 2001 From: bohung Date: Thu, 4 Mar 2021 14:33:01 +0800 Subject: [PATCH] Add check gem installed. Add bundle install after generating plugin. --- .../personal_plugin_fields_controller.rb | 85 +++++++++++++++++-- app/models/personal_plugin_field.rb | 70 ++++++++++++++- .../personal_plugin_fields/_form.html.erb | 19 +++++ .../personal_plugin_fields/copy.html.erb | 1 + .../fields_setting.html.erb | 1 + .../personal_plugin_fields/index.html.erb | 1 + config/locales/en.yml | 1 + config/locales/zh_tw.yml | 1 + config/routes.rb | 3 +- 9 files changed, 174 insertions(+), 8 deletions(-) diff --git a/app/controllers/admin/personal_plugin_fields_controller.rb b/app/controllers/admin/personal_plugin_fields_controller.rb index 42d7f31..05a688b 100644 --- a/app/controllers/admin/personal_plugin_fields_controller.rb +++ b/app/controllers/admin/personal_plugin_fields_controller.rb @@ -1,7 +1,7 @@ class Admin::PersonalPluginFieldsController < OrbitAdminController require 'fileutils' include Admin::PersonalPluginFieldsHelper - before_action :set_personal_plugin_field, only: [:show, :edit , :update, :destroy, :fields_setting, :update_fields_setting,:generate_plugin] + before_action :set_personal_plugin_field, only: [:show, :edit , :update, :destroy, :fields_setting, :update_fields_setting,:generate_plugin] def index @personal_plugin_fields = PersonalPluginField.order_by(:created_at=>'desc').page(params[:page]).per(10) @@ -28,7 +28,7 @@ class Admin::PersonalPluginFieldsController < OrbitAdminController end def create personal_plugin_field = PersonalPluginField.create(personal_plugin_field_params) - redirect_to params[:referer_url] + redirect_to admin_personal_plugin_fields_path end def edit @@ -42,7 +42,7 @@ class Admin::PersonalPluginFieldsController < OrbitAdminController def update @personal_plugin_field.update_attributes(personal_plugin_field_params) @personal_plugin_field.save - redirect_to params[:referer_url] + redirect_to admin_personal_plugin_fields_path end def fields_setting end @@ -131,6 +131,24 @@ class Admin::PersonalPluginFieldsController < OrbitAdminController "<%= #{plugin_template}.#{field_name} %>" end end + backend_profile_fields = @personal_plugin_field.backend_fields["profile"] rescue [] + backend_profile_fields_contents = backend_profile_fields.map do |field_name| + if field_name == slug_title + "\r\n <%= link_to #{plugin_template}.#{field_name}, page_for_#{plugin_template}(#{plugin_template}), target: \"blank\" %>\r\n" + + "
\r\n"+ + " \r\n"+ + "
\r\n " + elsif field_name.include?(".") + "<%= #{plugin_template}.#{field_name} rescue \"\" %>" + elsif fields.include?(field_name) || plugin_template_related_members.include?(field_name) || field_name == "member_profile" #file or link or member + "<%= #{plugin_template}.display_field(\"#{field_name}\").html_safe rescue \"\" %>" + else + "<%= #{plugin_template}.#{field_name} %>" + end + end col_name_to_show = @personal_plugin_field.frontend_fields["member_show"] rescue [] col_name_to_show_in_show_page = @personal_plugin_field.frontend_fields["show"] rescue [] col_name_to_show_in_index_page = @personal_plugin_field.frontend_fields["index"] rescue [] @@ -160,8 +178,6 @@ class Admin::PersonalPluginFieldsController < OrbitAdminController related_locale_fields_input_fields << f3 related_none_locale_fields_input_fields << f4 end - backend_profile_fields = backend_index_fields - backend_profile_fields_contents = backend_index_fields_contents datetime_field_types_hash = {"year_month"=>"%Y/%m","date"=>"%Y/%m/%d","time"=>"%H:%M","date_time"=>"%Y/%m/%d %H:%M"} datetime_fields = primary_modal_fields.select{|field_value| datetime_field_types_hash.keys.include?(field_value[:field_type])}.map{|field_value| [field_value[:field_name],datetime_field_types_hash[field_value[:field_type]]] @@ -292,7 +308,9 @@ class Admin::PersonalPluginFieldsController < OrbitAdminController #end copy_templates("#{cp_template_dir_path}modules/#{@personal_plugin_field.module_name}/") #render :html => @logs#@match_pattern#@logs.join("
").html_safe#@match_pattern - @personal_plugin_field.update(:log_text=>"") + @personal_plugin_field.update(:log_text=>"") + add_plugin("downloaded_extensions.rb",@personal_plugin_field.module_name) + bundle_install render :json => {:success=>true,:url=>"/admin/#{plugin_template.pluralize}/",:name=>@personal_plugin_field.title} rescue => e @match_pattern = {"parse_again_start"=>"","parse_again_end"=>"","col_name_translate_yaml"=>""} @@ -550,6 +568,55 @@ class Admin::PersonalPluginFieldsController < OrbitAdminController can_install = (PersonalPluginField.find(params[:id]).module_name == params[:plugin_name] rescue false) if !can_install render :json => {:can_install => can_install } end + def add_plugin(extention_file,plugin_name) + txt = File.read(extention_file) rescue nil + if txt.nil? + File.open(extention_file,'w+'){|f| f.write("")} + txt = "" + end + txt_scan = txt.scan(/^[\n]*gem\s*["']#{plugin_name}["'].*\n/) + if txt_scan.count != 1 + delete_plugin(extention_file,plugin_name) + txt = File.read(extention_file) rescue "" + txt = txt + "\r\ngem \"#{plugin_name}\", path: \"#{Rails.root}/tmp/#{plugin_name}\"\r\n" + File.open(extention_file,'w+') do |f| + f.write(txt) + end + end + end + def delete_plugin(extention_file,plugin_name) + txt = File.read(extention_file) rescue nil + return if txt.nil? + txt_change = txt.gsub(/^[\n]*gem\s*["']#{plugin_name}["'].*\n/,'') + if txt_change != txt + File.open(extention_file,'w+') do |f| + f.write(txt_change) + end + end + end + def check_modal_name + primary_modal_names = PersonalPluginField.where(:id.ne=>params[:id]).pluck(:primary_modal_name) + related_modal_names = PersonalPluginField.where(:id.ne=>params[:id]).pluck(:related_modal_name).flatten.uniq + other_modal_names = primary_modal_names + related_modal_names + personal_plugin_field = PersonalPluginField.where(:id=>params[:id]).first + all_modal_names = PersonalPluginField.get_modal_names_cache + if personal_plugin_field.present? + except_modals = Dir.glob("tmp/#{personal_plugin_field.module_name}/app/models/*.rb").map{|f| + fn = File.basename(f) + fn.slice(0,fn.length - 3) + } + all_modal_names = all_modal_names - except_modals + end + all_modal_names = all_modal_names + other_modal_names + all_modal_names = all_modal_names.uniq + self_modal_names = params[:modal_names] + invalid_modal_names = self_modal_names.select{|n| all_modal_names.include?(n)} + if invalid_modal_names.count != 0 + render :json => {:success=>false,:invalid_modal_names=>invalid_modal_names} + else + render :json => {:success=>true} + end + end private def personal_plugin_field_params personal_plugin_field_params = params.require(:personal_plugin_field).permit! rescue {} @@ -571,6 +638,7 @@ class Admin::PersonalPluginFieldsController < OrbitAdminController def set_personal_plugin_field + PersonalPluginField.get_modal_names_cache path = request.path.split('/') if path.last.include? '-' uid = path[-1].split("-").last @@ -581,4 +649,9 @@ class Admin::PersonalPluginFieldsController < OrbitAdminController end @personal_plugin_field = PersonalPluginField.find_by(:uid => uid) rescue PersonalPluginField.find(params[:id] || params[:personal_plugin_field_id]) end + def bundle_install + Bundler.with_clean_env { system("cd #{Rails.root} && bundle install") } + %x(kill -s USR2 `cat tmp/pids/unicorn.pid`) + sleep 2 + end end \ No newline at end of file diff --git a/app/models/personal_plugin_field.rb b/app/models/personal_plugin_field.rb index 762a4cc..eb0549c 100644 --- a/app/models/personal_plugin_field.rb +++ b/app/models/personal_plugin_field.rb @@ -14,7 +14,22 @@ class PersonalPluginField field :frontend_fields, :type => Hash, :default => {} field :log_text, :type => String, :default => "" field :fields_order, :type => Hash, :default => {} - before_save :check_plugin_exist + field :copy_id + before_save :change_extensions,:check_modal_name + after_destroy do + delete_plugin("downloaded_extensions.rb",self.module_name) + restart_server + end + before_create do + if self.copy_id + copy_item = self.class.find(copy_id) rescue nil + if !copy_item.nil? + self.backend_fields = copy_item.backend_fields + self.frontend_fields = copy_item.frontend_fields + self.fields_order = copy_item.fields_order + end + end + end def get_all_gem_plugins extention_files = ["downloaded_extensions.rb","built_in_extensions.rb"] gem_plugins = extention_files.map{|f| (File.read(f).scan(/\n\s*gem\s*["'](.*)["']\s*,/).flatten rescue [])}.flatten @@ -25,4 +40,57 @@ class PersonalPluginField can_install = (self.class.where(:module_name=>self.module_name,:id.ne=>self.id).count == 0 rescue false) if !can_install return can_install end + def change_extensions + if !check_plugin_exist + return false + else + extention_file = "downloaded_extensions.rb" + if self.module_name_changed? + if self.module_name_was.present? + delete_plugin(extention_file,module_name_was) + end + end + return true + end + end + def delete_plugin(extention_file,plugin_name) + txt = File.read(extention_file) rescue nil + return if txt.nil? + txt_change = txt.gsub(/^[\n]*gem\s*["']#{plugin_name}["'].*\n/,'') + if txt_change != txt + File.open(extention_file,'w+') do |f| + f.write(txt_change) + end + end + end + def check_modal_name + primary_modal_names = self.class.where(:id.ne=>self.id).pluck(:primary_modal_name) + related_modal_names = self.class.where(:id.ne=>self.id).pluck(:related_modal_name).flatten.uniq + other_modal_names = primary_modal_names + related_modal_names + all_modal_names = self.class.get_modal_names_cache + except_modals = Dir.glob("tmp/#{self.module_name}/app/models/*.rb").map{|f| + fn = File.basename(f) + fn.slice(0,fn.length - 3) + } + all_modal_names = all_modal_names - except_modals + all_modal_names = all_modal_names + other_modal_names + all_modal_names = all_modal_names.uniq + self_modal_names = ([self.primary_modal_name]+self.related_modal_name).flatten + if self_modal_names.select{|n| all_modal_names.include?(n)}.count != 0 + return false + end + end + def self.get_modal_names + name_routes = Rails.application.routes.named_routes.map{|k,v| k}.select{|s| s.to_s[0..4] == "admin"}.map{|s| s.to_s.split('admin_').last} + modal_names = name_routes.map{|n| n.classify}.select{|n| (n.constantize rescue nil)} + modal_names = modal_names.map{|n| n.constantize}.select{|n| n.class == Class }.uniq + @@modal_names = modal_names.map{|n| n.to_s.underscore} + end + def self.get_modal_names_cache + @@modal_names ||= get_modal_names + end + def restart_server + %x(kill -s USR2 `cat tmp/pids/unicorn.pid`) + sleep 2 + end end diff --git a/app/views/admin/personal_plugin_fields/_form.html.erb b/app/views/admin/personal_plugin_fields/_form.html.erb index 9632ed0..56a7051 100644 --- a/app/views/admin/personal_plugin_fields/_form.html.erb +++ b/app/views/admin/personal_plugin_fields/_form.html.erb @@ -239,7 +239,26 @@ $.post("<%=check_plugin_exist_admin_personal_plugin_field_path%>",{plugin_name: $("#personal_plugin_field_module_name").val(), id: "<%=f.object.id %>"}).done(function(data){ console.log(data); if(data["can_install"]){ + $("#personal_plugin_field_module_name").css('border', ''); can_install = true; + var modal_names = $("[name*=modal_name]").map(function(i,v){return v.value}) + modal_names = Array.from(modal_names); + $.post("<%=check_modal_name_admin_personal_plugin_field_path%>",{modal_names: modal_names, id: "<%=f.object.id %>"}).done(function(data){ + if(!data["success"]){ + var invalid_modal_names = data["invalid_modal_names"]; + console.log(invalid_modal_names) + $("[name*=modal_name]").each(function(i,v){ + if(invalid_modal_names.indexOf($(v).val()) != -1){ + $(v).css("border", '2px solid red'); + window.location.href = "#" + $(".main-forms")[0].id; + }else{ + $(v).css("border", ''); + } + }) + can_install = false; + } + }) + }else{ $("#personal_plugin_field_module_name").css('border', '2px solid red'); alert("<%=thead_field("please_change_module_name")%>"); diff --git a/app/views/admin/personal_plugin_fields/copy.html.erb b/app/views/admin/personal_plugin_fields/copy.html.erb index 32ac43c..b9d030d 100644 --- a/app/views/admin/personal_plugin_fields/copy.html.erb +++ b/app/views/admin/personal_plugin_fields/copy.html.erb @@ -1,5 +1,6 @@ <%= form_for @personal_plugin_field, url: admin_personal_plugin_fields_path, html: {class: "form-horizontal main-forms previewable"} do |f| %>
+ <%= f.hidden_field :copy_id, :value => params[:personal_plugin_field_id] %> <%= render partial: 'form', locals: {f: f} %>
<% end %> \ No newline at end of file diff --git a/app/views/admin/personal_plugin_fields/fields_setting.html.erb b/app/views/admin/personal_plugin_fields/fields_setting.html.erb index 5bab09c..1c968a2 100644 --- a/app/views/admin/personal_plugin_fields/fields_setting.html.erb +++ b/app/views/admin/personal_plugin_fields/fields_setting.html.erb @@ -25,6 +25,7 @@

<%= thead_field('backend_page') %>

<%= render :partial => 'render_fields_check_table',locals: {:f=>f,:root_name=>'backend_fields',:page_name=>'index'} %> + <%= render :partial => 'render_fields_check_table',locals: {:f=>f,:root_name=>'backend_fields',:page_name=>'profile'} %> <%= render :partial => 'render_fields_check_table',locals: {:f=>f,:root_name=>'backend_fields',:page_name=>'analysis',:access_field_types=>["date","date_time","year","year_month","time"]} %>

<%= thead_field('frontend_page') %>

diff --git a/app/views/admin/personal_plugin_fields/index.html.erb b/app/views/admin/personal_plugin_fields/index.html.erb index a89895d..508d45a 100644 --- a/app/views/admin/personal_plugin_fields/index.html.erb +++ b/app/views/admin/personal_plugin_fields/index.html.erb @@ -39,6 +39,7 @@ }) var url = $(this).data("url"); $.get(url).done(function(data){ + console.log(data); $("#preloader").css("display",'none'); $("#generating_plugin").css("display",'none'); if(data["success"]){ diff --git a/config/locales/en.yml b/config/locales/en.yml index 721bfea..b0e85b4 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -29,6 +29,7 @@ en: fields_display_setting: Fields display setting backend_page: Backend Page frontend_page: Frontend Page + profile: Personal Profile index: Index Page show: Show Page member_show: Member show page diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index 8fecb49..15c99bc 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -29,6 +29,7 @@ zh_tw: fields_display_setting: 欄位顯示設定 backend_page: 後台頁面 frontend_page: 前台頁面 + profile: 個人資料 index: Index 頁面 show: Show 頁面 member_show: 會員show頁面 diff --git a/config/routes.rb b/config/routes.rb index 8b2c537..0799707 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,7 +10,8 @@ Rails.application.routes.draw do get 'copy' , to: 'personal_plugin_fields#copy' end resource :personal_plugin_field do - post 'check_plugin_exist' ,to: 'personal_plugin_fields#check_plugin_exist' + post 'check_plugin_exist' ,to: 'personal_plugin_fields#check_plugin_exist' + post 'check_modal_name' ,to: 'personal_plugin_fields#check_modal_name' end end end