From 4e7a7056a5d41bf5020abf51d56d8cba076450af Mon Sep 17 00:00:00 2001 From: BOHUNG Date: Wed, 5 Feb 2020 00:37:03 +0800 Subject: [PATCH] add download student image zip --- .../admin/olympiamanagements_controller.rb | 45 ++++++++++++++ app/controllers/admin/zipgenerator.rb | 61 +++++++++++++++++++ app/models/olympia_images_uploader.rb | 2 +- .../school_data_list.html.erb | 2 +- .../sign_up_student_data_list.html.erb | 36 +++++++++++ .../olympiamanagements/_image_form.html.erb | 8 +-- config/routes.rb | 1 + 7 files changed, 149 insertions(+), 6 deletions(-) create mode 100644 app/controllers/admin/zipgenerator.rb create mode 100644 app/views/admin/olympiamanagements/sign_up_student_data_list.html.erb diff --git a/app/controllers/admin/olympiamanagements_controller.rb b/app/controllers/admin/olympiamanagements_controller.rb index 7b327d7..2fa39dc 100644 --- a/app/controllers/admin/olympiamanagements_controller.rb +++ b/app/controllers/admin/olympiamanagements_controller.rb @@ -3,7 +3,9 @@ class Admin::OlympiamanagementsController < OrbitAdminController require 'rubyXL' require 'fileutils' require "axlsx" + before_action :create_first_fields helper Admin::OlympiamanagementsHelper + load File.expand_path(__dir__)+'/zipgenerator.rb' def index end def add_school_data @@ -223,6 +225,12 @@ class Admin::OlympiamanagementsController < OrbitAdminController tmp_filename_data = File.read(dir_path +@filename) send_data(tmp_filename_data, type: 'application/xlsx', disposition: 'attachment', filename: @filename) end + def sign_up_student_data_list + page_num = params[:page] || 1 + @field_infos = StudentDataField.first.student_data_fields + @sign_up_setting_id = SignUpSetting.last.id + @student_fields = OlympiaStudentDataField.where(:olympia_school_data_fields_id=>params[:olympia_school_id],:sign_up_setting_id=>@sign_up_setting_id).asc(:id).page(page_num).per(10) + end def export_sign_up_student_data # @OlympiaSchoolDataFields = OlympiaSchoolDataFields.all.asc(:id) # dir_path = 'tmp/olypiamanagement/' @@ -238,10 +246,47 @@ class Admin::OlympiamanagementsController < OrbitAdminController # send_data(tmp_filename_data, type: 'application/xlsx', disposition: 'attachment', filename: @filename) end def download_scan_file_of_certificate + @sign_up_setting_id = SignUpSetting.last.id + @student_data_list = OlympiaStudentDataField.where(:sign_up_setting_id=>@sign_up_setting_id) + @student_data_image_path_arr = @student_data_list.flat_map{|student_data| student_data.olympia_student_images}.map{|student_image| student_image.student_file.file.file} + zip_path = "tmp/student_images/#{@sign_up_setting_id}/" + tmp_filename = '' + FileUtils.rm_r(zip_path, :force => true) if Dir.exist?(zip_path) + FileUtils.mkdir_p zip_path #create dir for storing tmp_file + @student_data_image_path_arr.each do |image_path| + @pathname = Pathname.new(image_path) + @temp_name = @pathname.basename + Dir.chdir(@pathname.dirname.to_s) do + @index = 1 + @original_filename =@pathname.basename.to_s + @new_pathname = Pathname.new("#{Rails.root}/#{zip_path}#{@original_filename}") + while @new_pathname.exist? do + @new_pathname = Pathname.new(@new_pathname.to_s.insert(@new_pathname.to_s.rindex('.'),"-#{@index}")) + @index += 1 + end + #a[0...b].concat('-1').concat(a[b..-1]) + FileUtils.cp(@original_filename,@new_pathname) + end + end + @filename = Pathname.new(zip_path).parent.to_s+"/#{Time.now.strftime('%Y_%m_%d')}_student_images.zip" + zip_file= ZipFileGenerator.new(zip_path,@filename) + begin + zip_file.write + rescue + File.delete(@filename) + zip_file.write + end + tmp_filename_data = File.read(@filename) + send_data(tmp_filename_data, type: 'application/zip', disposition: 'attachment', filename: Pathname.new(@filename).basename.to_s) end def import_editing_number_of_school_class @olympia_school_data_field = OlympiaSchoolDataFields.new end + def create_first_fields + StudentDataField.create if StudentDataField.all.length == 0 + SchoolDataFields.create if StudentDataField.all.length == 0 + SignUpSetting.create if SignUpSetting.all.length == 0 + end def download_import_file @OlympiaSchoolDataFields = OlympiaSchoolDataFields.all.asc(:id) dir_path = 'tmp/olypiamanagement/' diff --git a/app/controllers/admin/zipgenerator.rb b/app/controllers/admin/zipgenerator.rb new file mode 100644 index 0000000..6d7d6cf --- /dev/null +++ b/app/controllers/admin/zipgenerator.rb @@ -0,0 +1,61 @@ +require 'zip' + +# This is a simple example which uses rubyzip to +# recursively generate a zip file from the contents of +# a specified directory. The directory itself is not +# included in the archive, rather just its contents. +# +# Usage: +# directory_to_zip = "/tmp/input" +# output_file = "/tmp/out.zip" +# zf = ZipFileGenerator.new(directory_to_zip, output_file) +# zf.write() +class ZipFileGenerator + # Initialize with the directory to zip and the location of the output archive. + def initialize(input_dir, output_file) + @input_dir = input_dir + @output_file = output_file + end + + # Zip the input directory. + def write + entries = Dir.entries(@input_dir) - %w[. ..] + + ::Zip::File.open(@output_file, ::Zip::File::CREATE) do |zipfile| + write_entries entries, '', zipfile + end + end + def extract_zip + FileUtils.mkdir_p(@output_file) + Zip::File.open(@input_dir) do |zip_file| + zip_file.each do |f| + fpath = File.join(@output_file, f.name) + zip_file.extract(f, fpath) unless File.exist?(fpath) + end + end + end + private + + # A helper method to make the recursion work. + def write_entries(entries, path, zipfile) + entries.each do |e| + zipfile_path = path == '' ? e : File.join(path, e) + disk_file_path = File.join(@input_dir, zipfile_path) + + if File.directory? disk_file_path + recursively_deflate_directory(disk_file_path, zipfile, zipfile_path) + else + put_into_archive(disk_file_path, zipfile, zipfile_path) + end + end + end + def recursively_deflate_directory(disk_file_path, zipfile, zipfile_path) + zipfile.mkdir zipfile_path + subdir = Dir.entries(disk_file_path) - %w[. ..] + write_entries subdir, zipfile_path, zipfile + end + + def put_into_archive(disk_file_path, zipfile, zipfile_path) + zipfile.add(zipfile_path, disk_file_path) + end +end diff --git a/app/models/olympia_images_uploader.rb b/app/models/olympia_images_uploader.rb index dc581ac..f9e141d 100644 --- a/app/models/olympia_images_uploader.rb +++ b/app/models/olympia_images_uploader.rb @@ -19,7 +19,7 @@ class OlympiaImagesUploader < CarrierWave::Uploader::Base # Override the directory where uploaded files will be stored. # This is a sensible default for uploaders that are meant to be mounted: def store_dir - return "uploads/#{model.class.to_s.underscore}/olympia_students" + return "uploads/#{model.class.to_s.underscore}/olympia_students/#{model.id}/" end # override diff --git a/app/views/admin/olympiamanagements/school_data_list.html.erb b/app/views/admin/olympiamanagements/school_data_list.html.erb index 3ce8df2..a5f8058 100644 --- a/app/views/admin/olympiamanagements/school_data_list.html.erb +++ b/app/views/admin/olympiamanagements/school_data_list.html.erb @@ -33,7 +33,7 @@ <% else %> "><%= t('olympiamanagement.edit') %><%= t('olympiamanagement.edit') %> - "><%= t('olympiamanagement.sign_up_student_data') %><%= t('olympiamanagement.sign_up_student_data') %> + "><%= t('olympiamanagement.sign_up_student_data') %><%= t('olympiamanagement.sign_up_student_data') %> "><%= t('olympiamanagement.delete') %><%= t('olympiamanagement.delete') %> <%if field.approved%> "><%= t('olympiamanagement.unapproved') %><%= t('olympiamanagement.unapproved') %> diff --git a/app/views/admin/olympiamanagements/sign_up_student_data_list.html.erb b/app/views/admin/olympiamanagements/sign_up_student_data_list.html.erb new file mode 100644 index 0000000..18e4922 --- /dev/null +++ b/app/views/admin/olympiamanagements/sign_up_student_data_list.html.erb @@ -0,0 +1,36 @@ + + + +<% th_name_list = ['StudentIdentity','StudentName','StudentClass','StudentArea','StudentPhone','action']%> + + + + <% th_name_list.each do |th_name|%> + + <% end %> + + + + <% @student_fields.each do |field| %> + + <% th_name_list.each do |th_name|%> + <%if th_name != 'action'%> + <% @value = field[th_name] %> + <% @index = @field_infos.map{|hash| hash.keys[0]}.index(th_name) rescue nil%> + <% if !@index.nil? %> + <% (['String','Year','select_num','File'].include?(@field_infos.map{|hash| hash.values[0]}[@index]['type'])) ? (nil) : (@value=(@field_infos.map{|hash| hash.values[0]}[@index]['values'][I18n.locale.to_s][@value.to_i].to_s rescue @value))%> + <% end %> + + <% else %> + + <% end %> + <% end %> + + <%end%> + +
<%= t('olympiamanagement.'+th_name) %>
<%= @value %> + "><%= t('olympiamanagement.edit') %><%= t('olympiamanagement.edit') %> + "><%= t('olympiamanagement.delete') %><%= t('olympiamanagement.delete') %> +
+<% @extra_params = request.query_parameters.map{|key,value| key+'='+value}.join('&') %> +<%=create_pagination(params[:page].to_i,@student_fields,@extra_params).html_safe%> \ No newline at end of file diff --git a/app/views/olympiamanagements/_image_form.html.erb b/app/views/olympiamanagements/_image_form.html.erb index ad91096..5ec1217 100644 --- a/app/views/olympiamanagements/_image_form.html.erb +++ b/app/views/olympiamanagements/_image_form.html.erb @@ -2,17 +2,17 @@
- <% if(image_form.send(image_field_name).first.send(field_name).file.present? rescue false) %> + <% if(image_form.send(image_field_name).last.send(field_name).file.present? rescue false) %>
- <%= image_tag( image_form.send(image_field_name).first.send(field_name), :size=>"120x120") %> + <%= image_tag( image_form.send(image_field_name).last.send(field_name), :size=>"120x120") %>
<% end %>
- <% if(image_form.send(image_field_name).first.send(field_name).file.present? rescue false)%> + <% if(image_form.send(image_field_name).last.send(field_name).file.present? rescue false)%> <%= f.fields_for image_field_name do |index| %> <%= index.fields_for "0" do |image| %> - <%= image.hidden_field(:_id,{:value=>image_form.send(image_field_name).first.id.to_s}) %> + <%= image.hidden_field(:_id,{:value=>image_form.send(image_field_name).last.id.to_s}) %> <%= image.file_field field_name, {:id => (image_id rescue "input-upload"), :class => ('fileupload-new'+(@extra_class rescue "")), :accept=> 'image/png,image/gif,image/jpeg'} %><%= t('preferences.change') %> <% end %> <% end %> diff --git a/config/routes.rb b/config/routes.rb index 7e35bb8..6e11371 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -20,6 +20,7 @@ Rails.application.routes.draw do patch 'olympiamanagements/update_sign_up_data' , to: 'olympiamanagements#update_sign_up_data' get 'olympiamanagements/update_sign_up_data' , to: 'olympiamanagements#update_sign_up_data' get 'olympiamanagements/download_import_file' , to: 'olympiamanagements#download_import_file' + get 'olympiamanagements/sign_up_student_data_list' , to: 'olympiamanagements#sign_up_student_data_list' resources :olympiamanagements end resource 'olympiamanagements' do