mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-12-26 17:51:13 +08:00
Move the docx creation to the Delayed job [SCI-5560]
This commit is contained in:
parent
2aae7046d0
commit
df8354bde3
7 changed files with 49 additions and 17 deletions
2
Gemfile
2
Gemfile
|
@ -62,7 +62,7 @@ gem 'ajax-datatables-rails', '~> 0.3.1'
|
||||||
gem 'aspector' # Aspect-oriented programming for Rails
|
gem 'aspector' # Aspect-oriented programming for Rails
|
||||||
gem 'auto_strip_attributes', '~> 2.1' # Removes unnecessary whitespaces AR
|
gem 'auto_strip_attributes', '~> 2.1' # Removes unnecessary whitespaces AR
|
||||||
gem 'bcrypt', '~> 3.1.10'
|
gem 'bcrypt', '~> 3.1.10'
|
||||||
gem 'caracal-rails' # Build docx report
|
gem 'caracal' # Build docx report
|
||||||
gem 'deface', '~> 1.0'
|
gem 'deface', '~> 1.0'
|
||||||
gem 'down', '~> 5.0'
|
gem 'down', '~> 5.0'
|
||||||
gem 'faker' # Generate fake data
|
gem 'faker' # Generate fake data
|
||||||
|
|
|
@ -198,9 +198,6 @@ GEM
|
||||||
nokogiri (~> 1.6)
|
nokogiri (~> 1.6)
|
||||||
rubyzip (~> 1.1)
|
rubyzip (~> 1.1)
|
||||||
tilt (>= 1.4)
|
tilt (>= 1.4)
|
||||||
caracal-rails (1.0.2)
|
|
||||||
caracal (~> 1.0)
|
|
||||||
rails (>= 3.2)
|
|
||||||
case_transform (0.2)
|
case_transform (0.2)
|
||||||
activesupport
|
activesupport
|
||||||
childprocess (3.0.0)
|
childprocess (3.0.0)
|
||||||
|
@ -647,7 +644,7 @@ DEPENDENCIES
|
||||||
canaid!
|
canaid!
|
||||||
capybara
|
capybara
|
||||||
capybara-email
|
capybara-email
|
||||||
caracal-rails
|
caracal
|
||||||
cucumber-rails (~> 1.8)
|
cucumber-rails (~> 1.8)
|
||||||
database_cleaner
|
database_cleaner
|
||||||
deface (~> 1.0)
|
deface (~> 1.0)
|
||||||
|
|
|
@ -22,7 +22,7 @@ class ReportsController < ApplicationController
|
||||||
result_contents
|
result_contents
|
||||||
).freeze
|
).freeze
|
||||||
|
|
||||||
before_action :load_vars, only: %i(edit update document_preview)
|
before_action :load_vars, only: %i(edit update document_preview generate)
|
||||||
before_action :load_vars_nested, only: BEFORE_ACTION_METHODS
|
before_action :load_vars_nested, only: BEFORE_ACTION_METHODS
|
||||||
before_action :load_visible_projects, only: %i(new edit)
|
before_action :load_visible_projects, only: %i(new edit)
|
||||||
before_action :load_available_repositories,
|
before_action :load_available_repositories,
|
||||||
|
@ -167,15 +167,20 @@ class ReportsController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
# Generation action
|
# Generation action
|
||||||
# Currently, only .PDF is supported
|
|
||||||
def generate
|
def generate
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.docx do
|
format.pdf do
|
||||||
@user = current_user
|
render pdf: 'report', header: { html: { template: 'reports/header.pdf.erb' }},
|
||||||
@team = current_team
|
footer: { html: { template: 'reports/footer.pdf.erb',
|
||||||
@scinote_url = root_url
|
locals: { current_time: I18n.l(Time.zone.now, format: :full) }}},
|
||||||
@data = params[:data]
|
locals: { content: content },
|
||||||
headers["Content-Disposition"] = 'attachment; filename="scinote_report.docx"'
|
template: 'reports/report.pdf.erb',
|
||||||
|
disable_javascript: true
|
||||||
|
end
|
||||||
|
format.json do
|
||||||
|
@report.update!(docx_file_processing: true)
|
||||||
|
Reports::DocxJob.perform_now(@report, params[:data], current_user, current_team, root_url)
|
||||||
|
render json: {}, status: :accepted
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
21
app/jobs/reports/docx_job.rb
Normal file
21
app/jobs/reports/docx_job.rb
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Reports
|
||||||
|
class DocxJob < ApplicationJob
|
||||||
|
queue_as :reports
|
||||||
|
|
||||||
|
def perform(report, data, user, team, root_url)
|
||||||
|
file = Tempfile.new(['report', '.docx'])
|
||||||
|
begin
|
||||||
|
docx = Caracal::Document.new(file.path)
|
||||||
|
Reports::Docx.new(data, docx, user: user, team: team, scinote_url: root_url).draw
|
||||||
|
docx.save
|
||||||
|
report.docx_file.attach(io: file, filename: 'report.docx')
|
||||||
|
report.update!(docx_file_processing: false)
|
||||||
|
ensure
|
||||||
|
file.close
|
||||||
|
file.unlink
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1 +0,0 @@
|
||||||
Reports::Docx.new(@data,docx,user: @user, team: @team, scinote_url: @scinote_url).draw
|
|
|
@ -26,8 +26,8 @@
|
||||||
<span class="caret"></span>
|
<span class="caret"></span>
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
|
<ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
|
||||||
<li><%= link_to t("projects.reports.new.nav_pdf"), generate_project_reports_path(@project, format: :pdf), id: "get-report-pdf" %></li>
|
<li><%= link_to t("projects.reports.new.nav_pdf"), generate_project_report_path(@project, @report, format: :pdf), id: "get-report-pdf" %></li>
|
||||||
<li><%= link_to t("projects.reports.new.nav_docx"), generate_project_reports_path(@project, format: :docx), id: "get-report-docx" %></li>
|
<li><%= link_to t("projects.reports.new.nav_docx"), generate_project_report_path(@project, @report, format: :json), id: "get-report-docx" %></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -249,10 +249,20 @@ Rails.application.routes.draw do
|
||||||
resources :reports,
|
resources :reports,
|
||||||
path: '/reports',
|
path: '/reports',
|
||||||
only: %i(edit update create) do
|
only: %i(edit update create) do
|
||||||
|
member do
|
||||||
|
post 'generate', to: 'reports#generate', format: %w(pdf json)
|
||||||
|
end
|
||||||
|
|
||||||
collection do
|
collection do
|
||||||
# The posts following here should in theory be gets,
|
# The posts following here should in theory be gets,
|
||||||
# but are posts because of parameters payload
|
# but are posts because of parameters payload
|
||||||
post 'generate', to: 'reports#generate', format: %w(docx pdf)
|
get 'new/', to: 'reports#new'
|
||||||
|
get 'new/project_contents_modal',
|
||||||
|
to: 'reports#project_contents_modal',
|
||||||
|
as: :project_contents_modal
|
||||||
|
post 'new/project_contents',
|
||||||
|
to: 'reports#project_contents',
|
||||||
|
as: :project_contents
|
||||||
get 'new/experiment_contents_modal',
|
get 'new/experiment_contents_modal',
|
||||||
to: 'reports#experiment_contents_modal',
|
to: 'reports#experiment_contents_modal',
|
||||||
as: :experiment_contents_modal
|
as: :experiment_contents_modal
|
||||||
|
|
Loading…
Reference in a new issue