Compare commits
41 Commits
prevent-su
...
improve-do
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0bda6c3480 | ||
|
|
98afad4174 | ||
|
|
3471e21429 | ||
|
|
f611382e9e | ||
|
|
95a14ab2f6 | ||
|
|
896cec2259 | ||
|
|
a493076f9b | ||
|
|
41bf88e358 | ||
|
|
190ff2854b | ||
|
|
8214ba9e67 | ||
|
|
9cbd8d31a8 | ||
|
|
9c3fac4ab9 | ||
|
|
8f13589c55 | ||
|
|
cd0de9154c | ||
|
|
2590b6bdc9 | ||
|
|
40f241b75f | ||
|
|
add8304eab | ||
|
|
f04d34d337 | ||
|
|
c033f5df17 | ||
|
|
7f49f31ebf | ||
|
|
4c49a5db03 | ||
|
|
35303cb570 | ||
|
|
1127f09263 | ||
|
|
19b1e75384 | ||
|
|
93a4ce462d | ||
|
|
0e16791d8b | ||
|
|
7cdb814d6d | ||
|
|
2dea0f29b9 | ||
|
|
d6a3542308 | ||
|
|
e49498bbbf | ||
|
|
dd0ac5b110 | ||
|
|
8951667e61 | ||
|
|
fe131491cd | ||
|
|
290dbfa48b | ||
|
|
319cd89b29 | ||
|
|
6b0ea5b7df | ||
|
|
afee9d9bc9 | ||
|
|
072142811f | ||
|
|
b924b99762 | ||
|
|
988ef2beab | ||
|
|
1168bcdfdd |
11
.env.sample
11
.env.sample
@@ -7,8 +7,6 @@ AWS_SECRET_ACCESS_KEY=
|
|||||||
AWS_REGION=
|
AWS_REGION=
|
||||||
|
|
||||||
BRAYNIAC_AI_API_ENDPOINT=https://z99cprg2eg.execute-api.us-east-1.amazonaws.com/dev/v0.0.1
|
BRAYNIAC_AI_API_ENDPOINT=https://z99cprg2eg.execute-api.us-east-1.amazonaws.com/dev/v0.0.1
|
||||||
SOURCE_AUDIO_API_ENDPOINT=https://bigmedia.sourceaudio.com/api
|
|
||||||
SOURCE_AUDIO_TOKEN=
|
|
||||||
|
|
||||||
# Optional
|
# Optional
|
||||||
REDIS_URL=
|
REDIS_URL=
|
||||||
@@ -18,7 +16,7 @@ ZOOM_API_KEY=
|
|||||||
ZOOM_API_SECRET=
|
ZOOM_API_SECRET=
|
||||||
ZOOM_PRO_USERS_LIMIT= # defaults to 3
|
ZOOM_PRO_USERS_LIMIT= # defaults to 3
|
||||||
ZOOM_USER_TYPE= # 'pro' / 'basic'
|
ZOOM_USER_TYPE= # 'pro' / 'basic'
|
||||||
ZOOM_ENABLE_RECORDINGS=0 # 0 / 1
|
ZOOM_ENABLE_RECORDINGS= # true / false (default: false)
|
||||||
# Token for webhooks authorization
|
# Token for webhooks authorization
|
||||||
ZOOM_VERIFICATION_TOKEN=
|
ZOOM_VERIFICATION_TOKEN=
|
||||||
|
|
||||||
@@ -27,3 +25,10 @@ MUX_TOKEN_ID=
|
|||||||
MUX_TOKEN_SECRET=
|
MUX_TOKEN_SECRET=
|
||||||
MUX_BROADCAST_SERVER_URL=rtmp://global-live.mux.com:5222/app
|
MUX_BROADCAST_SERVER_URL=rtmp://global-live.mux.com:5222/app
|
||||||
MUX_TEST_MODE_DISABLED=
|
MUX_TEST_MODE_DISABLED=
|
||||||
|
|
||||||
|
# Required for creating user through API
|
||||||
|
CUSTOM_API_TOKEN=
|
||||||
|
|
||||||
|
# Required for simulcasting to Millicast for director mode
|
||||||
|
MILLICAST_API_SECRET=
|
||||||
|
MILLICAST_ACCOUNT_ID=
|
||||||
|
|||||||
6
Gemfile
6
Gemfile
@@ -4,7 +4,7 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
|||||||
ruby "2.6.3"
|
ruby "2.6.3"
|
||||||
|
|
||||||
# Bundle edge Rails instead: gem "rails", github: "rails/rails"
|
# Bundle edge Rails instead: gem "rails", github: "rails/rails"
|
||||||
gem "rails", "~> 6.0.0"
|
gem "rails", "~> 6.0.3.1"
|
||||||
# Use postgresql as the database for Active Record
|
# Use postgresql as the database for Active Record
|
||||||
gem "pg", "~> 0.18"
|
gem "pg", "~> 0.18"
|
||||||
# Use Puma as the app server
|
# Use Puma as the app server
|
||||||
@@ -30,9 +30,9 @@ gem "active_storage_base64", "~> 1.0.0"
|
|||||||
gem "image_processing", "~> 1.2"
|
gem "image_processing", "~> 1.2"
|
||||||
|
|
||||||
# Use Amazon Web Services S3 for file uploads in production
|
# Use Amazon Web Services S3 for file uploads in production
|
||||||
gem "aws-sdk-s3", "~> 1.31.0", require: false, group: [:production, :review]
|
gem "aws-sdk-s3", "~> 1.48", require: false, group: [:production, :review]
|
||||||
# Allow AWS API requests to be signed using IAM credentials
|
# Allow AWS API requests to be signed using IAM credentials
|
||||||
gem "aws-sigv4", "~> 1.0.2"
|
gem "aws-sigv4", "~> 1.1"
|
||||||
|
|
||||||
# Reduces boot times through caching; required in config/boot.rb
|
# Reduces boot times through caching; required in config/boot.rb
|
||||||
gem "bootsnap", ">= 1.1.0", require: false
|
gem "bootsnap", ">= 1.1.0", require: false
|
||||||
|
|||||||
161
Gemfile.lock
161
Gemfile.lock
@@ -44,71 +44,71 @@ GEM
|
|||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
Ascii85 (1.0.3)
|
Ascii85 (1.0.3)
|
||||||
actioncable (6.0.0)
|
actioncable (6.0.3.2)
|
||||||
actionpack (= 6.0.0)
|
actionpack (= 6.0.3.2)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
websocket-driver (>= 0.6.1)
|
websocket-driver (>= 0.6.1)
|
||||||
actionmailbox (6.0.0)
|
actionmailbox (6.0.3.2)
|
||||||
actionpack (= 6.0.0)
|
actionpack (= 6.0.3.2)
|
||||||
activejob (= 6.0.0)
|
activejob (= 6.0.3.2)
|
||||||
activerecord (= 6.0.0)
|
activerecord (= 6.0.3.2)
|
||||||
activestorage (= 6.0.0)
|
activestorage (= 6.0.3.2)
|
||||||
activesupport (= 6.0.0)
|
activesupport (= 6.0.3.2)
|
||||||
mail (>= 2.7.1)
|
mail (>= 2.7.1)
|
||||||
actionmailer (6.0.0)
|
actionmailer (6.0.3.2)
|
||||||
actionpack (= 6.0.0)
|
actionpack (= 6.0.3.2)
|
||||||
actionview (= 6.0.0)
|
actionview (= 6.0.3.2)
|
||||||
activejob (= 6.0.0)
|
activejob (= 6.0.3.2)
|
||||||
mail (~> 2.5, >= 2.5.4)
|
mail (~> 2.5, >= 2.5.4)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
actionpack (6.0.0)
|
actionpack (6.0.3.2)
|
||||||
actionview (= 6.0.0)
|
actionview (= 6.0.3.2)
|
||||||
activesupport (= 6.0.0)
|
activesupport (= 6.0.3.2)
|
||||||
rack (~> 2.0)
|
rack (~> 2.0, >= 2.0.8)
|
||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||||
actiontext (6.0.0)
|
actiontext (6.0.3.2)
|
||||||
actionpack (= 6.0.0)
|
actionpack (= 6.0.3.2)
|
||||||
activerecord (= 6.0.0)
|
activerecord (= 6.0.3.2)
|
||||||
activestorage (= 6.0.0)
|
activestorage (= 6.0.3.2)
|
||||||
activesupport (= 6.0.0)
|
activesupport (= 6.0.3.2)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
actionview (6.0.0)
|
actionview (6.0.3.2)
|
||||||
activesupport (= 6.0.0)
|
activesupport (= 6.0.3.2)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
erubi (~> 1.4)
|
erubi (~> 1.4)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||||
active_storage_base64 (1.0.0)
|
active_storage_base64 (1.0.0)
|
||||||
rails (~> 6.0)
|
rails (~> 6.0)
|
||||||
activejob (6.0.0)
|
activejob (6.0.3.2)
|
||||||
activesupport (= 6.0.0)
|
activesupport (= 6.0.3.2)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
activemodel (6.0.0)
|
activemodel (6.0.3.2)
|
||||||
activesupport (= 6.0.0)
|
activesupport (= 6.0.3.2)
|
||||||
activemodel-serializers-xml (1.0.2)
|
activemodel-serializers-xml (1.0.2)
|
||||||
activemodel (> 5.x)
|
activemodel (> 5.x)
|
||||||
activesupport (> 5.x)
|
activesupport (> 5.x)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
activerecord (6.0.0)
|
activerecord (6.0.3.2)
|
||||||
activemodel (= 6.0.0)
|
activemodel (= 6.0.3.2)
|
||||||
activesupport (= 6.0.0)
|
activesupport (= 6.0.3.2)
|
||||||
activeresource (5.1.0)
|
activeresource (5.1.0)
|
||||||
activemodel (>= 5.0, < 7)
|
activemodel (>= 5.0, < 7)
|
||||||
activemodel-serializers-xml (~> 1.0)
|
activemodel-serializers-xml (~> 1.0)
|
||||||
activesupport (>= 5.0, < 7)
|
activesupport (>= 5.0, < 7)
|
||||||
activestorage (6.0.0)
|
activestorage (6.0.3.2)
|
||||||
actionpack (= 6.0.0)
|
actionpack (= 6.0.3.2)
|
||||||
activejob (= 6.0.0)
|
activejob (= 6.0.3.2)
|
||||||
activerecord (= 6.0.0)
|
activerecord (= 6.0.3.2)
|
||||||
marcel (~> 0.3.1)
|
marcel (~> 0.3.1)
|
||||||
activesupport (6.0.0)
|
activesupport (6.0.3.2)
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
i18n (>= 0.7, < 2)
|
i18n (>= 0.7, < 2)
|
||||||
minitest (~> 5.1)
|
minitest (~> 5.1)
|
||||||
tzinfo (~> 1.1)
|
tzinfo (~> 1.1)
|
||||||
zeitwerk (~> 2.1, >= 2.1.8)
|
zeitwerk (~> 2.2, >= 2.2.2)
|
||||||
addressable (2.7.0)
|
addressable (2.7.0)
|
||||||
public_suffix (>= 2.0.2, < 5.0)
|
public_suffix (>= 2.0.2, < 5.0)
|
||||||
afm (0.2.2)
|
afm (0.2.2)
|
||||||
@@ -117,21 +117,22 @@ GEM
|
|||||||
ast (2.4.0)
|
ast (2.4.0)
|
||||||
autoprefixer-rails (9.7.3)
|
autoprefixer-rails (9.7.3)
|
||||||
execjs
|
execjs
|
||||||
aws-eventstream (1.0.3)
|
aws-eventstream (1.1.0)
|
||||||
aws-partitions (1.210.0)
|
aws-partitions (1.337.0)
|
||||||
aws-sdk-core (3.46.2)
|
aws-sdk-core (3.102.1)
|
||||||
aws-eventstream (~> 1.0)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
aws-partitions (~> 1.0)
|
aws-partitions (~> 1, >= 1.239.0)
|
||||||
aws-sigv4 (~> 1.0)
|
aws-sigv4 (~> 1.1)
|
||||||
jmespath (~> 1.0)
|
jmespath (~> 1.0)
|
||||||
aws-sdk-kms (1.13.0)
|
aws-sdk-kms (1.35.0)
|
||||||
aws-sdk-core (~> 3, >= 3.39.0)
|
aws-sdk-core (~> 3, >= 3.99.0)
|
||||||
aws-sigv4 (~> 1.0)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sdk-s3 (1.31.0)
|
aws-sdk-s3 (1.72.0)
|
||||||
aws-sdk-core (~> 3, >= 3.39.0)
|
aws-sdk-core (~> 3, >= 3.102.1)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.0)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sigv4 (1.0.3)
|
aws-sigv4 (1.2.1)
|
||||||
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
axlsx (3.0.0.pre)
|
axlsx (3.0.0.pre)
|
||||||
htmlentities (~> 4.3, >= 4.3.4)
|
htmlentities (~> 4.3, >= 4.3.4)
|
||||||
mimemagic (~> 0.3)
|
mimemagic (~> 0.3)
|
||||||
@@ -181,7 +182,7 @@ GEM
|
|||||||
coffee-script-source
|
coffee-script-source
|
||||||
execjs
|
execjs
|
||||||
coffee-script-source (1.12.2)
|
coffee-script-source (1.12.2)
|
||||||
concurrent-ruby (1.1.5)
|
concurrent-ruby (1.1.6)
|
||||||
connection_pool (2.2.2)
|
connection_pool (2.2.2)
|
||||||
countries (2.1.4)
|
countries (2.1.4)
|
||||||
i18n_data (~> 0.8.0)
|
i18n_data (~> 0.8.0)
|
||||||
@@ -230,7 +231,7 @@ GEM
|
|||||||
hubspot-ruby (0.9.0)
|
hubspot-ruby (0.9.0)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
httparty (>= 0.10.0)
|
httparty (>= 0.10.0)
|
||||||
i18n (1.8.2)
|
i18n (1.8.3)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
i18n_data (0.8.0)
|
i18n_data (0.8.0)
|
||||||
i18n_yaml_sorter (0.2.0)
|
i18n_yaml_sorter (0.2.0)
|
||||||
@@ -270,22 +271,22 @@ GEM
|
|||||||
ruby_dep (~> 1.2)
|
ruby_dep (~> 1.2)
|
||||||
loaf (0.8.1)
|
loaf (0.8.1)
|
||||||
rails (>= 3.2)
|
rails (>= 3.2)
|
||||||
loofah (2.4.0)
|
loofah (2.6.0)
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.5.9)
|
nokogiri (>= 1.5.9)
|
||||||
mail (2.7.1)
|
mail (2.7.1)
|
||||||
mini_mime (>= 0.1.1)
|
mini_mime (>= 0.1.1)
|
||||||
marcel (0.3.3)
|
marcel (0.3.3)
|
||||||
mimemagic (~> 0.3.2)
|
mimemagic (~> 0.3.2)
|
||||||
method_source (0.9.2)
|
method_source (1.0.0)
|
||||||
mime-types (3.3)
|
mime-types (3.3)
|
||||||
mime-types-data (~> 3.2015)
|
mime-types-data (~> 3.2015)
|
||||||
mime-types-data (3.2019.0904)
|
mime-types-data (3.2019.0904)
|
||||||
mimemagic (0.3.3)
|
mimemagic (0.3.5)
|
||||||
mini_magick (4.9.5)
|
mini_magick (4.9.5)
|
||||||
mini_mime (1.0.2)
|
mini_mime (1.0.2)
|
||||||
mini_portile2 (2.4.0)
|
mini_portile2 (2.4.0)
|
||||||
minitest (5.14.0)
|
minitest (5.14.1)
|
||||||
monetize (1.9.2)
|
monetize (1.9.2)
|
||||||
money (~> 6.12)
|
money (~> 6.12)
|
||||||
money (6.13.4)
|
money (6.13.4)
|
||||||
@@ -298,8 +299,8 @@ GEM
|
|||||||
msgpack (1.3.1)
|
msgpack (1.3.1)
|
||||||
multi_xml (0.6.0)
|
multi_xml (0.6.0)
|
||||||
multipart-post (2.1.1)
|
multipart-post (2.1.1)
|
||||||
nio4r (2.5.1)
|
nio4r (2.5.2)
|
||||||
nokogiri (1.10.7)
|
nokogiri (1.10.9)
|
||||||
mini_portile2 (~> 2.4.0)
|
mini_portile2 (~> 2.4.0)
|
||||||
oath (1.1.0)
|
oath (1.1.0)
|
||||||
bcrypt
|
bcrypt
|
||||||
@@ -337,20 +338,20 @@ GEM
|
|||||||
rack
|
rack
|
||||||
rack-test (1.1.0)
|
rack-test (1.1.0)
|
||||||
rack (>= 1.0, < 3)
|
rack (>= 1.0, < 3)
|
||||||
rails (6.0.0)
|
rails (6.0.3.2)
|
||||||
actioncable (= 6.0.0)
|
actioncable (= 6.0.3.2)
|
||||||
actionmailbox (= 6.0.0)
|
actionmailbox (= 6.0.3.2)
|
||||||
actionmailer (= 6.0.0)
|
actionmailer (= 6.0.3.2)
|
||||||
actionpack (= 6.0.0)
|
actionpack (= 6.0.3.2)
|
||||||
actiontext (= 6.0.0)
|
actiontext (= 6.0.3.2)
|
||||||
actionview (= 6.0.0)
|
actionview (= 6.0.3.2)
|
||||||
activejob (= 6.0.0)
|
activejob (= 6.0.3.2)
|
||||||
activemodel (= 6.0.0)
|
activemodel (= 6.0.3.2)
|
||||||
activerecord (= 6.0.0)
|
activerecord (= 6.0.3.2)
|
||||||
activestorage (= 6.0.0)
|
activestorage (= 6.0.3.2)
|
||||||
activesupport (= 6.0.0)
|
activesupport (= 6.0.3.2)
|
||||||
bundler (>= 1.3.0)
|
bundler (>= 1.3.0)
|
||||||
railties (= 6.0.0)
|
railties (= 6.0.3.2)
|
||||||
sprockets-rails (>= 2.0.0)
|
sprockets-rails (>= 2.0.0)
|
||||||
rails-controller-testing (1.0.4)
|
rails-controller-testing (1.0.4)
|
||||||
actionpack (>= 5.0.1.x)
|
actionpack (>= 5.0.1.x)
|
||||||
@@ -363,9 +364,9 @@ GEM
|
|||||||
nokogiri (>= 1.6)
|
nokogiri (>= 1.6)
|
||||||
rails-html-sanitizer (1.3.0)
|
rails-html-sanitizer (1.3.0)
|
||||||
loofah (~> 2.3)
|
loofah (~> 2.3)
|
||||||
railties (6.0.0)
|
railties (6.0.3.2)
|
||||||
actionpack (= 6.0.0)
|
actionpack (= 6.0.3.2)
|
||||||
activesupport (= 6.0.0)
|
activesupport (= 6.0.3.2)
|
||||||
method_source
|
method_source
|
||||||
rake (>= 0.8.7)
|
rake (>= 0.8.7)
|
||||||
thor (>= 0.20.3, < 2.0)
|
thor (>= 0.20.3, < 2.0)
|
||||||
@@ -469,7 +470,7 @@ GEM
|
|||||||
turbolinks-source (5.2.0)
|
turbolinks-source (5.2.0)
|
||||||
typhoeus (1.3.1)
|
typhoeus (1.3.1)
|
||||||
ethon (>= 0.9.0)
|
ethon (>= 0.9.0)
|
||||||
tzinfo (1.2.6)
|
tzinfo (1.2.7)
|
||||||
thread_safe (~> 0.1)
|
thread_safe (~> 0.1)
|
||||||
uglifier (4.1.20)
|
uglifier (4.1.20)
|
||||||
execjs (>= 0.3.0, < 3)
|
execjs (>= 0.3.0, < 3)
|
||||||
@@ -494,9 +495,9 @@ GEM
|
|||||||
activesupport (>= 4.2)
|
activesupport (>= 4.2)
|
||||||
rack-proxy (>= 0.6.1)
|
rack-proxy (>= 0.6.1)
|
||||||
railties (>= 4.2)
|
railties (>= 4.2)
|
||||||
websocket-driver (0.7.1)
|
websocket-driver (0.7.2)
|
||||||
websocket-extensions (>= 0.1.0)
|
websocket-extensions (>= 0.1.0)
|
||||||
websocket-extensions (0.1.4)
|
websocket-extensions (0.1.5)
|
||||||
will_paginate (3.2.1)
|
will_paginate (3.2.1)
|
||||||
will_paginate-bootstrap4 (0.2.2)
|
will_paginate-bootstrap4 (0.2.2)
|
||||||
will_paginate (~> 3.0, >= 3.0.0)
|
will_paginate (~> 3.0, >= 3.0.0)
|
||||||
@@ -504,7 +505,7 @@ GEM
|
|||||||
wkhtmltopdf-heroku (2.12.5.0)
|
wkhtmltopdf-heroku (2.12.5.0)
|
||||||
xpath (3.2.0)
|
xpath (3.2.0)
|
||||||
nokogiri (~> 1.8)
|
nokogiri (~> 1.8)
|
||||||
zeitwerk (2.2.2)
|
zeitwerk (2.3.1)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
@@ -514,8 +515,8 @@ DEPENDENCIES
|
|||||||
activeresource (= 5.1.0)
|
activeresource (= 5.1.0)
|
||||||
acts-as-taggable-on!
|
acts-as-taggable-on!
|
||||||
analytics-ruby
|
analytics-ruby
|
||||||
aws-sdk-s3 (~> 1.31.0)
|
aws-sdk-s3 (~> 1.48)
|
||||||
aws-sigv4 (~> 1.0.2)
|
aws-sigv4 (~> 1.1)
|
||||||
axlsx (~> 3.0.0.pre)
|
axlsx (~> 3.0.0.pre)
|
||||||
axlsx_rails (~> 0.5.2)
|
axlsx_rails (~> 0.5.2)
|
||||||
axlsx_styler (~> 0.2.0)
|
axlsx_styler (~> 0.2.0)
|
||||||
@@ -561,7 +562,7 @@ DEPENDENCIES
|
|||||||
rack!
|
rack!
|
||||||
rack-contrib (~> 2.0.1)
|
rack-contrib (~> 2.0.1)
|
||||||
rack-cors
|
rack-cors
|
||||||
rails (~> 6.0.0)
|
rails (~> 6.0.3.1)
|
||||||
rails-controller-testing (~> 1.0.4)
|
rails-controller-testing (~> 1.0.4)
|
||||||
rails-data-migrations (~> 1.2.0)
|
rails-data-migrations (~> 1.2.0)
|
||||||
redcarpet (~> 3.4.0)
|
redcarpet (~> 3.4.0)
|
||||||
|
|||||||
@@ -21,11 +21,15 @@ $(document).on "turbolinks:load", ->
|
|||||||
|
|
||||||
refreshBroadcastVideo: (data) ->
|
refreshBroadcastVideo: (data) ->
|
||||||
$("#broadcast_updates").html data.status_content
|
$("#broadcast_updates").html data.status_content
|
||||||
if data.streamer_status == 'recording' && data.status == 'active'
|
stream_selected = $("#broadcast_video").data('videoType') == 'stream';
|
||||||
|
if data.streamer_status == 'recording' && data.status == 'active' && stream_selected
|
||||||
$("#broadcast_video").html data.video_content
|
$("#broadcast_video").html data.video_content
|
||||||
|
$("#live_take").html data.live_take_content
|
||||||
|
|
||||||
new (Clappr.Player)(
|
new (Clappr.Player)(
|
||||||
|
<%= "baseUrl: 'http://cdn.clappr.io/latest'," if Rails.env.test? %>
|
||||||
parentId: '#broadcast_video'
|
parentId: '#broadcast_video'
|
||||||
source: data.playback_url
|
source: data.full_live_stream_playback_url
|
||||||
width: '100%',
|
width: '100%',
|
||||||
height: '100%',
|
height: '100%',
|
||||||
mute: true,
|
mute: true,
|
||||||
@@ -33,6 +37,7 @@ $(document).on "turbolinks:load", ->
|
|||||||
hlsMinimumDvrSize: 1)
|
hlsMinimumDvrSize: 1)
|
||||||
if data.streamer_status == "idle" && data.status == "idle"
|
if data.streamer_status == "idle" && data.status == "idle"
|
||||||
$("#broadcast_video").html data.video_content
|
$("#broadcast_video").html data.video_content
|
||||||
|
$("#live_take").html data.live_take_content
|
||||||
|
|
||||||
showBroadcastRecordings: (data) ->
|
showBroadcastRecordings: (data) ->
|
||||||
$(".flash-message").html data.flash_content
|
$(".flash-message").html data.flash_content
|
||||||
9
app/assets/javascripts/directory_files_input.js
Normal file
9
app/assets/javascripts/directory_files_input.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
$(document).on("turbolinks:load", function() {
|
||||||
|
$("#upload_directory_files").on('click', function(e){
|
||||||
|
const newFilesCount = $('input[name = "directory[files][]"][type = "hidden"]').length;
|
||||||
|
|
||||||
|
if (newFilesCount === 0){
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
20
app/assets/javascripts/download_releases.js
Normal file
20
app/assets/javascripts/download_releases.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
$(document).on("click", "#download_releases", function(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
const releasable_ids = JSON.parse($("#selected_releases_form").attr('data-releasable-ids'));
|
||||||
|
const total_entries = $('#total_entries').val();
|
||||||
|
|
||||||
|
const input_ids = $('<input>').attr({ type: 'hidden', name: 'release_ids', value: JSON.stringify(releasable_ids) });
|
||||||
|
const search_query = $('<input>').attr({ type: 'hidden', name: 'search_query', value: $("form input[type='search']").val() });
|
||||||
|
const type_filter = $('<input>').attr({ type: 'hidden', name: 'type_filter', value: $('#type_filter_value').val() });
|
||||||
|
|
||||||
|
const download_count = releasable_ids.length > 0 ? releasable_ids.length : total_entries;
|
||||||
|
|
||||||
|
$(this).parent().append(input_ids);
|
||||||
|
$(this).parent().append(search_query);
|
||||||
|
$(this).parent().append(type_filter);
|
||||||
|
|
||||||
|
if (confirm(`${download_count} release(s) will be downloaded. Is this correct?`)){
|
||||||
|
Rails.fire($(this).parent()[0], 'submit');
|
||||||
|
}
|
||||||
|
});
|
||||||
50
app/assets/javascripts/group_qr_code.js
Normal file
50
app/assets/javascripts/group_qr_code.js
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
$(document).on("click", "[data-behavior=select_contract_template]", function() {
|
||||||
|
var _this = this;
|
||||||
|
var checkbox = $(this).children("input:checkbox");
|
||||||
|
|
||||||
|
selectContractTemplate(_this, checkbox);
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).on("click", "[data-behavior=select_contract_template] input[type='checkbox']", function(e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
var _this = this;
|
||||||
|
var checkbox = $(this);
|
||||||
|
|
||||||
|
selectContractTemplate(_this, checkbox);
|
||||||
|
});
|
||||||
|
|
||||||
|
function selectContractTemplate(clicked_element, checkbox) {
|
||||||
|
if (clicked_element.hasChildNodes()) {
|
||||||
|
if(checkbox.prop("checked")) {
|
||||||
|
checkbox.prop('checked', false);
|
||||||
|
} else {
|
||||||
|
checkbox.prop('checked', true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var checked = checkbox.prop("checked");
|
||||||
|
var project_id = JSON.parse($('#group_qr_code').attr('data-project-id'));
|
||||||
|
var contract_template_ids = JSON.parse($('#group_qr_code').attr('data-contract-template-ids'));
|
||||||
|
var selected_contract_template_id = checkbox.val();
|
||||||
|
|
||||||
|
if (checked && !contract_template_ids.includes(selected_contract_template_id)) {
|
||||||
|
contract_template_ids.push(selected_contract_template_id);
|
||||||
|
} else if(!checked && contract_template_ids.includes(selected_contract_template_id)) {
|
||||||
|
contract_template_ids.splice( $.inArray(selected_contract_template_id, contract_template_ids), 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#group_qr_code').attr('data-contract-template-ids', JSON.stringify(contract_template_ids));
|
||||||
|
|
||||||
|
if (contract_template_ids.length >= 2) {
|
||||||
|
multi_sign_ids = $.param({multi_sign_ids: contract_template_ids});
|
||||||
|
contract_template_url = "/en/contract_templates/" + contract_template_ids[0] + "/qr_codes?" + multi_sign_ids
|
||||||
|
|
||||||
|
$("#group_qr_code").attr("href", contract_template_url);
|
||||||
|
$("#group_qr_code").attr("target", "_blank");
|
||||||
|
$("#group_qr_code").removeClass('disabled');
|
||||||
|
} else if (contract_template_ids.length < 2) {
|
||||||
|
$("#group_qr_code").attr("href", "javascript:void(0);");
|
||||||
|
$("#group_qr_code").addClass('disabled');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -51,10 +51,8 @@ $(document).on("turbolinks:load", function() {
|
|||||||
$("[data-behavior=guardian-photo-preview]").each(function(index, element) {
|
$("[data-behavior=guardian-photo-preview]").each(function(index, element) {
|
||||||
App.PhotoPreview.init(element);
|
App.PhotoPreview.init(element);
|
||||||
});
|
});
|
||||||
$("[data-behavior=take-person-photo]").click(function(e) {
|
$("[data-behavior=trigger-click]").click(function(e) {
|
||||||
$("[data-ujs-target=person-photo-input]").trigger("click");
|
const target = $(this).data("target");
|
||||||
});
|
$(target).trigger("click");
|
||||||
$("[data-behavior=take-guardian-photo]").click(function(e) {
|
|
||||||
$("[data-ujs-target=guardian-photo-input]").trigger("click");
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
$(document).on("click", "[data-behavior=play_recording]", function() {
|
|
||||||
if ($(this).hasClass('active')){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var playback_url = $(this).attr("data-playback-url")
|
|
||||||
$("#broadcast_video").empty();
|
|
||||||
|
|
||||||
new Clappr.Player({
|
|
||||||
parentId: '#broadcast_video',
|
|
||||||
source: playback_url,
|
|
||||||
width: '100%',
|
|
||||||
height: '100%',
|
|
||||||
autoPlay: true
|
|
||||||
});
|
|
||||||
|
|
||||||
$(".dropdown-menu").children().removeClass('active');
|
|
||||||
$(".dropdown-menu").children().children('i').remove();
|
|
||||||
$(this).siblings().removeClass('active');
|
|
||||||
$(this).siblings().children("i").remove();
|
|
||||||
$(this).addClass('active');
|
|
||||||
$(this).prepend('<i class="fa fa-check"> </i>');
|
|
||||||
});
|
|
||||||
|
|
||||||
28
app/assets/javascripts/stream_player.js.erb
Normal file
28
app/assets/javascripts/stream_player.js.erb
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
$(document).on("click", "[data-behavior=play_recording]", function() {
|
||||||
|
if ($(this).hasClass('active')){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#broadcast_video").data('videoType', 'recording');
|
||||||
|
|
||||||
|
var playback_url = $(this).attr("data-playback-url")
|
||||||
|
$("#broadcast_video").empty();
|
||||||
|
|
||||||
|
new Clappr.Player({
|
||||||
|
<%= "baseUrl: 'http://cdn.clappr.io/latest'," if Rails.env.test? %>
|
||||||
|
parentId: '#broadcast_video',
|
||||||
|
source: playback_url,
|
||||||
|
width: '100%',
|
||||||
|
height: '100%',
|
||||||
|
autoPlay: true
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".dropdown-menu").children().removeClass('active');
|
||||||
|
$(".dropdown-menu").children().children('i').remove();
|
||||||
|
$(this).siblings().removeClass('active');
|
||||||
|
$(this).siblings().children("i").remove();
|
||||||
|
$(this).addClass('active');
|
||||||
|
$(this).prepend('<i class="fa fa-check"> </i>');
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).on("click", "[data-behavior=play_stream]", function() { $("#broadcast_video").data('videoType', 'stream'); });
|
||||||
4
app/assets/javascripts/switch_director_mode.js
Normal file
4
app/assets/javascripts/switch_director_mode.js
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
$(document).on("click", "#director_mode_switch", function() {
|
||||||
|
// JQuery click event trigger was not working.
|
||||||
|
document.getElementById("director_mode_link").click();
|
||||||
|
});
|
||||||
13
app/assets/javascripts/update_required_status.js
Normal file
13
app/assets/javascripts/update_required_status.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
$(document).on("turbolinks:load", function() {
|
||||||
|
$("[data-behavior=update-required-status]").click(function(e) {
|
||||||
|
const required = !!($(this)[0] && $(this)[0].checked);
|
||||||
|
|
||||||
|
|
||||||
|
$("[data-required-tag=guardian]").each(function(index, element) {
|
||||||
|
const labelForField = element.previousSibling;
|
||||||
|
|
||||||
|
element.required = required;
|
||||||
|
labelForField.classList.add("required");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -14,6 +14,7 @@ $red: #F9002B;
|
|||||||
$green: #51B61B;
|
$green: #51B61B;
|
||||||
$teal: #32C498;
|
$teal: #32C498;
|
||||||
$purple: #5139EE;
|
$purple: #5139EE;
|
||||||
|
$yellow: #F9BE1B;
|
||||||
$dark: $gray-900;
|
$dark: $gray-900;
|
||||||
$success: $teal;
|
$success: $teal;
|
||||||
$link-color: $body-color;
|
$link-color: $body-color;
|
||||||
|
|||||||
@@ -37,14 +37,14 @@ label {
|
|||||||
&.release-me {
|
&.release-me {
|
||||||
span:last-child {
|
span:last-child {
|
||||||
background-color: $teal;
|
background-color: $teal;
|
||||||
color: $body-color;
|
color: $white;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.direct-me {
|
&.direct-me {
|
||||||
span:last-child {
|
span:last-child {
|
||||||
background-color: $green;
|
background-color: $green;
|
||||||
color: $body-color;
|
color: $white;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,7 +58,14 @@ label {
|
|||||||
&.deliver-me {
|
&.deliver-me {
|
||||||
span:last-child {
|
span:last-child {
|
||||||
background-color: $purple;
|
background-color: $purple;
|
||||||
color: white;
|
color: $white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.task-me {
|
||||||
|
span:last-child {
|
||||||
|
background-color: $yellow;
|
||||||
|
color: $white;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,6 +412,16 @@ a[data-behavior=seekable-timecode] {
|
|||||||
background-color: rgba($black, 0.05);
|
background-color: rgba($black, 0.05);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Black background
|
||||||
|
.bg-black {
|
||||||
|
background-color: $black;
|
||||||
|
}
|
||||||
|
|
||||||
|
// White background
|
||||||
|
.bg-white {
|
||||||
|
background-color: $white;
|
||||||
|
}
|
||||||
|
|
||||||
// Custom width
|
// Custom width
|
||||||
.w-65 {
|
.w-65 {
|
||||||
width: 65% !important;
|
width: 65% !important;
|
||||||
@@ -415,8 +432,32 @@ a[data-behavior=seekable-timecode] {
|
|||||||
max-height: 30rem;
|
max-height: 30rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Max-width 75%
|
||||||
|
.max-w-75 {
|
||||||
|
max-width: 75%;
|
||||||
|
}
|
||||||
|
|
||||||
// Fix height and width
|
// Fix height and width
|
||||||
.fix-h-and-w {
|
.fix-h-and-w {
|
||||||
width: 308px;
|
width: 308px;
|
||||||
height:308px;
|
height:308px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Dropdown shown state overrride
|
||||||
|
.override-dropdown-show-state {
|
||||||
|
color: $white !important;
|
||||||
|
background-color: $black !important;
|
||||||
|
border-color: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override custom switch color
|
||||||
|
.override-custom-control-label::before {
|
||||||
|
background-color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override nav tab design
|
||||||
|
.override-nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active {
|
||||||
|
background: transparent;
|
||||||
|
border-color: transparent;
|
||||||
|
border-bottom: 3px solid #ff0000;
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,12 +11,15 @@ class BroadcastsChannel < ApplicationCable::Channel
|
|||||||
def self.broadcast_stream_updates(broadcast)
|
def self.broadcast_stream_updates(broadcast)
|
||||||
status_content = ApplicationController.render partial: "broadcasts/broadcast_status", locals: { broadcast: broadcast }
|
status_content = ApplicationController.render partial: "broadcasts/broadcast_status", locals: { broadcast: broadcast }
|
||||||
video_content = ApplicationController.render partial: "broadcasts/video", locals: { broadcast: broadcast }
|
video_content = ApplicationController.render partial: "broadcasts/video", locals: { broadcast: broadcast }
|
||||||
|
live_take = ApplicationController.render partial: "broadcasts/live_take", locals: { broadcast: broadcast }
|
||||||
|
|
||||||
broadcast_to broadcast, {
|
broadcast_to broadcast, {
|
||||||
event: :broadcast_stream_update,
|
event: :broadcast_stream_update,
|
||||||
status: broadcast.status,
|
status: broadcast.status,
|
||||||
playback_url: broadcast.stream_playback_url,
|
playback_url: broadcast.stream_playback_url,
|
||||||
|
full_live_stream_playback_url: broadcast.full_live_stream_playback_url,
|
||||||
video_content: video_content,
|
video_content: video_content,
|
||||||
|
live_take_content: live_take,
|
||||||
status_content: status_content,
|
status_content: status_content,
|
||||||
streamer_status: broadcast.streamer_status
|
streamer_status: broadcast.streamer_status
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ class AccountsController < ApplicationController
|
|||||||
|
|
||||||
if sign_in(user)
|
if sign_in(user)
|
||||||
TrackAnalyticsJob.perform_later(user, user.primary_account, :track_guest_sign_up, user_agent: request.user_agent, user_ip: request.remote_ip)
|
TrackAnalyticsJob.perform_later(user, user.primary_account, :track_guest_sign_up, user_agent: request.user_agent, user_ip: request.remote_ip)
|
||||||
SubmitHubspotFormJob.perform_later(user.email, account.name, i_m_interested_in: user.interested_product_name)
|
SubmitHubspotFormJob.perform_later(user.first_name, user.last_name, user.email, account.name, i_m_interested_in: user.interested_product_name)
|
||||||
redirect_to signed_in_root_path
|
redirect_to signed_in_root_path
|
||||||
else
|
else
|
||||||
redirect_to new_session_path, alert: t(".notice")
|
redirect_to new_session_path, alert: t(".notice")
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ class AcquiredMediaReleasesController < ApplicationController
|
|||||||
@acquired_media_release = build_acquired_media_release(acquired_media_release_params)
|
@acquired_media_release = build_acquired_media_release(acquired_media_release_params)
|
||||||
|
|
||||||
if @acquired_media_release.save
|
if @acquired_media_release.save
|
||||||
log_create_analytics
|
|
||||||
SetTagsForReleasableJob.perform_later(@acquired_media_release)
|
SetTagsForReleasableJob.perform_later(@acquired_media_release)
|
||||||
redirect_to [@project, :acquired_media_releases], notice: t(".notice")
|
redirect_to [@project, :acquired_media_releases], notice: t(".notice")
|
||||||
else
|
else
|
||||||
@@ -56,35 +55,71 @@ class AcquiredMediaReleasesController < ApplicationController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def person_params
|
||||||
|
%i[
|
||||||
|
person_first_name
|
||||||
|
person_last_name
|
||||||
|
person_phone
|
||||||
|
person_company
|
||||||
|
person_email
|
||||||
|
person_title
|
||||||
|
person_address_street1
|
||||||
|
person_address_street2
|
||||||
|
person_address_city
|
||||||
|
person_address_state
|
||||||
|
person_address_zip
|
||||||
|
person_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_first_name
|
||||||
|
guardian_last_name
|
||||||
|
guardian_phone
|
||||||
|
guardian_email
|
||||||
|
guardian_photo
|
||||||
|
guardian_address_street1
|
||||||
|
guardian_address_street2
|
||||||
|
guardian_address_city
|
||||||
|
guardian_address_state
|
||||||
|
guardian_address_zip
|
||||||
|
guardian_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def second_guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_2_first_name
|
||||||
|
guardian_2_last_name
|
||||||
|
guardian_2_phone
|
||||||
|
guardian_2_email
|
||||||
|
guardian_2_photo
|
||||||
|
guardian_2_address_street1
|
||||||
|
guardian_2_address_street2
|
||||||
|
guardian_2_address_city
|
||||||
|
guardian_2_address_state
|
||||||
|
guardian_2_address_zip
|
||||||
|
guardian_2_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
def acquired_media_release_params
|
def acquired_media_release_params
|
||||||
params.require(:acquired_media_release).permit(
|
params.require(:acquired_media_release).permit(person_params,
|
||||||
:name,
|
guardian_params,
|
||||||
:territory,
|
second_guardian_params,
|
||||||
:term,
|
:minor,
|
||||||
:person_first_name,
|
:name,
|
||||||
:person_last_name,
|
:territory,
|
||||||
:person_phone,
|
:term,
|
||||||
:person_email,
|
:contract,
|
||||||
:person_company,
|
:applicable_medium_id, :applicable_medium_text,
|
||||||
:person_title,
|
:territory_id, :territory_text,
|
||||||
:person_address_street1,
|
:term_id, :term_text,
|
||||||
:person_address_street2,
|
:restriction_id, :restriction_text,
|
||||||
:person_address_city,
|
categories: [],
|
||||||
:person_address_state,
|
files: []
|
||||||
:person_address_zip,
|
)
|
||||||
:person_address_country,
|
|
||||||
:contract,
|
|
||||||
:applicable_medium_id, :applicable_medium_text,
|
|
||||||
:territory_id, :territory_text,
|
|
||||||
:term_id, :term_text,
|
|
||||||
:restriction_id, :restriction_text,
|
|
||||||
categories: [],
|
|
||||||
file_infos_attributes: [
|
|
||||||
:filename,
|
|
||||||
:content_type,
|
|
||||||
:byte_size
|
|
||||||
]
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_acquired_media_release(attrs = {})
|
def build_acquired_media_release(attrs = {})
|
||||||
@@ -100,8 +135,4 @@ class AcquiredMediaReleasesController < ApplicationController
|
|||||||
|
|
||||||
results
|
results
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_create_analytics
|
|
||||||
TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_non_native_release, release_type: AcquiredMediaRelease.to_s, user_agent: request.user_agent, user_ip: request.remote_ip)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ class Admin::AccountsController < Admin::ApplicationController
|
|||||||
|
|
||||||
def show
|
def show
|
||||||
@videos = filtered_account_videos.order(created_at: :desc, project_id: :desc).paginate(page: params[:page])
|
@videos = filtered_account_videos.order(created_at: :desc, project_id: :desc).paginate(page: params[:page])
|
||||||
|
@broadcasts = account_broadcasts.order(created_at: :desc, project_id: :desc).paginate(page: params[:page])
|
||||||
end
|
end
|
||||||
|
|
||||||
def edit
|
def edit
|
||||||
@@ -70,4 +71,8 @@ class Admin::AccountsController < Admin::ApplicationController
|
|||||||
@account.videos
|
@account.videos
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def account_broadcasts
|
||||||
|
@account.broadcasts
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
29
app/controllers/admin/broadcasts_controller.rb
Normal file
29
app/controllers/admin/broadcasts_controller.rb
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
class Admin::BroadcastsController < Admin::ApplicationController
|
||||||
|
before_action :set_broadcast, only: [:edit, :update]
|
||||||
|
|
||||||
|
def edit
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
if @broadcast.update(broadcast_update_params)
|
||||||
|
redirect_to [:admin, @broadcast.project.account], notice: t(".notice")
|
||||||
|
else
|
||||||
|
render :edit
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_broadcast
|
||||||
|
@broadcast = authorize policy_scope(Broadcast).find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def broadcast_update_params
|
||||||
|
params.require(:broadcast).permit(
|
||||||
|
:video_conference_url_override,
|
||||||
|
:stream_url_override,
|
||||||
|
:stream_key_override,
|
||||||
|
:director_mode_video_embed
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
36
app/controllers/admin/task_requests_controller.rb
Normal file
36
app/controllers/admin/task_requests_controller.rb
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
class Admin::TaskRequestsController < Admin::ApplicationController
|
||||||
|
before_action :set_task_request, only: [:edit, :update, :show]
|
||||||
|
|
||||||
|
def index
|
||||||
|
@task_requests = task_requests.order_by_recent.paginate(page: params[:page])
|
||||||
|
end
|
||||||
|
|
||||||
|
def edit
|
||||||
|
end
|
||||||
|
|
||||||
|
def show
|
||||||
|
@files = @task_request.files.paginate(page: params[:page])
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
if @task_request.update(task_request_params)
|
||||||
|
redirect_to [:admin, :task_requests], notice: t(".notice")
|
||||||
|
else
|
||||||
|
render :edit
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def task_request_params
|
||||||
|
params.require(:task_request).permit(:status, :deliverable_url)
|
||||||
|
end
|
||||||
|
|
||||||
|
def task_requests
|
||||||
|
policy_scope TaskRequest
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_task_request
|
||||||
|
@task_request = authorize policy_scope(TaskRequest).find(params[:id])
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -17,7 +17,9 @@ class Api::ApiController < ActionController::Base
|
|||||||
def return_error(exception)
|
def return_error(exception)
|
||||||
raise exception if Rails.env.test?
|
raise exception if Rails.env.test?
|
||||||
|
|
||||||
logger.error "==Handled======="
|
Raven.capture_exception(exception)
|
||||||
|
|
||||||
|
logger.error "==Handled======"
|
||||||
logger.error exception.message
|
logger.error exception.message
|
||||||
logger.error exception.backtrace.join("\n")
|
logger.error exception.backtrace.join("\n")
|
||||||
logger.error "==Handled======="
|
logger.error "==Handled======="
|
||||||
|
|||||||
@@ -19,5 +19,11 @@ class Api::AppearanceReleasesController < Api::ReleasesController
|
|||||||
guardian_photo[:io] = StringIO.new(Base64.decode64(guardian_photo[:io]))
|
guardian_photo[:io] = StringIO.new(Base64.decode64(guardian_photo[:io]))
|
||||||
release.guardian_photo.attach(io: guardian_photo[:io], filename: guardian_photo[:filename])
|
release.guardian_photo.attach(io: guardian_photo[:io], filename: guardian_photo[:filename])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
guardian_2_photo = release_create_params[:guardian_2_photo]
|
||||||
|
if guardian_2_photo
|
||||||
|
guardian_2_photo[:io] = StringIO.new(Base64.decode64(guardian_2_photo[:io]))
|
||||||
|
release.guardian_2_photo.attach(io: guardian_2_photo[:io], filename: guardian_2_photo[:filename])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -24,8 +24,12 @@ class Api::BroadcastsController < Api::ApiController
|
|||||||
|
|
||||||
def update
|
def update
|
||||||
file_params.each do |file|
|
file_params.each do |file|
|
||||||
file[:io] = StringIO.new(Base64.decode64(file[:io]))
|
if file.is_a?(String)
|
||||||
@broadcast.files.attach(io: file[:io], filename: file[:filename])
|
@broadcast.files.attach(file)
|
||||||
|
else
|
||||||
|
file[:io] = StringIO.new(Base64.decode64(file[:io]))
|
||||||
|
@broadcast.files.attach(file.to_h.symbolize_keys)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@broadcast.save!
|
@broadcast.save!
|
||||||
|
|
||||||
|
|||||||
11
app/controllers/api/medical_releases_controller.rb
Normal file
11
app/controllers/api/medical_releases_controller.rb
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
class Api::MedicalReleasesController < Api::ReleasesController
|
||||||
|
deserializable_resource :medical_release, only: [:create, :update]
|
||||||
|
|
||||||
|
def model_name
|
||||||
|
"medical_release"
|
||||||
|
end
|
||||||
|
|
||||||
|
def attributes_for_index
|
||||||
|
[:name]
|
||||||
|
end
|
||||||
|
end
|
||||||
11
app/controllers/api/misc_releases_controller.rb
Normal file
11
app/controllers/api/misc_releases_controller.rb
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
class Api::MiscReleasesController < Api::ReleasesController
|
||||||
|
deserializable_resource :misc_release, only: [:create, :update]
|
||||||
|
|
||||||
|
def model_name
|
||||||
|
"misc_release"
|
||||||
|
end
|
||||||
|
|
||||||
|
def attributes_for_index
|
||||||
|
[:name]
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -21,7 +21,6 @@ class Api::ReleasesController < Api::ApiController
|
|||||||
release.contract_template_id = @contract_template.id
|
release.contract_template_id = @contract_template.id
|
||||||
handle_attachments(release, release_create_params[:photos])
|
handle_attachments(release, release_create_params[:photos])
|
||||||
release.save!(context: :native)
|
release.save!(context: :native)
|
||||||
log_create_analytics
|
|
||||||
after_create(release)
|
after_create(release)
|
||||||
handle_response(release, :created)
|
handle_response(release, :created)
|
||||||
end
|
end
|
||||||
@@ -103,10 +102,16 @@ class Api::ReleasesController < Api::ApiController
|
|||||||
if ["appearance_release", "talent_release"].include?(name)
|
if ["appearance_release", "talent_release"].include?(name)
|
||||||
has_many :guardian_photos do
|
has_many :guardian_photos do
|
||||||
data do
|
data do
|
||||||
[@object.guardian_photo.try(:attachment)].compact
|
[
|
||||||
|
@object.guardian_photo.try(:attachment),
|
||||||
|
@object.guardian_2_photo.try(:attachment)
|
||||||
|
].compact
|
||||||
end
|
end
|
||||||
meta do
|
meta do
|
||||||
{ count: @object.try(:guardian_photo).try(:attached?) ? 1 : 0 }
|
{ count:
|
||||||
|
(@object.try(:guardian_photo).try(:attached?) ? 1 : 0) +
|
||||||
|
(@object.try(:guardian_2_photo).try(:attached?) ? 1 : 0)
|
||||||
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -170,13 +175,9 @@ class Api::ReleasesController < Api::ApiController
|
|||||||
|
|
||||||
def release_create_params
|
def release_create_params
|
||||||
parameters = params.require(model_name).permit!
|
parameters = params.require(model_name).permit!
|
||||||
keys = model_constant.new.attributes.keys + [:guardian_photo, :person_photo, :photos, :signature, :signature_base64, :file_infos_attributes]
|
keys = model_constant.new.attributes.keys + [:guardian_photo, :guardian_2_photo, :person_photo, :photos, :signature, :signature_base64, :file_infos_attributes]
|
||||||
parameters[:signature_base64] = parameters[:signature]
|
parameters[:signature_base64] = parameters[:signature]
|
||||||
parameters = parameters.slice(*keys).except(:created_at, :updated_at, :id, :user_id, :signature)
|
parameters = parameters.slice(*keys).except(:created_at, :updated_at, :id, :user_id, :signature)
|
||||||
parameters
|
parameters
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_create_analytics
|
|
||||||
TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_native_release, release_type: model_constant.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip, application: :ios)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -10,8 +10,10 @@ class Api::SyncController < Api::ApiController
|
|||||||
@appearance_releases = (AppearanceRelease.where(project: accessible_projects))
|
@appearance_releases = (AppearanceRelease.where(project: accessible_projects))
|
||||||
@location_releases = (LocationRelease.where(project: accessible_projects))
|
@location_releases = (LocationRelease.where(project: accessible_projects))
|
||||||
@material_releases = (MaterialRelease.where(project: accessible_projects))
|
@material_releases = (MaterialRelease.where(project: accessible_projects))
|
||||||
|
@medical_releases = MedicalRelease.where(project: accessible_projects)
|
||||||
|
@misc_releases = MiscRelease.where(project: accessible_projects)
|
||||||
@talent_releases = (TalentRelease.where(project: accessible_projects))
|
@talent_releases = (TalentRelease.where(project: accessible_projects))
|
||||||
@notes = notes_query(Note.where(notable: @appearance_releases + @location_releases + @material_releases + @talent_releases + @acquired_media_releases ))
|
@notes = notes_query(Note.where(notable: @appearance_releases + @location_releases + @material_releases + @medical_releases + @misc_releases + @talent_releases + @acquired_media_releases ))
|
||||||
|
|
||||||
render json: {
|
render json: {
|
||||||
data: {
|
data: {
|
||||||
@@ -22,6 +24,8 @@ class Api::SyncController < Api::ApiController
|
|||||||
appearance_releases: releases_query(@appearance_releases),
|
appearance_releases: releases_query(@appearance_releases),
|
||||||
location_releases: releases_query(@location_releases),
|
location_releases: releases_query(@location_releases),
|
||||||
material_releases: releases_query(@material_releases),
|
material_releases: releases_query(@material_releases),
|
||||||
|
medical_releases: releases_query(@medical_releases),
|
||||||
|
misc_releases: releases_query(@misc_releases),
|
||||||
talent_releases: releases_query(@talent_releases),
|
talent_releases: releases_query(@talent_releases),
|
||||||
notes: @notes
|
notes: @notes
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,5 +17,11 @@ class Api::TalentReleasesController < Api::ReleasesController
|
|||||||
guardian_photo[:io] = StringIO.new(Base64.decode64(guardian_photo[:io]))
|
guardian_photo[:io] = StringIO.new(Base64.decode64(guardian_photo[:io]))
|
||||||
release.guardian_photo.attach(io: guardian_photo[:io], filename: guardian_photo[:filename])
|
release.guardian_photo.attach(io: guardian_photo[:io], filename: guardian_photo[:filename])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
guardian_2_photo = release_create_params[:guardian_2_photo]
|
||||||
|
if guardian_2_photo
|
||||||
|
guardian_2_photo[:io] = StringIO.new(Base64.decode64(guardian_2_photo[:io]))
|
||||||
|
release.guardian_2_photo.attach(io: guardian_2_photo[:io], filename: guardian_2_photo[:filename])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,14 +1,24 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require './lib/knock_monkeypatch'
|
||||||
|
|
||||||
class Api::UserTokenController < Knock::AuthTokenController
|
class Api::UserTokenController < Knock::AuthTokenController
|
||||||
|
include Oath::ControllerHelpers
|
||||||
|
include RememberMe::Controller
|
||||||
|
|
||||||
skip_before_action :verify_authenticity_token
|
skip_before_action :verify_authenticity_token
|
||||||
|
before_action :sign_in_user
|
||||||
|
|
||||||
rescue_from Exception, :with => :return_error
|
rescue_from Exception, :with => :return_error
|
||||||
|
|
||||||
# Catch exception and return JSON-formatted error
|
# Catch exception and return JSON-formatted error
|
||||||
def return_error(exception)
|
def return_error(exception)
|
||||||
|
Raven.capture_exception(exception)
|
||||||
|
|
||||||
logger.error "==Handled======="
|
logger.error "==Handled======="
|
||||||
logger.error exception.message
|
logger.error exception.message
|
||||||
logger.error exception.backtrace.join("\n")
|
logger.error exception.backtrace.join("\n")
|
||||||
logger.error "==Handled======="
|
logger.error "==Handled======="
|
||||||
case exception
|
case exception
|
||||||
when ActiveRecord::RecordNotFound
|
when ActiveRecord::RecordNotFound
|
||||||
@status = 404
|
@status = 404
|
||||||
@@ -25,12 +35,18 @@ class Api::UserTokenController < Knock::AuthTokenController
|
|||||||
end
|
end
|
||||||
|
|
||||||
# for some reason render json_errors is not working
|
# for some reason render json_errors is not working
|
||||||
# simulating JSON API support
|
# simulating JSON API support
|
||||||
render json: {
|
render json: {
|
||||||
errors: [{
|
errors: [{
|
||||||
status: @status.to_s,
|
status: @status.to_s,
|
||||||
title: @message
|
title: @message
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def sign_in_user
|
||||||
|
sign_in(entity)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
33
app/controllers/api/users_controller.rb
Normal file
33
app/controllers/api/users_controller.rb
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Api::UsersController < Api::ApiController
|
||||||
|
skip_before_action :authenticate_user
|
||||||
|
before_action :verify_custom_token, only: :create
|
||||||
|
|
||||||
|
def create
|
||||||
|
if user_params[:email].nil? || user_params[:password].nil?
|
||||||
|
raise ActionController::ParameterMissing.new 'Missing email or password'
|
||||||
|
end
|
||||||
|
|
||||||
|
user = Oath::Services::SignUp.new(user_params).perform
|
||||||
|
render json: user.slice(:email, :created_at, :first_name, :last_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def user_params
|
||||||
|
params.require(:user).permit(%i[
|
||||||
|
email
|
||||||
|
password
|
||||||
|
first_name
|
||||||
|
last_name
|
||||||
|
])
|
||||||
|
end
|
||||||
|
|
||||||
|
def verify_custom_token
|
||||||
|
if token.blank? || token != ENV['CUSTOM_API_TOKEN']
|
||||||
|
unauthorized_entity(:user)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -18,7 +18,6 @@ class AppearanceReleasesController < ApplicationController
|
|||||||
@appearance_release = build_appearance_release(appearance_release_params)
|
@appearance_release = build_appearance_release(appearance_release_params)
|
||||||
|
|
||||||
if @appearance_release.save(context: :non_native)
|
if @appearance_release.save(context: :non_native)
|
||||||
log_create_analytics
|
|
||||||
AddHeadshotCollectionUidToProjectJob.perform_later(@project)
|
AddHeadshotCollectionUidToProjectJob.perform_later(@project)
|
||||||
SetTagsForReleasableJob.perform_later(@appearance_release)
|
SetTagsForReleasableJob.perform_later(@appearance_release)
|
||||||
redirect_to [@project, :appearance_releases], notice: "The release has been imported. #{link_to_import_another}"
|
redirect_to [@project, :appearance_releases], notice: "The release has been imported. #{link_to_import_another}"
|
||||||
@@ -77,9 +76,43 @@ class AppearanceReleasesController < ApplicationController
|
|||||||
results
|
results
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def person_params
|
||||||
|
%i[
|
||||||
|
person_first_name
|
||||||
|
person_last_name
|
||||||
|
person_phone
|
||||||
|
person_email
|
||||||
|
person_photo
|
||||||
|
person_address_street1
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_first_name
|
||||||
|
guardian_last_name
|
||||||
|
guardian_phone
|
||||||
|
guardian_email
|
||||||
|
guardian_photo
|
||||||
|
guardian_address_street1
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def second_guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_2_first_name
|
||||||
|
guardian_2_last_name
|
||||||
|
guardian_2_phone
|
||||||
|
guardian_2_email
|
||||||
|
guardian_2_photo
|
||||||
|
guardian_2_address_street1
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
def appearance_release_params
|
def appearance_release_params
|
||||||
params.require(:appearance_release).permit(:contract, :guardian_address, :guardian_first_name, :guardian_last_name, :guardian_phone, :guardian_photo, :guardian_email, :minor,
|
params.require(:appearance_release).permit(person_params,
|
||||||
:person_address, :person_first_name, :person_last_name, :person_phone, :person_email, :person_photo,
|
guardian_params, second_guardian_params,
|
||||||
|
:contract, :minor,
|
||||||
:applicable_medium_id, :applicable_medium_text,
|
:applicable_medium_id, :applicable_medium_text,
|
||||||
:territory_id, :territory_text,
|
:territory_id, :territory_text,
|
||||||
:term_id, :term_text, :person_date_of_birth,
|
:term_id, :term_text, :person_date_of_birth,
|
||||||
@@ -93,8 +126,4 @@ class AppearanceReleasesController < ApplicationController
|
|||||||
def link_to_import_another
|
def link_to_import_another
|
||||||
view_context.link_to "Import Another", [:new, @project, :appearance_release]
|
view_context.link_to "Import Another", [:new, @project, :appearance_release]
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_create_analytics
|
|
||||||
TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_non_native_release, release_type: AppearanceRelease.to_s, user_agent: request.user_agent, user_ip: request.remote_ip)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
48
app/controllers/approvals_controller.rb
Normal file
48
app/controllers/approvals_controller.rb
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
class ApprovalsController < ApplicationController
|
||||||
|
before_action :set_releasable
|
||||||
|
before_action :set_project
|
||||||
|
|
||||||
|
layout "project"
|
||||||
|
|
||||||
|
def create
|
||||||
|
@releasable.approve_by(current_user)
|
||||||
|
@releasable.approved_by_user_signature.attach(approved_by_user_signature_params) if signature_data.present?
|
||||||
|
|
||||||
|
if @releasable.save(context: :approval)
|
||||||
|
redirect_to [@project, "#{@releasable_param.name.pluralize}"], notice: t('.release_approved', release_type: @releasable.model_name.human)
|
||||||
|
else
|
||||||
|
render :new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def releasable_param
|
||||||
|
@releasable_param ||= ReleasableParam.new(params.to_unsafe_h)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_releasable
|
||||||
|
@releasable = authorize policy_scope(releasable_param.type).find(releasable_param.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_project
|
||||||
|
@project = @releasable.project
|
||||||
|
end
|
||||||
|
|
||||||
|
def releasable_params
|
||||||
|
params.require(releasable_param.name).permit(approved_by_user_signature: :data)
|
||||||
|
end
|
||||||
|
|
||||||
|
def signature_data
|
||||||
|
releasable_params.dig(:approved_by_user_signature, :data)
|
||||||
|
end
|
||||||
|
|
||||||
|
def approved_by_user_signature_params
|
||||||
|
{
|
||||||
|
data: signature_data,
|
||||||
|
filename: "approved_by_user_signature.png",
|
||||||
|
content_type: "image/png",
|
||||||
|
identify: false,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
34
app/controllers/broadcast_recording_starrings_controller.rb
Normal file
34
app/controllers/broadcast_recording_starrings_controller.rb
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
class BroadcastRecordingStarringsController < ApplicationController
|
||||||
|
layout "project"
|
||||||
|
|
||||||
|
before_action :set_project
|
||||||
|
before_action :set_broadcast
|
||||||
|
before_action :set_recording
|
||||||
|
|
||||||
|
def create
|
||||||
|
@recording.toggle_star
|
||||||
|
set_recordings
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def broadcast_recording_params
|
||||||
|
params.require(:broadcast_recording).permit(:name, :description)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_project
|
||||||
|
@project = policy_scope(Project).find(params[:project_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_broadcast
|
||||||
|
@broadcast = authorize policy_scope(@project.broadcasts).find(params[:broadcast_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_recording
|
||||||
|
@recording = authorize policy_scope(@broadcast.broadcast_recordings).find(params[:broadcast_recording_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_recordings
|
||||||
|
@recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page])
|
||||||
|
end
|
||||||
|
end
|
||||||
42
app/controllers/broadcast_recordings_controller.rb
Normal file
42
app/controllers/broadcast_recordings_controller.rb
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
class BroadcastRecordingsController < ApplicationController
|
||||||
|
layout "project"
|
||||||
|
|
||||||
|
before_action :set_project
|
||||||
|
before_action :set_broadcast
|
||||||
|
before_action :set_recording
|
||||||
|
|
||||||
|
def edit
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
@recording.update(broadcast_recording_params)
|
||||||
|
set_recordings
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
@recording.update(hidden: true)
|
||||||
|
set_recordings
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def broadcast_recording_params
|
||||||
|
params.require(:broadcast_recording).permit(:name, :description)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_project
|
||||||
|
@project = policy_scope(Project).find(params[:project_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_broadcast
|
||||||
|
@broadcast = authorize policy_scope(@project.broadcasts).find(params[:broadcast_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_recording
|
||||||
|
@recording = authorize policy_scope(@broadcast.broadcast_recordings).find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_recordings
|
||||||
|
@recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page])
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -3,8 +3,9 @@ class BroadcastsController < ApplicationController
|
|||||||
|
|
||||||
before_action :set_project
|
before_action :set_project
|
||||||
before_action :build_broadcast, only: [:new, :create]
|
before_action :build_broadcast, only: [:new, :create]
|
||||||
before_action :set_broadcast, only: [:show, :destroy, :update]
|
before_action :set_broadcast, only: [:show, :destroy, :update, :destroy_file]
|
||||||
before_action :set_multi_view_broadcasts, only: [:show]
|
before_action :set_multi_view_broadcasts, only: [:show]
|
||||||
|
before_action :show_splash_screen, only: :index
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@broadcasts = filtered_broadcasts.order_by_recent.paginate(page: params[:page])
|
@broadcasts = filtered_broadcasts.order_by_recent.paginate(page: params[:page])
|
||||||
@@ -22,21 +23,27 @@ class BroadcastsController < ApplicationController
|
|||||||
else
|
else
|
||||||
render :new
|
render :new
|
||||||
end
|
end
|
||||||
|
rescue MuxRuby::ApiError, ActiveResource::ConnectionError => e
|
||||||
|
Raven.capture_exception(e)
|
||||||
|
redirect_to [@project, :broadcasts], alert: t(".alert")
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@conference_url = url_for [@broadcast.project, @broadcast, :zoom_meeting]
|
@conference_url = conference_url_for(@broadcast)
|
||||||
@recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page])
|
@recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page])
|
||||||
@files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page])
|
@files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page])
|
||||||
|
|
||||||
render layout: 'application'
|
render layout: 'application'
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
@broadcast.update(broadcast_params)
|
unless params.has_key?(:broadcast)
|
||||||
@files = @broadcast.files.order("created_at DESC").paginate(page: 1)
|
@broadcast.regenerate_token
|
||||||
|
redirect_to([@project, @broadcast], notice: t('.reset_notice')) and return
|
||||||
|
end
|
||||||
|
|
||||||
pagination_content = ApplicationController.render html: helpers.will_paginate(@files, params: { active_tab: params[:active_tab], page: params[:page], active_files_tab: params[:active_files_tab] })
|
@broadcast.update(broadcast_params)
|
||||||
BroadcastsChannel.broadcast_file_upload_updates(@broadcast, @files, pagination_content)
|
update_files_section
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
@@ -47,10 +54,29 @@ class BroadcastsController < ApplicationController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def destroy_file
|
||||||
|
authorize Broadcast
|
||||||
|
file = ActiveStorage::Attachment.find(params[:file_id])
|
||||||
|
file.destroy
|
||||||
|
|
||||||
|
update_files_section
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def update_files_section
|
||||||
|
@files = @broadcast.files.order("created_at DESC").paginate(page: 1)
|
||||||
|
|
||||||
|
pagination_content = ApplicationController.render html: helpers.will_paginate(@files, params: { active_tab: params[:active_tab], page: params[:page], active_files_tab: params[:active_files_tab] })
|
||||||
|
BroadcastsChannel.broadcast_file_upload_updates(@broadcast, @files, pagination_content)
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_splash_screen
|
||||||
|
render :splash if broadcasts.count.zero?
|
||||||
|
end
|
||||||
|
|
||||||
def broadcast_params
|
def broadcast_params
|
||||||
params.require(:broadcast).permit(:name, files: [])
|
params.require(:broadcast).permit(:name, :shoot_location_time_zone, files: [])
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_project
|
def set_project
|
||||||
@@ -87,6 +113,10 @@ class BroadcastsController < ApplicationController
|
|||||||
results
|
results
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def conference_url_for(broadcast)
|
||||||
|
broadcast.video_conference_url_override.presence || url_for([broadcast.project, broadcast, :zoom_meeting])
|
||||||
|
end
|
||||||
|
|
||||||
def log_create_analytics
|
def log_create_analytics
|
||||||
TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_live_stream, user_agent: request.user_agent, user_ip: request.remote_ip)
|
TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_live_stream, user_agent: request.user_agent, user_ip: request.remote_ip)
|
||||||
end
|
end
|
||||||
|
|||||||
13
app/controllers/concerns/misc_release_context.rb
Normal file
13
app/controllers/concerns/misc_release_context.rb
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
module MiscReleaseContext
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
def misc_releases
|
||||||
|
policy_scope(MiscRelease)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_misc_release
|
||||||
|
misc_release_id = params[:misc_release_id] || params[:id]
|
||||||
|
|
||||||
|
@misc_release = authorize misc_releases.find(misc_release_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -7,28 +7,41 @@ class ContractDownloadsController < ApplicationController
|
|||||||
|
|
||||||
def create
|
def create
|
||||||
authorize policy_scope(Download).create
|
authorize policy_scope(Download).create
|
||||||
fetch_releases
|
|
||||||
|
download = @project.downloads.create!(release_type: release_type)
|
||||||
download = @project.downloads.create!(release_type: params[:release_type])
|
|
||||||
other_downloads_in_progress = @project.downloads.unfinished_desc_order.offset(1)
|
other_downloads_in_progress = @project.downloads.unfinished_desc_order.offset(1)
|
||||||
|
|
||||||
if other_downloads_in_progress.any?
|
if other_downloads_in_progress.any?
|
||||||
in_progress_downloads_details = render_to_string "_other_pending_downloads", locals: { downloads: other_downloads_in_progress, release_type: params[:release_type] }, :layout => false
|
in_progress_downloads_details = render_to_string "_other_pending_downloads", locals: { downloads: other_downloads_in_progress, release_type: release_type }, :layout => false
|
||||||
ProjectsChannel.broadcast_download_generation_update(download, in_progress_downloads_details)
|
ProjectsChannel.broadcast_download_generation_update(download, in_progress_downloads_details)
|
||||||
else
|
else
|
||||||
ProjectsChannel.broadcast_download_generation_update(download, I18n.t("contract_downloads.download.pending", release_type: params[:release_type].titleize))
|
ProjectsChannel.broadcast_download_generation_update(download, I18n.t("contract_downloads.download.pending", release_type: release_type.titleize))
|
||||||
end
|
end
|
||||||
|
|
||||||
GenerateContractsZipJob.perform_later(@project, download, params[:release_type], @releases.ids)
|
GenerateContractsZipJob.perform_later(@project, download, release_type, release_ids, search_query, type_filter)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def fetch_releases
|
def release_type
|
||||||
@releases = policy_scope(@project.public_send(releases))
|
params[:release_type]
|
||||||
end
|
end
|
||||||
|
|
||||||
def releases
|
def search_query
|
||||||
params[:release_type].constantize.model_name.plural
|
params[:search_query]
|
||||||
|
end
|
||||||
|
|
||||||
|
def type_filter
|
||||||
|
params[:type_filter]
|
||||||
|
end
|
||||||
|
|
||||||
|
def release_ids
|
||||||
|
JSON.parse(params[:release_ids])
|
||||||
|
rescue StandardError
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
|
||||||
|
def release_name(release_type)
|
||||||
|
release_type.constantize.model_name.plural
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
33
app/controllers/contract_templates/duplicates_controller.rb
Normal file
33
app/controllers/contract_templates/duplicates_controller.rb
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class ContractTemplates::DuplicatesController < ApplicationController
|
||||||
|
before_action :set_contract_template
|
||||||
|
|
||||||
|
def create
|
||||||
|
authorize(ContractTemplate)
|
||||||
|
new_contract_template = @contract_template.dup
|
||||||
|
new_contract_template.name = I18n.t('contract_templates.duplicate.name_prefix', template_name: @contract_template.name)
|
||||||
|
|
||||||
|
# Duplicate rich text fields
|
||||||
|
|
||||||
|
new_contract_template.body = @contract_template.body
|
||||||
|
new_contract_template.guardian_clause = @contract_template.guardian_clause
|
||||||
|
new_contract_template.signature_legal_text = @contract_template.signature_legal_text
|
||||||
|
|
||||||
|
if new_contract_template.save
|
||||||
|
redirect_to [:edit, new_contract_template]
|
||||||
|
else
|
||||||
|
redirect_to [@contract_template.project, :contract_templates], alert: t('.error')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def contract_templates
|
||||||
|
policy_scope(ContractTemplate)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_contract_template
|
||||||
|
@contract_template = contract_templates.find(params[:contract_template_id])
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -16,7 +16,12 @@ class ContractTemplates::QrCodesController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def qr_code
|
def qr_code
|
||||||
authorize QrCode.build_from_contract_template(@contract_template)
|
if params[:multi_sign_ids].present?
|
||||||
|
contract_templates_group = authorize contract_templates.where(id: params[:multi_sign_ids]).order_by_recent
|
||||||
|
authorize QrCode.build_from_multiple_contract_templates(contract_templates_group, @contract_template.project)
|
||||||
|
else
|
||||||
|
authorize QrCode.build_from_contract_template(@contract_template)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def download_attributes
|
def download_attributes
|
||||||
|
|||||||
@@ -5,8 +5,10 @@ class ContractTemplatesController < ApplicationController
|
|||||||
|
|
||||||
layout 'project'
|
layout 'project'
|
||||||
|
|
||||||
before_action :set_project, except: [:destroy]
|
before_action :set_project, except: [:destroy, :edit, :update]
|
||||||
before_action :set_contract_template, only: [:destroy]
|
before_action :set_contract_template, only: [:destroy, :edit, :update]
|
||||||
|
before_action :set_project_from_contract_template, only: [:edit, :update]
|
||||||
|
before_action :show_splash_screen, only: :index
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@contract_templates = contract_templates.non_archived.order_by_name.paginate(page: params[:page])
|
@contract_templates = contract_templates.non_archived.order_by_name.paginate(page: params[:page])
|
||||||
@@ -24,6 +26,7 @@ class ContractTemplatesController < ApplicationController
|
|||||||
contract = Contract.new releasable_instance, true
|
contract = Contract.new releasable_instance, true
|
||||||
send_file contract.to_pdf, download_attributes
|
send_file contract.to_pdf, download_attributes
|
||||||
elsif @contract_template.save
|
elsif @contract_template.save
|
||||||
|
log_create_analytics
|
||||||
redirect_to [@project, :contract_templates], notice: t('.notice')
|
redirect_to [@project, :contract_templates], notice: t('.notice')
|
||||||
else
|
else
|
||||||
@release_type = contract_template_params[:release_type]
|
@release_type = contract_template_params[:release_type]
|
||||||
@@ -31,6 +34,20 @@ class ContractTemplatesController < ApplicationController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def edit
|
||||||
|
@release_type = @contract_template.release_type
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
@contract_template.attributes = contract_template_params
|
||||||
|
|
||||||
|
if @contract_template.save
|
||||||
|
redirect_to [@project, :contract_templates], notice: t('.notice')
|
||||||
|
else
|
||||||
|
render :edit
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
@contract_template.archive
|
@contract_template.archive
|
||||||
redirect_to [@contract_template.project, :contract_templates], alert: t('.archived_notice')
|
redirect_to [@contract_template.project, :contract_templates], alert: t('.archived_notice')
|
||||||
@@ -38,6 +55,14 @@ class ContractTemplatesController < ApplicationController
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def set_project_from_contract_template
|
||||||
|
@project = @contract_template.project
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_splash_screen
|
||||||
|
render :splash if contract_templates.non_archived.count.zero?
|
||||||
|
end
|
||||||
|
|
||||||
def set_contract_template
|
def set_contract_template
|
||||||
@contract_template = authorize contract_templates.find(params[:id])
|
@contract_template = authorize contract_templates.find(params[:id])
|
||||||
end
|
end
|
||||||
@@ -57,16 +82,22 @@ class ContractTemplatesController < ApplicationController
|
|||||||
def contract_template_params
|
def contract_template_params
|
||||||
params
|
params
|
||||||
.require(:contract_template)
|
.require(:contract_template)
|
||||||
.permit(:name, :release_type, :body, :guardian_clause, :fee,
|
.permit(:name, :release_type, :body, :guardian_clause,
|
||||||
|
:signature_legal_text, :fee, :amendment_clause,
|
||||||
:applicable_medium_id, :applicable_medium_text,
|
:applicable_medium_id, :applicable_medium_text,
|
||||||
:territory_id, :territory_text,
|
:territory_id, :territory_text,
|
||||||
:term_id, :term_text,
|
:term_id, :term_text, :accessibility,
|
||||||
:restriction_id, :restriction_text,
|
:restriction_id, :restriction_text,
|
||||||
:question_1_text, :question_2_text,
|
:question_1_text, :question_2_text,
|
||||||
:question_3_text, :question_4_text,
|
:question_3_text, :question_4_text,
|
||||||
:question_5_text, :question_6_text,
|
:question_5_text, :question_6_text,
|
||||||
:question_7_text, :question_8_text,
|
:question_7_text, :question_8_text,
|
||||||
:question_9_text, :question_10_text)
|
:question_9_text, :question_10_text,
|
||||||
|
:question_11_text, :question_12_text,
|
||||||
|
:question_13_text, :question_14_text,
|
||||||
|
:question_15_text, :questionnaire_legal_text,
|
||||||
|
:exhibit_a_legal_text, :exhibit_a_question_text,
|
||||||
|
:exhibit_b_legal_text, :exhibit_b_question_text)
|
||||||
end
|
end
|
||||||
|
|
||||||
def download_attributes
|
def download_attributes
|
||||||
@@ -76,4 +107,8 @@ class ContractTemplatesController < ApplicationController
|
|||||||
type: 'application/pdf'
|
type: 'application/pdf'
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def log_create_analytics
|
||||||
|
TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_contract_template, user_agent: request.user_agent, user_ip: request.remote_ip)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -48,8 +48,10 @@ class ContractsController < ApplicationController
|
|||||||
# Native release contracts must be generated on-the-fly; non-native releases have a contract attachment
|
# Native release contracts must be generated on-the-fly; non-native releases have a contract attachment
|
||||||
if releasable.native?
|
if releasable.native?
|
||||||
send_file contract.to_pdf, download_attributes
|
send_file contract.to_pdf, download_attributes
|
||||||
else
|
elsif policy(contract).show?
|
||||||
redirect_to releasable.contract.service_url
|
redirect_to releasable.contract.service_url
|
||||||
|
else
|
||||||
|
raise Pundit::NotAuthorizedError
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
class FileInfosController < ApplicationController
|
class FilesController < ApplicationController
|
||||||
before_action :set_releasable
|
before_action :set_releasable
|
||||||
|
|
||||||
layout "project"
|
layout "project"
|
||||||
@@ -16,7 +16,7 @@ class FileInfosController < ApplicationController
|
|||||||
|
|
||||||
if @releasable.update(releasable_params)
|
if @releasable.update(releasable_params)
|
||||||
SetTagsForReleasableJob.perform_later(@releasable)
|
SetTagsForReleasableJob.perform_later(@releasable)
|
||||||
redirect_to [@project, @releasable.model_name.plural], notice: t(".notice")
|
redirect_to [@project, @releasable.model_name.plural], notice: "Files added successfully to the release."
|
||||||
else
|
else
|
||||||
render :edit
|
render :edit
|
||||||
end
|
end
|
||||||
@@ -29,16 +29,10 @@ class FileInfosController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def set_releasable
|
def set_releasable
|
||||||
@releasable = authorize policy_scope(releasable_param.type).find(releasable_param.id), :"#{action_name}_file_infos?"
|
@releasable = authorize policy_scope(releasable_param.type).find(releasable_param.id), :edit_files?
|
||||||
end
|
end
|
||||||
|
|
||||||
def releasable_params
|
def releasable_params
|
||||||
params.fetch(releasable_param.name, {}).permit(
|
params.fetch(releasable_param.name, {}).permit(files: [])
|
||||||
file_infos_attributes: [
|
|
||||||
:filename,
|
|
||||||
:content_type,
|
|
||||||
:byte_size
|
|
||||||
],
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -18,7 +18,6 @@ class LocationReleasesController < ApplicationController
|
|||||||
@location_release = build_location_release(location_release_params)
|
@location_release = build_location_release(location_release_params)
|
||||||
|
|
||||||
if @location_release.save
|
if @location_release.save
|
||||||
log_create_analytics
|
|
||||||
SetTagsForReleasableJob.perform_later(@location_release)
|
SetTagsForReleasableJob.perform_later(@location_release)
|
||||||
redirect_to [@project, :location_releases], notice: t(".notice")
|
redirect_to [@project, :location_releases], notice: t(".notice")
|
||||||
else
|
else
|
||||||
@@ -90,8 +89,4 @@ class LocationReleasesController < ApplicationController
|
|||||||
|
|
||||||
results
|
results
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_create_analytics
|
|
||||||
TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_non_native_release, release_type: LocationRelease.to_s, user_agent: request.user_agent, user_ip: request.remote_ip)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ class MaterialReleasesController < ApplicationController
|
|||||||
@material_release = build_material_release(material_release_params)
|
@material_release = build_material_release(material_release_params)
|
||||||
|
|
||||||
if @material_release.save
|
if @material_release.save
|
||||||
log_create_analytics
|
|
||||||
SetTagsForReleasableJob.perform_later(@material_release)
|
SetTagsForReleasableJob.perform_later(@material_release)
|
||||||
redirect_to [@project, :material_releases], notice: t(".notice")
|
redirect_to [@project, :material_releases], notice: t(".notice")
|
||||||
else
|
else
|
||||||
@@ -50,17 +49,64 @@ class MaterialReleasesController < ApplicationController
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def person_params
|
||||||
|
%i[
|
||||||
|
person_first_name
|
||||||
|
person_last_name
|
||||||
|
person_phone
|
||||||
|
person_company
|
||||||
|
person_email
|
||||||
|
person_title
|
||||||
|
person_address_street1
|
||||||
|
person_address_street2
|
||||||
|
person_address_city
|
||||||
|
person_address_state
|
||||||
|
person_address_zip
|
||||||
|
person_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_first_name
|
||||||
|
guardian_last_name
|
||||||
|
guardian_phone
|
||||||
|
guardian_email
|
||||||
|
guardian_photo
|
||||||
|
guardian_address_street1
|
||||||
|
guardian_address_street2
|
||||||
|
guardian_address_city
|
||||||
|
guardian_address_state
|
||||||
|
guardian_address_zip
|
||||||
|
guardian_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def second_guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_2_first_name
|
||||||
|
guardian_2_last_name
|
||||||
|
guardian_2_phone
|
||||||
|
guardian_2_email
|
||||||
|
guardian_2_photo
|
||||||
|
guardian_2_address_street1
|
||||||
|
guardian_2_address_street2
|
||||||
|
guardian_2_address_city
|
||||||
|
guardian_2_address_state
|
||||||
|
guardian_2_address_zip
|
||||||
|
guardian_2_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
def material_release_params
|
def material_release_params
|
||||||
params.require(:material_release).permit(
|
params.require(:material_release).permit(person_params, guardian_params, second_guardian_params, :minor,
|
||||||
:name, :address_street1, :address_street2, :address_city, :address_state, :address_zip, :address_country,
|
:name, :address_street1, :address_street2, :address_city, :address_state, :address_zip, :address_country,
|
||||||
:person_first_name, :person_last_name, :person_title, :person_company, :person_phone, :person_email,
|
|
||||||
:person_address_street1, :person_address_street2, :person_address_city, :person_address_state, :person_address_zip, :person_address_country,
|
|
||||||
:applicable_medium_id, :applicable_medium_text,
|
:applicable_medium_id, :applicable_medium_text,
|
||||||
:territory_id, :territory_text,
|
:territory_id, :territory_text,
|
||||||
:term_id, :term_text,
|
:term_id, :term_text,
|
||||||
:restriction_id, :restriction_text,
|
:restriction_id, :restriction_text,
|
||||||
:description,
|
:description,
|
||||||
:contract, { photos: [] }
|
:contract, files: []
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -89,8 +135,4 @@ class MaterialReleasesController < ApplicationController
|
|||||||
|
|
||||||
results
|
results
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_create_analytics
|
|
||||||
TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_non_native_release, release_type: MaterialRelease.to_s, user_agent: request.user_agent, user_ip: request.remote_ip)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
40
app/controllers/misc_releases_controller.rb
Normal file
40
app/controllers/misc_releases_controller.rb
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
class MiscReleasesController < ApplicationController
|
||||||
|
include ProjectContext, MiscReleaseContext
|
||||||
|
|
||||||
|
before_action :set_project, only: [:index]
|
||||||
|
before_action :set_misc_release, only: [:destroy]
|
||||||
|
|
||||||
|
include ProjectLayout
|
||||||
|
|
||||||
|
def index
|
||||||
|
@misc_releases = filtered_misc_releases.order_by_recent.paginate(page: params[:page])
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
@project = @misc_release.project
|
||||||
|
|
||||||
|
if @misc_release.destroy
|
||||||
|
redirect_to [@project, :misc_releases], alert: t(".alert")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def misc_releases
|
||||||
|
if @project
|
||||||
|
policy_scope(@project.misc_releases)
|
||||||
|
else
|
||||||
|
policy_scope(MiscRelease)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def filtered_misc_releases
|
||||||
|
results = misc_releases
|
||||||
|
|
||||||
|
if params[:query].present?
|
||||||
|
results = results.search(params[:query])
|
||||||
|
end
|
||||||
|
|
||||||
|
results
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -22,7 +22,6 @@ class MusicReleasesController < ApplicationController
|
|||||||
@music_release = build_music_release(music_release_params)
|
@music_release = build_music_release(music_release_params)
|
||||||
|
|
||||||
if @music_release.save
|
if @music_release.save
|
||||||
log_create_analytics
|
|
||||||
SetTagsForReleasableJob.perform_later(@music_release)
|
SetTagsForReleasableJob.perform_later(@music_release)
|
||||||
redirect_to [@project, :music_releases], notice: t(".notice")
|
redirect_to [@project, :music_releases], notice: t(".notice")
|
||||||
else
|
else
|
||||||
@@ -111,8 +110,4 @@ class MusicReleasesController < ApplicationController
|
|||||||
|
|
||||||
results
|
results
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_create_analytics
|
|
||||||
TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_non_native_release, release_type: MusicRelease.to_s, user_agent: request.user_agent, user_ip: request.remote_ip)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ class ProjectsController < ApplicationController
|
|||||||
before_action :set_project, only: [:show, :edit, :update, :destroy]
|
before_action :set_project, only: [:show, :edit, :update, :destroy]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@projects = policy_scope(Current.account.projects).order_by_name
|
@projects = filtered_projects.order_by_name
|
||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@@ -46,6 +46,20 @@ class ProjectsController < ApplicationController
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def filtered_projects
|
||||||
|
results = projects
|
||||||
|
|
||||||
|
if params[:query].present?
|
||||||
|
results = results.search(params[:query])
|
||||||
|
end
|
||||||
|
|
||||||
|
results
|
||||||
|
end
|
||||||
|
|
||||||
|
def projects
|
||||||
|
authorize policy_scope(Current.account.projects)
|
||||||
|
end
|
||||||
|
|
||||||
def set_project
|
def set_project
|
||||||
@project = authorize projects.find(params[:id])
|
@project = authorize projects.find(params[:id])
|
||||||
end
|
end
|
||||||
@@ -60,7 +74,7 @@ class ProjectsController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def features_settings_params
|
def features_settings_params
|
||||||
%i(appearance_release location_release material_release acquired_media_release music_release talent_release medical_release video_analysis)
|
%i(appearance_release location_release material_release acquired_media_release music_release talent_release medical_release misc_release video_analysis)
|
||||||
end
|
end
|
||||||
|
|
||||||
def project_params_with_current_account
|
def project_params_with_current_account
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ class Public::AcquiredMediaReleasesController < Public::BaseController
|
|||||||
@acquired_media_release = build_acquired_media_release(acquired_media_release_params_with_locale_and_contract_template)
|
@acquired_media_release = build_acquired_media_release(acquired_media_release_params_with_locale_and_contract_template)
|
||||||
|
|
||||||
if @acquired_media_release.save(context: :native)
|
if @acquired_media_release.save(context: :native)
|
||||||
log_create_analytics
|
|
||||||
after_create(@acquired_media_release)
|
after_create(@acquired_media_release)
|
||||||
else
|
else
|
||||||
render :new
|
render :new
|
||||||
@@ -41,31 +40,67 @@ class Public::AcquiredMediaReleasesController < Public::BaseController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def person_params
|
||||||
|
%i[
|
||||||
|
person_first_name
|
||||||
|
person_last_name
|
||||||
|
person_phone
|
||||||
|
person_fax
|
||||||
|
person_email
|
||||||
|
person_title
|
||||||
|
person_address_street1
|
||||||
|
person_address_street2
|
||||||
|
person_address_city
|
||||||
|
person_address_state
|
||||||
|
person_address_zip
|
||||||
|
person_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_first_name
|
||||||
|
guardian_last_name
|
||||||
|
guardian_phone
|
||||||
|
guardian_email
|
||||||
|
guardian_photo
|
||||||
|
guardian_address_street1
|
||||||
|
guardian_address_street2
|
||||||
|
guardian_address_city
|
||||||
|
guardian_address_state
|
||||||
|
guardian_address_zip
|
||||||
|
guardian_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def second_guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_2_first_name
|
||||||
|
guardian_2_last_name
|
||||||
|
guardian_2_phone
|
||||||
|
guardian_2_email
|
||||||
|
guardian_2_photo
|
||||||
|
guardian_2_address_street1
|
||||||
|
guardian_2_address_street2
|
||||||
|
guardian_2_address_city
|
||||||
|
guardian_2_address_state
|
||||||
|
guardian_2_address_zip
|
||||||
|
guardian_2_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
def acquired_media_release_params
|
def acquired_media_release_params
|
||||||
params.require(:acquired_media_release).permit(
|
params.require(:acquired_media_release).permit(person_params,
|
||||||
:name,
|
guardian_params,
|
||||||
:description,
|
second_guardian_params,
|
||||||
:person_first_name,
|
:minor,
|
||||||
:person_last_name,
|
:name,
|
||||||
:person_email,
|
:description,
|
||||||
:person_title,
|
:signature_base64,
|
||||||
:person_phone,
|
:locale, :contract_template,
|
||||||
:person_fax,
|
categories: [],
|
||||||
:person_address_street1,
|
files: []
|
||||||
:person_address_street2,
|
)
|
||||||
:person_address_city,
|
|
||||||
:person_address_state,
|
|
||||||
:person_address_zip,
|
|
||||||
:person_address_country,
|
|
||||||
:signature_base64,
|
|
||||||
:locale, :contract_template,
|
|
||||||
categories: [],
|
|
||||||
file_infos_attributes: [
|
|
||||||
:filename,
|
|
||||||
:content_type,
|
|
||||||
:byte_size
|
|
||||||
]
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def acquired_media_release_params_with_locale
|
def acquired_media_release_params_with_locale
|
||||||
@@ -75,8 +110,4 @@ class Public::AcquiredMediaReleasesController < Public::BaseController
|
|||||||
def acquired_media_release_params_with_locale_and_contract_template
|
def acquired_media_release_params_with_locale_and_contract_template
|
||||||
acquired_media_release_params_with_locale.merge(contract_template: @contract_template)
|
acquired_media_release_params_with_locale.merge(contract_template: @contract_template)
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_create_analytics
|
|
||||||
TrackAnalyticsJob.perform_later(nil, nil, :track_create_native_release, release_type: AcquiredMediaRelease.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
47
app/controllers/public/amendments_controller.rb
Normal file
47
app/controllers/public/amendments_controller.rb
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
class Public::AmendmentsController < Public::BaseController
|
||||||
|
skip_after_action :verify_authorized, :verify_policy_scoped
|
||||||
|
before_action :set_account, :set_project, :set_contract_template, :set_release
|
||||||
|
|
||||||
|
def new
|
||||||
|
if @release.amendment_signed?
|
||||||
|
render :create, locals: { already_signed: true }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
if @release.amendment_signed?
|
||||||
|
render :create, locals: { already_signed: true }
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
@release.attributes = amendment_params
|
||||||
|
|
||||||
|
render :new unless @release.save(context: :amendment)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def amendment_params
|
||||||
|
params.require(releasable_param.name).permit(:amendment_signer_name, :amendment_signature_base64)
|
||||||
|
end
|
||||||
|
|
||||||
|
def releasable_param
|
||||||
|
@releasable_param ||= ReleasableParam.new(params.to_unsafe_h)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_release
|
||||||
|
@release = @contract_template.releases.find(releasable_param.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_contract_template
|
||||||
|
@contract_template = @project.contract_templates.find(params[:contract_template_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_project
|
||||||
|
@project = @account.projects.find(params[:project_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_account
|
||||||
|
@account = Account.find_by(slug: params[:account_id])
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -10,7 +10,6 @@ class Public::AppearanceReleasesController < Public::BaseController
|
|||||||
@appearance_release = build_appearance_release(appearance_release_params_with_locale_and_contract_template)
|
@appearance_release = build_appearance_release(appearance_release_params_with_locale_and_contract_template)
|
||||||
|
|
||||||
if @appearance_release.save(context: :native)
|
if @appearance_release.save(context: :native)
|
||||||
log_create_analytics
|
|
||||||
after_create(@appearance_release)
|
after_create(@appearance_release)
|
||||||
else
|
else
|
||||||
render :new
|
render :new
|
||||||
@@ -39,11 +38,83 @@ class Public::AppearanceReleasesController < Public::BaseController
|
|||||||
authorize appearance_releases.build(params)
|
authorize appearance_releases.build(params)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def person_params
|
||||||
|
%i[
|
||||||
|
person_first_name
|
||||||
|
person_last_name
|
||||||
|
person_phone
|
||||||
|
person_email
|
||||||
|
person_photo
|
||||||
|
person_address_street1
|
||||||
|
person_address_street2
|
||||||
|
person_address_city
|
||||||
|
person_address_state
|
||||||
|
person_address_zip
|
||||||
|
person_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_first_name
|
||||||
|
guardian_last_name
|
||||||
|
guardian_phone
|
||||||
|
guardian_email
|
||||||
|
guardian_photo
|
||||||
|
guardian_address_street1
|
||||||
|
guardian_address_street2
|
||||||
|
guardian_address_city
|
||||||
|
guardian_address_state
|
||||||
|
guardian_address_zip
|
||||||
|
guardian_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def second_guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_2_first_name
|
||||||
|
guardian_2_last_name
|
||||||
|
guardian_2_phone
|
||||||
|
guardian_2_email
|
||||||
|
guardian_2_photo
|
||||||
|
guardian_2_address_street1
|
||||||
|
guardian_2_address_street2
|
||||||
|
guardian_2_address_city
|
||||||
|
guardian_2_address_state
|
||||||
|
guardian_2_address_zip
|
||||||
|
guardian_2_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def questionnaire_params
|
||||||
|
[
|
||||||
|
:question_1_answer,
|
||||||
|
:question_2_answer,
|
||||||
|
:question_3_answer,
|
||||||
|
:question_4_answer,
|
||||||
|
:question_5_answer,
|
||||||
|
:question_6_answer,
|
||||||
|
:question_7_answer,
|
||||||
|
:question_8_answer,
|
||||||
|
:question_9_answer,
|
||||||
|
:question_10_answer,
|
||||||
|
:question_11_answer,
|
||||||
|
:question_12_answer,
|
||||||
|
:question_13_answer,
|
||||||
|
:question_14_answer,
|
||||||
|
:question_15_answer,
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
def appearance_release_params
|
def appearance_release_params
|
||||||
params.require(:appearance_release).permit(:person_address, :person_first_name, :person_last_name, :person_phone, :person_email, :person_photo,
|
params.require(:appearance_release).permit(person_params, guardian_params,
|
||||||
:guardian_address, :guardian_first_name, :guardian_last_name, :guardian_phone, :guardian_email, :guardian_photo, :minor,
|
second_guardian_params,
|
||||||
:signature_base64, :person_date_of_birth,
|
questionnaire_params,
|
||||||
:locale, :contract_template,)
|
:minor, :signature_base64,
|
||||||
|
:person_date_of_birth,
|
||||||
|
:locale, :contract_template,
|
||||||
|
:exhibit_a_answer, :exhibit_b_answer
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def appearance_release_params_with_locale
|
def appearance_release_params_with_locale
|
||||||
@@ -53,8 +124,4 @@ class Public::AppearanceReleasesController < Public::BaseController
|
|||||||
def appearance_release_params_with_locale_and_contract_template
|
def appearance_release_params_with_locale_and_contract_template
|
||||||
appearance_release_params_with_locale.merge(contract_template: @contract_template)
|
appearance_release_params_with_locale.merge(contract_template: @contract_template)
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_create_analytics
|
|
||||||
TrackAnalyticsJob.perform_later(nil, nil, :track_create_native_release, release_type: AppearanceRelease.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ class Public::BroadcastsController < Public::BaseController
|
|||||||
before_action :set_broadcast, only: [:show, :update]
|
before_action :set_broadcast, only: [:show, :update]
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@conference_url = broadcast_zoom_meeting_url(@broadcast.token)
|
@conference_url = conference_url_for(@broadcast)
|
||||||
@multi_view_broadcasts = multi_view_broadcasts
|
@multi_view_broadcasts = multi_view_broadcasts
|
||||||
@recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page])
|
@recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page])
|
||||||
@files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page])
|
@files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page])
|
||||||
|
|
||||||
render 'broadcasts/show'
|
render 'broadcasts/show'
|
||||||
@@ -37,6 +37,14 @@ class Public::BroadcastsController < Public::BaseController
|
|||||||
|
|
||||||
def set_broadcast
|
def set_broadcast
|
||||||
@broadcast = Broadcast.find_by_token(params[:token])
|
@broadcast = Broadcast.find_by_token(params[:token])
|
||||||
|
|
||||||
|
unless @broadcast.present?
|
||||||
|
redirect_to [:new, :session], alert: t(".alert")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def conference_url_for(broadcast)
|
||||||
|
broadcast.video_conference_url_override.presence || broadcast_zoom_meeting_url(broadcast.token)
|
||||||
end
|
end
|
||||||
|
|
||||||
class MultiViewBroadcast
|
class MultiViewBroadcast
|
||||||
|
|||||||
18
app/controllers/public/contract_templates_controller.rb
Normal file
18
app/controllers/public/contract_templates_controller.rb
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
class Public::ContractTemplatesController < Public::BaseController
|
||||||
|
skip_after_action :verify_authorized, :verify_policy_scoped
|
||||||
|
before_action :set_account, :set_project
|
||||||
|
|
||||||
|
def index
|
||||||
|
@contract_templates = @project.contract_templates.where(id: params[:contract_template_ids]).order_by_name.paginate(page: params[:page])
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_project
|
||||||
|
@project = @account.projects.find(params[:project_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_account
|
||||||
|
@account = Account.find_by(slug: params[:account_id])
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -10,7 +10,6 @@ class Public::LocationReleasesController < Public::BaseController
|
|||||||
@location_release = build_location_release(location_release_params_with_locale_and_contract_template)
|
@location_release = build_location_release(location_release_params_with_locale_and_contract_template)
|
||||||
|
|
||||||
if @location_release.save(context: :native)
|
if @location_release.save(context: :native)
|
||||||
log_create_analytics
|
|
||||||
after_create(@location_release)
|
after_create(@location_release)
|
||||||
else
|
else
|
||||||
render :new
|
render :new
|
||||||
@@ -76,8 +75,4 @@ class Public::LocationReleasesController < Public::BaseController
|
|||||||
def location_release_params_with_locale_and_contract_template
|
def location_release_params_with_locale_and_contract_template
|
||||||
location_release_params_with_locale.merge(contract_template: @contract_template)
|
location_release_params_with_locale.merge(contract_template: @contract_template)
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_create_analytics
|
|
||||||
TrackAnalyticsJob.perform_later(nil, nil, :track_create_native_release, release_type: LocationRelease.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ class Public::MaterialReleasesController < Public::BaseController
|
|||||||
@material_release = build_material_release(material_release_params_with_locale_and_contract_template)
|
@material_release = build_material_release(material_release_params_with_locale_and_contract_template)
|
||||||
|
|
||||||
if @material_release.save(context: :native)
|
if @material_release.save(context: :native)
|
||||||
log_create_analytics
|
|
||||||
after_create(@material_release)
|
after_create(@material_release)
|
||||||
else
|
else
|
||||||
render :new
|
render :new
|
||||||
@@ -39,13 +38,61 @@ class Public::MaterialReleasesController < Public::BaseController
|
|||||||
authorize material_releases.build(params)
|
authorize material_releases.build(params)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def person_params
|
||||||
|
%i[
|
||||||
|
person_first_name
|
||||||
|
person_last_name
|
||||||
|
person_phone
|
||||||
|
person_email
|
||||||
|
person_title
|
||||||
|
person_company
|
||||||
|
person_address_street1
|
||||||
|
person_address_street2
|
||||||
|
person_address_city
|
||||||
|
person_address_state
|
||||||
|
person_address_zip
|
||||||
|
person_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_first_name
|
||||||
|
guardian_last_name
|
||||||
|
guardian_phone
|
||||||
|
guardian_email
|
||||||
|
guardian_photo
|
||||||
|
guardian_address_street1
|
||||||
|
guardian_address_street2
|
||||||
|
guardian_address_city
|
||||||
|
guardian_address_state
|
||||||
|
guardian_address_zip
|
||||||
|
guardian_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def second_guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_2_first_name
|
||||||
|
guardian_2_last_name
|
||||||
|
guardian_2_phone
|
||||||
|
guardian_2_email
|
||||||
|
guardian_2_photo
|
||||||
|
guardian_2_address_street1
|
||||||
|
guardian_2_address_street2
|
||||||
|
guardian_2_address_city
|
||||||
|
guardian_2_address_state
|
||||||
|
guardian_2_address_zip
|
||||||
|
guardian_2_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
def material_release_params
|
def material_release_params
|
||||||
params.require(:material_release).permit(
|
params.require(:material_release).permit(person_params, guardian_params, second_guardian_params, :minor,
|
||||||
:name, :address_street1, :address_street2, :address_city, :address_state, :address_zip, :address_country,
|
:name, :address_street1, :address_street2, :address_city, :address_state, :address_zip, :address_country,
|
||||||
:person_first_name, :person_last_name, :person_title, :person_company, :person_phone, :person_email,
|
|
||||||
:person_address_street1, :person_address_street2, :person_address_city, :person_address_state, :person_address_zip, :person_address_country,
|
|
||||||
:signature_base64,
|
:signature_base64,
|
||||||
:locale, :contract_template, :description, photos: []
|
:locale, :contract_template, :description, files: []
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -56,8 +103,4 @@ class Public::MaterialReleasesController < Public::BaseController
|
|||||||
def material_release_params_with_locale_and_contract_template
|
def material_release_params_with_locale_and_contract_template
|
||||||
material_release_params_with_locale.merge(contract_template: @contract_template)
|
material_release_params_with_locale.merge(contract_template: @contract_template)
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_create_analytics
|
|
||||||
TrackAnalyticsJob.perform_later(nil, nil, :track_create_native_release, release_type: MaterialRelease.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ class Public::MedicalReleasesController < Public::BaseController
|
|||||||
if @medical_release.contract_template.present?
|
if @medical_release.contract_template.present?
|
||||||
AttachContractToReleasableJob.perform_later(@medical_release)
|
AttachContractToReleasableJob.perform_later(@medical_release)
|
||||||
end
|
end
|
||||||
log_create_analytics
|
|
||||||
else
|
else
|
||||||
render :new
|
render :new
|
||||||
end
|
end
|
||||||
@@ -45,6 +44,9 @@ class Public::MedicalReleasesController < Public::BaseController
|
|||||||
.require(:medical_release)
|
.require(:medical_release)
|
||||||
.permit(
|
.permit(
|
||||||
person_params,
|
person_params,
|
||||||
|
guardian_params,
|
||||||
|
second_guardian_params,
|
||||||
|
:minor,
|
||||||
:signature_base64,
|
:signature_base64,
|
||||||
:locale,
|
:locale,
|
||||||
:contract_template,
|
:contract_template,
|
||||||
@@ -53,22 +55,56 @@ class Public::MedicalReleasesController < Public::BaseController
|
|||||||
:question_5_answer, :question_6_answer,
|
:question_5_answer, :question_6_answer,
|
||||||
:question_7_answer, :question_8_answer,
|
:question_7_answer, :question_8_answer,
|
||||||
:question_9_answer, :question_10_answer,
|
:question_9_answer, :question_10_answer,
|
||||||
photos: [],
|
:question_11_answer, :question_12_answer,
|
||||||
|
:question_13_answer, :question_14_answer,
|
||||||
|
:question_15_answer, photos: [],
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def person_params
|
def person_params
|
||||||
[
|
%i[
|
||||||
:person_first_name,
|
person_first_name
|
||||||
:person_last_name,
|
person_last_name
|
||||||
:person_phone,
|
person_phone
|
||||||
:person_email,
|
person_email
|
||||||
:person_address_street1,
|
person_address_street1
|
||||||
:person_address_street2,
|
person_address_street2
|
||||||
:person_address_city,
|
person_address_city
|
||||||
:person_address_state,
|
person_address_state
|
||||||
:person_address_zip,
|
person_address_zip
|
||||||
:person_address_country,
|
person_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_first_name
|
||||||
|
guardian_last_name
|
||||||
|
guardian_phone
|
||||||
|
guardian_email
|
||||||
|
guardian_photo
|
||||||
|
guardian_address_street1
|
||||||
|
guardian_address_street2
|
||||||
|
guardian_address_city
|
||||||
|
guardian_address_state
|
||||||
|
guardian_address_zip
|
||||||
|
guardian_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def second_guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_2_first_name
|
||||||
|
guardian_2_last_name
|
||||||
|
guardian_2_phone
|
||||||
|
guardian_2_email
|
||||||
|
guardian_2_photo
|
||||||
|
guardian_2_address_street1
|
||||||
|
guardian_2_address_street2
|
||||||
|
guardian_2_address_city
|
||||||
|
guardian_2_address_state
|
||||||
|
guardian_2_address_zip
|
||||||
|
guardian_2_address_country
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -79,8 +115,4 @@ class Public::MedicalReleasesController < Public::BaseController
|
|||||||
def medical_release_params_with_locale_and_contract_template
|
def medical_release_params_with_locale_and_contract_template
|
||||||
medical_release_params_with_locale.merge(contract_template: @contract_template)
|
medical_release_params_with_locale.merge(contract_template: @contract_template)
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_create_analytics
|
|
||||||
TrackAnalyticsJob.perform_later(nil, nil, :track_create_native_release, release_type: MedicalRelease.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
123
app/controllers/public/misc_releases_controller.rb
Normal file
123
app/controllers/public/misc_releases_controller.rb
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
class Public::MiscReleasesController < Public::BaseController
|
||||||
|
before_action :set_account, :set_project, :set_contract_template
|
||||||
|
|
||||||
|
def new
|
||||||
|
@misc_release = build_misc_release
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
@misc_release = build_misc_release(misc_release_params_with_locale_and_contract_template)
|
||||||
|
|
||||||
|
if @misc_release.save(context: :native)
|
||||||
|
if @misc_release.contract_template.present?
|
||||||
|
AttachContractToReleasableJob.perform_later(@misc_release)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
render :new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_project
|
||||||
|
@project = @account.projects.find(params[:project_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_account
|
||||||
|
@account = Account.find_by(slug: params[:account_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_contract_template
|
||||||
|
@contract_template = @project.contract_templates.find(params[:contract_template_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def misc_releases
|
||||||
|
policy_scope(@project.misc_releases)
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_misc_release(params = {})
|
||||||
|
authorize misc_releases.build(params)
|
||||||
|
end
|
||||||
|
|
||||||
|
def misc_release_params
|
||||||
|
params
|
||||||
|
.require(:misc_release)
|
||||||
|
.permit(
|
||||||
|
person_params,
|
||||||
|
guardian_params,
|
||||||
|
questionnaire_params,
|
||||||
|
:signature_base64,
|
||||||
|
:locale,
|
||||||
|
:contract_template,
|
||||||
|
:applicable_medium_id,
|
||||||
|
:applicable_medium_text,
|
||||||
|
:territory_id,
|
||||||
|
:territory_text,
|
||||||
|
:term_id,
|
||||||
|
:term_text,
|
||||||
|
:restriction_id,
|
||||||
|
:restriction_text,
|
||||||
|
photos: [],
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def person_params
|
||||||
|
[
|
||||||
|
:person_first_name,
|
||||||
|
:person_last_name,
|
||||||
|
:person_phone,
|
||||||
|
:person_email,
|
||||||
|
:person_address_street1,
|
||||||
|
:person_address_street2,
|
||||||
|
:person_address_city,
|
||||||
|
:person_address_state,
|
||||||
|
:person_address_zip,
|
||||||
|
:person_address_country,
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def guardian_params
|
||||||
|
[
|
||||||
|
:guardian_first_name,
|
||||||
|
:guardian_last_name,
|
||||||
|
:guardian_phone,
|
||||||
|
:guardian_email,
|
||||||
|
:minor,
|
||||||
|
:guardian_address_street1,
|
||||||
|
:guardian_address_street2,
|
||||||
|
:guardian_address_city,
|
||||||
|
:guardian_address_state,
|
||||||
|
:guardian_address_zip,
|
||||||
|
:guardian_address_country,
|
||||||
|
:guardian_photo
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def questionnaire_params
|
||||||
|
[
|
||||||
|
:question_1_answer,
|
||||||
|
:question_2_answer,
|
||||||
|
:question_3_answer,
|
||||||
|
:question_4_answer,
|
||||||
|
:question_5_answer,
|
||||||
|
:question_6_answer,
|
||||||
|
:question_7_answer,
|
||||||
|
:question_8_answer,
|
||||||
|
:question_9_answer,
|
||||||
|
:question_10_answer,
|
||||||
|
:question_11_answer,
|
||||||
|
:question_12_answer,
|
||||||
|
:question_13_answer,
|
||||||
|
:question_14_answer,
|
||||||
|
:question_15_answer,
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def misc_release_params_with_locale
|
||||||
|
misc_release_params.merge(locale: I18n.locale)
|
||||||
|
end
|
||||||
|
|
||||||
|
def misc_release_params_with_locale_and_contract_template
|
||||||
|
misc_release_params_with_locale.merge(contract_template: @contract_template)
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -10,7 +10,6 @@ class Public::TalentReleasesController < Public::BaseController
|
|||||||
@talent_release = build_talent_release(talent_release_params_with_locale_and_contract_template)
|
@talent_release = build_talent_release(talent_release_params_with_locale_and_contract_template)
|
||||||
|
|
||||||
if @talent_release.save(context: :native)
|
if @talent_release.save(context: :native)
|
||||||
log_create_analytics
|
|
||||||
after_create(@talent_release)
|
after_create(@talent_release)
|
||||||
else
|
else
|
||||||
render :new
|
render :new
|
||||||
@@ -45,42 +44,59 @@ class Public::TalentReleasesController < Public::BaseController
|
|||||||
.permit(
|
.permit(
|
||||||
person_params,
|
person_params,
|
||||||
guardian_params,
|
guardian_params,
|
||||||
|
second_guardian_params,
|
||||||
:signature_base64,
|
:signature_base64,
|
||||||
:locale,
|
:locale,
|
||||||
:contract_template,
|
:contract_template,
|
||||||
photos: [],
|
photos: []
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def person_params
|
def person_params
|
||||||
[
|
%i[
|
||||||
:person_first_name,
|
person_first_name
|
||||||
:person_last_name,
|
person_last_name
|
||||||
:person_phone,
|
person_phone
|
||||||
:person_email,
|
person_email
|
||||||
:person_address_street1,
|
person_address_street1
|
||||||
:person_address_street2,
|
person_address_street2
|
||||||
:person_address_city,
|
person_address_city
|
||||||
:person_address_state,
|
person_address_state
|
||||||
:person_address_zip,
|
person_address_zip
|
||||||
:person_address_country,
|
person_address_country
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
def guardian_params
|
def guardian_params
|
||||||
[
|
%i[
|
||||||
:guardian_first_name,
|
guardian_first_name
|
||||||
:guardian_last_name,
|
guardian_last_name
|
||||||
:guardian_phone,
|
guardian_phone
|
||||||
:guardian_email,
|
guardian_email
|
||||||
:minor,
|
minor
|
||||||
:guardian_address_street1,
|
guardian_address_street1
|
||||||
:guardian_address_street2,
|
guardian_address_street2
|
||||||
:guardian_address_city,
|
guardian_address_city
|
||||||
:guardian_address_state,
|
guardian_address_state
|
||||||
:guardian_address_zip,
|
guardian_address_zip
|
||||||
:guardian_address_country,
|
guardian_address_country
|
||||||
:guardian_photo,
|
guardian_photo
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def second_guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_2_first_name
|
||||||
|
guardian_2_last_name
|
||||||
|
guardian_2_phone
|
||||||
|
guardian_2_email
|
||||||
|
guardian_2_address_street1
|
||||||
|
guardian_2_address_street2
|
||||||
|
guardian_2_address_city
|
||||||
|
guardian_2_address_state
|
||||||
|
guardian_2_address_zip
|
||||||
|
guardian_2_address_country
|
||||||
|
guardian_2_photo
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -91,8 +107,4 @@ class Public::TalentReleasesController < Public::BaseController
|
|||||||
def talent_release_params_with_locale_and_contract_template
|
def talent_release_params_with_locale_and_contract_template
|
||||||
talent_release_params_with_locale.merge(contract_template: @contract_template)
|
talent_release_params_with_locale.merge(contract_template: @contract_template)
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_create_analytics
|
|
||||||
TrackAnalyticsJob.perform_later(nil, nil, :track_create_native_release, release_type: TalentRelease.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ class ReleaseTemplateImportsController < ApplicationController
|
|||||||
|
|
||||||
templates = []
|
templates = []
|
||||||
filtered_contract_templates.each do |contract_template|
|
filtered_contract_templates.each do |contract_template|
|
||||||
next if contract_template.duplicated? || contract_template.project == @project
|
next if contract_template.duplicated? ||
|
||||||
|
contract_template.archived? ||
|
||||||
|
contract_template.project == @project
|
||||||
|
|
||||||
already_imported = contract_template.duplicates.non_archived.pluck(:project_id).include?(@project.id)
|
already_imported = contract_template.duplicates.non_archived.pluck(:project_id).include?(@project.id)
|
||||||
templates << OpenStruct.new(template: contract_template, already_imported?: already_imported)
|
templates << OpenStruct.new(template: contract_template, already_imported?: already_imported)
|
||||||
|
|||||||
@@ -14,6 +14,10 @@ class StreamNotificationsController < ApplicationController
|
|||||||
when "video.live_stream.recording"
|
when "video.live_stream.recording"
|
||||||
@broadcast.streamer_recording!
|
@broadcast.streamer_recording!
|
||||||
notify_users
|
notify_users
|
||||||
|
when "video.asset.ready"
|
||||||
|
full_live_stream_playback_uid = notification.dig(:data, :playback_ids, 0, :id)
|
||||||
|
@broadcast.update(full_live_stream_playback_uid: full_live_stream_playback_uid)
|
||||||
|
notify_users
|
||||||
when "video.live_stream.active"
|
when "video.live_stream.active"
|
||||||
@broadcast.active!
|
@broadcast.active!
|
||||||
notify_users
|
notify_users
|
||||||
@@ -28,9 +32,10 @@ class StreamNotificationsController < ApplicationController
|
|||||||
asset_uid = notification.dig(:object, :id)
|
asset_uid = notification.dig(:object, :id)
|
||||||
playback_uid = notification.dig(:data, :playback_ids, 0, :id)
|
playback_uid = notification.dig(:data, :playback_ids, 0, :id)
|
||||||
file_name = notification.dig(:data, :static_renditions, :files, -1, :name)
|
file_name = notification.dig(:data, :static_renditions, :files, -1, :name)
|
||||||
|
duration = notification.dig(:data, :duration)
|
||||||
|
|
||||||
recording = @broadcast.broadcast_recordings.create!(asset_uid: asset_uid, asset_playback_uid: playback_uid, file_name: file_name)
|
recording = @broadcast.broadcast_recordings.create!(asset_uid: asset_uid, asset_playback_uid: playback_uid, file_name: file_name, duration: duration)
|
||||||
recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page])
|
recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page])
|
||||||
|
|
||||||
link = helpers.link_to(recording.broadcast_name.titleize, recording.download_url, target: "_blank")
|
link = helpers.link_to(recording.broadcast_name.titleize, recording.download_url, target: "_blank")
|
||||||
message = "Your recent live stream has been recorded and is available for download here: #{link}"
|
message = "Your recent live stream has been recorded and is available for download here: #{link}"
|
||||||
@@ -58,11 +63,17 @@ class StreamNotificationsController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def set_broadcast
|
def set_broadcast
|
||||||
if notification_type == "video.asset.static_renditions.ready"
|
case notification_type
|
||||||
|
when "video.asset.static_renditions.ready", "video.asset.ready"
|
||||||
live_stream_id = notification.dig(:stream_notification, :data, :live_stream_id)
|
live_stream_id = notification.dig(:stream_notification, :data, :live_stream_id)
|
||||||
@broadcast = Broadcast.find_by!(stream_uid: live_stream_id)
|
@broadcast = Broadcast.find_by(stream_uid: live_stream_id)
|
||||||
else
|
else
|
||||||
@broadcast = Broadcast.find_by!(stream_uid: notification_object_id)
|
@broadcast = Broadcast.find_by(stream_uid: notification_object_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
if @broadcast.nil?
|
||||||
|
logger.info "Ignoring broadcast from other environment. Type = #{notification_type}. Id = #{live_stream_id} / #{notification_object_id}"
|
||||||
|
head :ok
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ class TalentReleasesController < ApplicationController
|
|||||||
@talent_release = build_talent_release(talent_release_params)
|
@talent_release = build_talent_release(talent_release_params)
|
||||||
|
|
||||||
if @talent_release.save
|
if @talent_release.save
|
||||||
log_create_analytics
|
|
||||||
AddHeadshotCollectionUidToProjectJob.perform_later(@project)
|
AddHeadshotCollectionUidToProjectJob.perform_later(@project)
|
||||||
SetTagsForReleasableJob.perform_later(@talent_release)
|
SetTagsForReleasableJob.perform_later(@talent_release)
|
||||||
redirect_to [@project, :talent_releases], notice: t(".notice")
|
redirect_to [@project, :talent_releases], notice: t(".notice")
|
||||||
@@ -61,15 +60,67 @@ class TalentReleasesController < ApplicationController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def person_params
|
||||||
|
%i[
|
||||||
|
person_first_name
|
||||||
|
person_last_name
|
||||||
|
person_phone
|
||||||
|
person_email
|
||||||
|
person_address_street1
|
||||||
|
person_address_street2
|
||||||
|
person_address_city
|
||||||
|
person_address_state
|
||||||
|
person_address_zip
|
||||||
|
person_address_country
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_first_name
|
||||||
|
guardian_last_name
|
||||||
|
guardian_phone
|
||||||
|
guardian_email
|
||||||
|
minor
|
||||||
|
guardian_address_street1
|
||||||
|
guardian_address_street2
|
||||||
|
guardian_address_city
|
||||||
|
guardian_address_state
|
||||||
|
guardian_address_zip
|
||||||
|
guardian_address_country
|
||||||
|
guardian_photo
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def second_guardian_params
|
||||||
|
%i[
|
||||||
|
guardian_2_first_name
|
||||||
|
guardian_2_last_name
|
||||||
|
guardian_2_phone
|
||||||
|
guardian_2_email
|
||||||
|
guardian_2_address_street1
|
||||||
|
guardian_2_address_street2
|
||||||
|
guardian_2_address_city
|
||||||
|
guardian_2_address_state
|
||||||
|
guardian_2_address_zip
|
||||||
|
guardian_2_address_country
|
||||||
|
guardian_2_photo
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
def talent_release_params
|
def talent_release_params
|
||||||
params.require(:talent_release).permit(
|
params.require(:talent_release).permit(person_params,
|
||||||
:person_first_name, :person_last_name, :person_phone, :guardian_photo, :person_email,
|
guardian_params,
|
||||||
:person_address_street1, :person_address_street2, :person_address_city, :person_address_state, :person_address_zip, :person_address_country,
|
second_guardian_params,
|
||||||
:guardian_first_name, :guardian_last_name, :guardian_phone, :guardian_email, :minor,
|
:contract, { photos: [] },
|
||||||
:guardian_address_street1, :guardian_address_street2, :guardian_address_city, :guardian_address_state, :guardian_address_zip, :guardian_address_country,
|
:applicable_medium_id,
|
||||||
:contract, { photos: [] },
|
:applicable_medium_text,
|
||||||
:applicable_medium_id, :applicable_medium_text, :territory_id, :territory_text, :term_id, :term_text, :restriction_id, :restriction_text
|
:territory_id,
|
||||||
)
|
:territory_text,
|
||||||
|
:term_id,
|
||||||
|
:term_text,
|
||||||
|
:restriction_id,
|
||||||
|
:restriction_text)
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_talent_release(attrs = {})
|
def build_talent_release(attrs = {})
|
||||||
@@ -85,8 +136,4 @@ class TalentReleasesController < ApplicationController
|
|||||||
|
|
||||||
results
|
results
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_create_analytics
|
|
||||||
TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_non_native_release, release_type: TalentRelease.to_s, user_agent: request.user_agent, user_ip: request.remote_ip)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
81
app/controllers/task_requests_controller.rb
Normal file
81
app/controllers/task_requests_controller.rb
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
class TaskRequestsController < ApplicationController
|
||||||
|
layout "project"
|
||||||
|
|
||||||
|
before_action :set_project
|
||||||
|
before_action :build_task_request, only: [:new, :create]
|
||||||
|
before_action :set_task_request, only: [:show, :edit, :update, :cancel]
|
||||||
|
before_action :show_splash_screen, only: :index
|
||||||
|
|
||||||
|
def index
|
||||||
|
@task_requests = task_requests.order_by_recent.paginate(page: params[:page])
|
||||||
|
end
|
||||||
|
|
||||||
|
def new
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
@task_request.attributes = task_request_params_with_email
|
||||||
|
|
||||||
|
if @task_request.save
|
||||||
|
log_create_analytics
|
||||||
|
taskme_url = url_for([:admin, @task_request])
|
||||||
|
SubmitHubspotTaskRequestFormJob.perform_later(@task_request.user_email, taskme_url)
|
||||||
|
else
|
||||||
|
render :new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def show
|
||||||
|
@files = @task_request.files.paginate(page: params[:page])
|
||||||
|
end
|
||||||
|
|
||||||
|
def edit
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
if @task_request.update(task_request_params)
|
||||||
|
redirect_to [@project, :task_requests], notice: t(".notice")
|
||||||
|
else
|
||||||
|
render :edit
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def cancel
|
||||||
|
@task_request.cancelled!
|
||||||
|
redirect_to [@project, :task_requests], notice: t(".notice")
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def show_splash_screen
|
||||||
|
render :splash if task_requests.count.zero?
|
||||||
|
end
|
||||||
|
|
||||||
|
def task_request_params
|
||||||
|
params.require(:task_request).permit(:description, :deadline, :time_allowed, :additional_notes, files: [])
|
||||||
|
end
|
||||||
|
|
||||||
|
def task_request_params_with_email
|
||||||
|
task_request_params.merge(user_email: Current.user.email)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_project
|
||||||
|
@project = policy_scope(Project).find(params[:project_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_task_request
|
||||||
|
@task_request = authorize policy_scope(TaskRequest).find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def task_requests
|
||||||
|
authorize policy_scope(@project.task_requests)
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_task_request
|
||||||
|
@task_request = authorize @project.task_requests.build
|
||||||
|
end
|
||||||
|
|
||||||
|
def log_create_analytics
|
||||||
|
TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_task_request, user_agent: request.user_agent, user_ip: request.remote_ip)
|
||||||
|
end
|
||||||
|
end
|
||||||
19
app/controllers/tasks_controller.rb
Normal file
19
app/controllers/tasks_controller.rb
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
class TasksController < ApplicationController
|
||||||
|
before_action :set_project
|
||||||
|
|
||||||
|
include ProjectLayout
|
||||||
|
|
||||||
|
def index
|
||||||
|
@tasks = task_requests.completed.order_by_recent.paginate(page: params[:page])
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_project
|
||||||
|
@project = policy_scope(Project).find(params[:project_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def task_requests
|
||||||
|
authorize policy_scope(@project.task_requests)
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -3,6 +3,7 @@ class VideosController < ApplicationController
|
|||||||
|
|
||||||
before_action :set_project, only: [:index, :new, :create, :landing]
|
before_action :set_project, only: [:index, :new, :create, :landing]
|
||||||
before_action :set_video, only: [:edit, :update]
|
before_action :set_video, only: [:edit, :update]
|
||||||
|
before_action :show_splash_screen, only: :index
|
||||||
|
|
||||||
def landing
|
def landing
|
||||||
authorize Video, :new?
|
authorize Video, :new?
|
||||||
@@ -60,6 +61,10 @@ class VideosController < ApplicationController
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def show_splash_screen
|
||||||
|
render :splash if videos.count.zero?
|
||||||
|
end
|
||||||
|
|
||||||
def set_project
|
def set_project
|
||||||
@project = policy_scope(Project).find(params[:project_id])
|
@project = policy_scope(Project).find(params[:project_id])
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ module DescriptionListHelper
|
|||||||
safe_join(tags)
|
safe_join(tags)
|
||||||
end
|
end
|
||||||
|
|
||||||
def description_list_pair_for(record, attribute, append: nil)
|
def description_list_pair_for(record, attribute, append: nil, custom_label: nil)
|
||||||
term = translation_for(record, attribute)
|
term = custom_label.nil? ? translation_for(record, attribute) : custom_label
|
||||||
definition = record.send(attribute)
|
definition = record.send(attribute)
|
||||||
|
|
||||||
description_list_pair(term, definition, append: append)
|
description_list_pair(term, definition, append: append)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ module DropzoneHelper
|
|||||||
def dropzone_placeholder_message_for(releasable)
|
def dropzone_placeholder_message_for(releasable)
|
||||||
case releasable.model_name.param_key
|
case releasable.model_name.param_key
|
||||||
when "acquired_media_release"
|
when "acquired_media_release"
|
||||||
"To Add Photos & Videos to the release:<br>Drag & Drop Files<br>or<br>Click or Tap here to browse photos and connect to Camera"
|
'(Optional) To add the licensed photos or videos ("Property") to this release:<br>Drag & Drop Files<br>or<br>Click or Tap here to browse photos and connect to Camera'
|
||||||
when "material_release"
|
when "material_release"
|
||||||
t 'material_releases.form.photos.dropzone_label'
|
t 'material_releases.form.photos.dropzone_label'
|
||||||
when "music_release"
|
when "music_release"
|
||||||
@@ -11,6 +11,8 @@ module DropzoneHelper
|
|||||||
t 'location_releases.form.photos.dropzone_label'
|
t 'location_releases.form.photos.dropzone_label'
|
||||||
when "directory"
|
when "directory"
|
||||||
"To Add Files to the Folder:<br>Drag & Drop Files<br>or<br>Click or Tap here to browse files"
|
"To Add Files to the Folder:<br>Drag & Drop Files<br>or<br>Click or Tap here to browse files"
|
||||||
|
when "task_request"
|
||||||
|
"To Add Files for the Task:<br>Drag & Drop Files<br>or<br>Click or Tap here to browse files"
|
||||||
else
|
else
|
||||||
"To Add Photos to the release:<br>Drag & Drop Files<br>or<br>Click or Tap here to browse photos and connect to Camera"
|
"To Add Photos to the release:<br>Drag & Drop Files<br>or<br>Click or Tap here to browse photos and connect to Camera"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,6 +6,6 @@ module MailHelper
|
|||||||
"1. Tell us the name of the video: \n\n" \
|
"1. Tell us the name of the video: \n\n" \
|
||||||
"2. Attach each EDL to this email. Please make sure to indicate whether the EDL is a Video Only, Graphics Only, or Audio Only EDL."
|
"2. Attach each EDL to this email. Please make sure to indicate whether the EDL is a Video Only, Graphics Only, or Audio Only EDL."
|
||||||
|
|
||||||
mail_to "info@bigmedia.ai", content, subject: subject, body: body
|
mail_to "info@mesuite.ai", content, subject: subject, body: body
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ module TagsHelper
|
|||||||
disable_with: disabled_content,
|
disable_with: disabled_content,
|
||||||
},
|
},
|
||||||
form: {
|
form: {
|
||||||
|
id: "selected_releases_form",
|
||||||
data: {
|
data: {
|
||||||
releasable_ids: [],
|
releasable_ids: [],
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,4 +5,12 @@ module TooltipHelper
|
|||||||
concat tag.div(class: "tooltip-inner")
|
concat tag.div(class: "tooltip-inner")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get_approval_data_for_releasable(release)
|
||||||
|
if release.approved_by_user_name.present?
|
||||||
|
"#{release.approved_by_user_name} [#{release.approved_by_user_email}]"
|
||||||
|
else
|
||||||
|
release.approved_by_user_email
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -13,10 +13,13 @@ module WordmarkHelper
|
|||||||
css += options[:class].to_s
|
css += options[:class].to_s
|
||||||
|
|
||||||
content_tag(:div, class: css) do
|
content_tag(:div, class: css) do
|
||||||
safe_join [
|
elements = [
|
||||||
content_tag(:span, t("shared.#{product_name}")),
|
content_tag(:span, t("shared.#{product_name}")),
|
||||||
content_tag(:span, t("shared.me"))
|
content_tag(:span, t("shared.me"))
|
||||||
]
|
]
|
||||||
|
prefix = options[:prefix]
|
||||||
|
elements.unshift content_tag(:span, "#{prefix} ") unless prefix.blank?
|
||||||
|
safe_join elements
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -67,6 +67,23 @@ class ActiveStorageDropzone {
|
|||||||
var upload = new that.UploaderClass(file, url, delegate);
|
var upload = new that.UploaderClass(file, url, delegate);
|
||||||
createUpload(this, upload);
|
createUpload(this, upload);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.on("addedfile", function(file) {
|
||||||
|
// Show download link in dropzone previews
|
||||||
|
|
||||||
|
let div = document.createElement("div");
|
||||||
|
let anchor = document.createElement("a");
|
||||||
|
let download_icon = "<i class='fa fa-download' aria-hidden='true'></i> Download";
|
||||||
|
|
||||||
|
anchor.innerHTML = download_icon;
|
||||||
|
anchor.href = file.dataURL;
|
||||||
|
anchor.setAttribute('target', '_blank');
|
||||||
|
anchor.setAttribute('style', 'background-color: rgba(255, 255, 255, 0.4); padding: 0 0.4em; border: 1px solid transparent; text-decoration: none;');
|
||||||
|
div.append(anchor);
|
||||||
|
div.setAttribute('class', 'dz-download-link')
|
||||||
|
div.setAttribute('style', 'margin-top: 1em;')
|
||||||
|
$(file.previewElement.childNodes[3]).append(div);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
$(document).on("turbolinks:load", () => {
|
$(document).on("turbolinks:load", () => {
|
||||||
$('.datepicker-control').datepicker({
|
$('.datepicker-control').datepicker({
|
||||||
format: "yyyy-mm-dd"
|
format: "yyyy-mm-dd",
|
||||||
|
todayHighlight: true
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -6,27 +6,33 @@ class GenerateContractsZipJob < ApplicationJob
|
|||||||
before_perform do |job|
|
before_perform do |job|
|
||||||
@project = job.arguments.first
|
@project = job.arguments.first
|
||||||
@download = job.arguments.second
|
@download = job.arguments.second
|
||||||
release_type = job.arguments.third
|
@release_type = job.arguments.third
|
||||||
@folder_name = "#{@project.name.parameterize}_#{get_release_name(release_type).gsub('_', '-')}"
|
@release_ids = job.arguments.fourth
|
||||||
|
@search_query = job.arguments.fifth
|
||||||
|
@type_filter = job.arguments[5]
|
||||||
|
@folder_name = "#{@project.name.parameterize}_#{release_name.gsub('_', '-')}"
|
||||||
@download.update!(name: @folder_name, status: :pending)
|
@download.update!(name: @folder_name, status: :pending)
|
||||||
end
|
end
|
||||||
|
|
||||||
def perform(project, download, release_type, release_ids)
|
def perform(project, download, release_type, release_ids, search_query, type_filter)
|
||||||
releases = project.public_send(get_release_name(release_type)).where(id: release_ids)
|
|
||||||
|
|
||||||
::ReleaseContractCollectionService.new(releases, @folder_name).build do |dir, files|
|
::ReleaseContractCollectionService.new(releases, @folder_name).build do |dir, files|
|
||||||
zipfile_name = "#{dir}/#{@folder_name}.zip"
|
zipfile_name = "#{dir}/#{@folder_name}.zip"
|
||||||
Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
|
Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
|
||||||
files.each do |attachment|
|
files.each do |attachment|
|
||||||
zipfile.add(attachment, File.join("#{dir}/", attachment))
|
zipfile.add(attachment, File.join("#{dir}/", attachment))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if @release_type.constantize.include?(CsvExportable)
|
||||||
|
csv_file = generate_csv releases
|
||||||
|
zipfile.get_output_stream("#{@folder_name}.csv") { |f| f.puts(csv_file) }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@download.file.attach(io: File.open(zipfile_name), filename: @folder_name)
|
@download.file.attach(io: File.open(zipfile_name), filename: "#{@folder_name}.zip")
|
||||||
end
|
end
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Rails.logger.error("Failed to generate download for project (##{project.id}) with release type #{release_type}\n" + e.message)
|
Rails.logger.error("Failed to generate download for project (##{project.id}) with release type #{release_type}\n" + e.message)
|
||||||
|
|
||||||
@download.failure!
|
@download.failure!
|
||||||
ProjectsChannel.broadcast_download_generation_update(@download, I18n.t("contract_downloads.download.failure"))
|
ProjectsChannel.broadcast_download_generation_update(@download, I18n.t("contract_downloads.download.failure"))
|
||||||
end
|
end
|
||||||
@@ -43,7 +49,45 @@ class GenerateContractsZipJob < ApplicationJob
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def get_release_name(release_type)
|
def generate_csv(releases)
|
||||||
release_type.constantize.model_name.plural
|
release_class = @release_type.constantize
|
||||||
|
headers = release_class.csv_headers
|
||||||
|
|
||||||
|
CSV.generate(headers: true) do |csv|
|
||||||
|
csv << headers
|
||||||
|
releases.each do |release|
|
||||||
|
csv_row_data = release.to_csv_row
|
||||||
|
csv << csv_row_data
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def release_name
|
||||||
|
@release_type.constantize.model_name.plural
|
||||||
|
end
|
||||||
|
|
||||||
|
def all_releases
|
||||||
|
@project.public_send(release_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
def releases
|
||||||
|
if @release_ids.any?
|
||||||
|
return all_releases.where(id: @release_ids)
|
||||||
|
end
|
||||||
|
|
||||||
|
results = all_releases
|
||||||
|
if all_releases.respond_to?(:complete, :incomplete)
|
||||||
|
results = case @type_filter
|
||||||
|
when 'complete'
|
||||||
|
all_releases.complete
|
||||||
|
when 'incomplete'
|
||||||
|
all_releases.incomplete
|
||||||
|
else
|
||||||
|
all_releases
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
results = results.search(@search_query) if @search_query.present?
|
||||||
|
results
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
class SubmitHubspotFormJob < ApplicationJob
|
class SubmitHubspotFormJob < ApplicationJob
|
||||||
queue_as :default
|
queue_as :default
|
||||||
|
|
||||||
def perform(email, company_name, additional_params = {})
|
def perform(first_name, last_name, email, company_name, additional_params = {})
|
||||||
hubspot_form_guid = ENV["HUBSPOT_FORM_GUID"]
|
hubspot_form_guid = ENV["HUBSPOT_FORM_GUID"]
|
||||||
return unless hubspot_form_guid.present?
|
return unless hubspot_form_guid.present?
|
||||||
|
|
||||||
submission_params = {
|
submission_params = {
|
||||||
email: email,
|
first_name: first_name,
|
||||||
|
last_name: last_name,
|
||||||
|
email: email,
|
||||||
company: company_name
|
company: company_name
|
||||||
}.merge(additional_params)
|
}.merge(additional_params)
|
||||||
|
|
||||||
|
|||||||
18
app/jobs/submit_hubspot_task_request_form_job.rb
Normal file
18
app/jobs/submit_hubspot_task_request_form_job.rb
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
class SubmitHubspotTaskRequestFormJob < ApplicationJob
|
||||||
|
queue_as :default
|
||||||
|
|
||||||
|
def perform(user_email, taskme_url)
|
||||||
|
hubspot_task_request_form_guid = ENV["HUBSPOT_TASK_REQUEST_FORM_GUID"]
|
||||||
|
return unless hubspot_task_request_form_guid.present?
|
||||||
|
|
||||||
|
submission_params = {
|
||||||
|
email: user_email,
|
||||||
|
taskme_url: taskme_url
|
||||||
|
}
|
||||||
|
|
||||||
|
form = Hubspot::Form.new("guid" => hubspot_task_request_form_guid)
|
||||||
|
is_form_sumitted = form.submit(submission_params)
|
||||||
|
|
||||||
|
raise StandardError.new "Failed to submit the task request hubspot form data: #{is_form_sumitted}" unless is_form_sumitted
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
class AdminMailer < ApplicationMailer
|
class AdminMailer < ApplicationMailer
|
||||||
default to: %w(bray@bigmedia.ai lee@bigmedia.ai)
|
default to: %w[bray@mesuite.ai]
|
||||||
|
|
||||||
def new_video(video)
|
def new_video(video)
|
||||||
@video = video
|
@video = video
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
class ApplicationMailer < ActionMailer::Base
|
class ApplicationMailer < ActionMailer::Base
|
||||||
default from: ENV.fetch("MAILER_FROM_ADDRESS") { "support@bigmedia.ai" }
|
default from: ENV.fetch("MAILER_FROM_ADDRESS") { "support@mesuite.ai" }
|
||||||
layout "mailer"
|
layout "mailer"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ class Account < ApplicationRecord
|
|||||||
has_many :users, through: :account_auths
|
has_many :users, through: :account_auths
|
||||||
has_many :projects, dependent: :destroy
|
has_many :projects, dependent: :destroy
|
||||||
has_many :videos, through: :projects
|
has_many :videos, through: :projects
|
||||||
|
has_many :broadcasts, through: :projects
|
||||||
has_many :contract_templates, through: :projects
|
has_many :contract_templates, through: :projects
|
||||||
|
|
||||||
validates :name, presence: true
|
validates :name, presence: true
|
||||||
@@ -54,13 +55,28 @@ class Account < ApplicationRecord
|
|||||||
Download.where(project: projects),
|
Download.where(project: projects),
|
||||||
User.joins(:project_memberships).where(project_memberships: { project: projects }),
|
User.joins(:project_memberships).where(project_memberships: { project: projects }),
|
||||||
Broadcast.where(project: projects),
|
Broadcast.where(project: projects),
|
||||||
|
TaskRequest.where(project: projects),
|
||||||
ZoomMeeting.where(project: projects),
|
ZoomMeeting.where(project: projects),
|
||||||
MedicalRelease.where(project: projects),
|
MedicalRelease.where(project: projects),
|
||||||
|
MiscRelease.where(project: projects),
|
||||||
MatchingRequest.where(project: projects),
|
MatchingRequest.where(project: projects),
|
||||||
self
|
self
|
||||||
])).sum(:byte_size).to_f
|
])).sum(:byte_size).to_f
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def total_number_of_releases
|
||||||
|
[
|
||||||
|
MiscRelease.where(project: projects).size,
|
||||||
|
AppearanceRelease.where(project: projects).size,
|
||||||
|
TalentRelease.where(project: projects).size,
|
||||||
|
MaterialRelease.where(project: projects).size,
|
||||||
|
MedicalRelease.where(project: projects).size,
|
||||||
|
LocationRelease.where(project: projects).size,
|
||||||
|
AcquiredMediaRelease.where(project: projects).size,
|
||||||
|
MusicRelease.where(project: projects).size
|
||||||
|
].sum
|
||||||
|
end
|
||||||
|
|
||||||
def to_param
|
def to_param
|
||||||
slug
|
slug
|
||||||
end
|
end
|
||||||
@@ -81,6 +97,10 @@ class Account < ApplicationRecord
|
|||||||
plan_uid.to_s == "me_suite" || plan_uid.to_s == "releaseme"
|
plan_uid.to_s == "me_suite" || plan_uid.to_s == "releaseme"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def taskme_enabled?
|
||||||
|
plan_uid.to_s == "me_suite" || plan_uid.to_s == "taskme"
|
||||||
|
end
|
||||||
|
|
||||||
def plan_name
|
def plan_name
|
||||||
case plan_uid.to_s
|
case plan_uid.to_s
|
||||||
when "deliverme"
|
when "deliverme"
|
||||||
@@ -89,6 +109,8 @@ class Account < ApplicationRecord
|
|||||||
"DirectME"
|
"DirectME"
|
||||||
when "releaseme"
|
when "releaseme"
|
||||||
"ReleaseME"
|
"ReleaseME"
|
||||||
|
when "taskme"
|
||||||
|
"TaskME"
|
||||||
when "me_suite"
|
when "me_suite"
|
||||||
"ME Suite"
|
"ME Suite"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -9,10 +9,24 @@ class AcquiredMediaRelease < ApplicationRecord
|
|||||||
include Signable
|
include Signable
|
||||||
include Syncable
|
include Syncable
|
||||||
include PersonName
|
include PersonName
|
||||||
|
include CsvExportable
|
||||||
|
include Approvable
|
||||||
|
include GuardianPhotoable
|
||||||
|
include SecondGuardianPhotoable
|
||||||
|
include GuardianName
|
||||||
|
include SecondGuardianName
|
||||||
|
include FilesFilterable
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def custom_csv_exportable_headers
|
||||||
|
%i[name files_count owner_info]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# This association needs to be removed after changing the API. Removing it right now will cause failure in API specs.
|
||||||
has_many :file_infos, as: :releasable, dependent: :destroy
|
has_many :file_infos, as: :releasable, dependent: :destroy
|
||||||
|
|
||||||
accepts_nested_attributes_for :file_infos
|
has_many_attached :files
|
||||||
|
|
||||||
composed_of :person_address,
|
composed_of :person_address,
|
||||||
class_name: "Address",
|
class_name: "Address",
|
||||||
@@ -25,6 +39,38 @@ class AcquiredMediaRelease < ApplicationRecord
|
|||||||
%w(person_address_country country)
|
%w(person_address_country country)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
composed_of :guardian_address,
|
||||||
|
class_name: 'Address',
|
||||||
|
mapping: [
|
||||||
|
%w[guardian_address_street1 street1],
|
||||||
|
%w[guardian_address_street2 street2],
|
||||||
|
%w[guardian_address_city city],
|
||||||
|
%w[guardian_address_state state],
|
||||||
|
%w[guardian_address_zip zip],
|
||||||
|
%w[guardian_address_country country]
|
||||||
|
]
|
||||||
|
|
||||||
|
composed_of :guardian_2_address,
|
||||||
|
class_name: 'Address',
|
||||||
|
mapping: [
|
||||||
|
%w[guardian_2_address_street1 street1],
|
||||||
|
%w[guardian_2_address_street2 street2],
|
||||||
|
%w[guardian_2_address_city city],
|
||||||
|
%w[guardian_2_address_state state],
|
||||||
|
%w[guardian_2_address_zip zip],
|
||||||
|
%w[guardian_2_address_country country]
|
||||||
|
]
|
||||||
|
|
||||||
|
# We don't care for the argument but method WILL receive option name
|
||||||
|
# when called from inside with_option block, hence * argument
|
||||||
|
def self.face_photo_acceptable_content_types(*)
|
||||||
|
['image/png', 'image/jpeg']
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.acceptable_import_file_extensions
|
||||||
|
['.png', '.jpeg', '.jpg', '.pdf']
|
||||||
|
end
|
||||||
|
|
||||||
validates :name, presence: true
|
validates :name, presence: true
|
||||||
validates :person_email, email: true, allow_blank: true
|
validates :person_email, email: true, allow_blank: true
|
||||||
|
|
||||||
@@ -46,8 +92,8 @@ class AcquiredMediaRelease < ApplicationRecord
|
|||||||
# CATEGORIES = ["Artwork", "Film Footage", "Video Footage", "Still Photograph"].freeze
|
# CATEGORIES = ["Artwork", "Film Footage", "Video Footage", "Still Photograph"].freeze
|
||||||
CATEGORIES = ["Film Footage", "Video Footage", "Still Photograph"].freeze
|
CATEGORIES = ["Film Footage", "Video Footage", "Still Photograph"].freeze
|
||||||
|
|
||||||
def minor?
|
def second_guardian_present?
|
||||||
false
|
guardian_2_first_name.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
def contact_person
|
def contact_person
|
||||||
@@ -57,4 +103,8 @@ class AcquiredMediaRelease < ApplicationRecord
|
|||||||
def uses_edl?
|
def uses_edl?
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def files_count
|
||||||
|
files.any? ? files.size : I18n.t('acquired_media_releases.acquired_media_release.no_media')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ class AppHost
|
|||||||
use_ssl: false,
|
use_ssl: false,
|
||||||
},
|
},
|
||||||
production: {
|
production: {
|
||||||
host: "bigmedia.ai",
|
host: "mesuite.ai",
|
||||||
use_ssl: true,
|
use_ssl: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,10 +12,57 @@ class AppearanceRelease < ApplicationRecord
|
|||||||
include Taggable
|
include Taggable
|
||||||
include PersonName
|
include PersonName
|
||||||
include GuardianPhotoable
|
include GuardianPhotoable
|
||||||
|
include SecondGuardianPhotoable
|
||||||
include GuardianName
|
include GuardianName
|
||||||
|
include SecondGuardianName
|
||||||
|
include CsvExportable
|
||||||
|
include Approvable
|
||||||
|
include Amendmenable
|
||||||
|
|
||||||
|
NUMBER_OF_CUSTOM_FIELDS = 15
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def custom_csv_exportable_headers
|
||||||
|
%i[name contact_info]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
has_one_attached :person_photo
|
has_one_attached :person_photo
|
||||||
|
|
||||||
|
composed_of :person_address,
|
||||||
|
class_name: 'Address',
|
||||||
|
mapping: [
|
||||||
|
%w[person_address_street1 street1],
|
||||||
|
%w[person_address_street2 street2],
|
||||||
|
%w[person_address_city city],
|
||||||
|
%w[person_address_state state],
|
||||||
|
%w[person_address_zip zip],
|
||||||
|
%w[person_address_country country]
|
||||||
|
]
|
||||||
|
|
||||||
|
composed_of :guardian_address,
|
||||||
|
class_name: 'Address',
|
||||||
|
mapping: [
|
||||||
|
%w[guardian_address_street1 street1],
|
||||||
|
%w[guardian_address_street2 street2],
|
||||||
|
%w[guardian_address_city city],
|
||||||
|
%w[guardian_address_state state],
|
||||||
|
%w[guardian_address_zip zip],
|
||||||
|
%w[guardian_address_country country]
|
||||||
|
]
|
||||||
|
|
||||||
|
composed_of :guardian_2_address,
|
||||||
|
class_name: 'Address',
|
||||||
|
mapping: [
|
||||||
|
%w[guardian_2_address_street1 street1],
|
||||||
|
%w[guardian_2_address_street2 street2],
|
||||||
|
%w[guardian_2_address_city city],
|
||||||
|
%w[guardian_2_address_state state],
|
||||||
|
%w[guardian_2_address_zip zip],
|
||||||
|
%w[guardian_2_address_country country]
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
# These validations apply to all releases
|
# These validations apply to all releases
|
||||||
validates :person_email, email: true, allow_blank: true
|
validates :person_email, email: true, allow_blank: true
|
||||||
validates :person_first_name, :person_last_name, presence: true
|
validates :person_first_name, :person_last_name, presence: true
|
||||||
@@ -71,7 +118,18 @@ class AppearanceRelease < ApplicationRecord
|
|||||||
scope :having_no_person_photo, -> { left_joins(:person_photo_attachment).group(:id).having('COUNT(active_storage_attachments) = 0') }
|
scope :having_no_person_photo, -> { left_joins(:person_photo_attachment).group(:id).having('COUNT(active_storage_attachments) = 0') }
|
||||||
scope :with_person_name, ->(name) { where('person_first_name ILIKE ? OR person_last_name ILIKE ?', "%#{name}%") }
|
scope :with_person_name, ->(name) { where('person_first_name ILIKE ? OR person_last_name ILIKE ?', "%#{name}%") }
|
||||||
|
|
||||||
searchable_on %i[person_first_name person_last_name person_address person_email person_phone]
|
searchable_on %i[
|
||||||
|
person_first_name
|
||||||
|
person_last_name
|
||||||
|
person_address_street1
|
||||||
|
person_address_street2
|
||||||
|
person_address_city
|
||||||
|
person_address_state
|
||||||
|
person_address_zip
|
||||||
|
person_address_country
|
||||||
|
person_email
|
||||||
|
person_phone
|
||||||
|
]
|
||||||
|
|
||||||
# All releases must respond to the following messages
|
# All releases must respond to the following messages
|
||||||
def name
|
def name
|
||||||
@@ -98,6 +156,10 @@ class AppearanceRelease < ApplicationRecord
|
|||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def second_guardian_present?
|
||||||
|
self.guardian_2_first_name.present?
|
||||||
|
end
|
||||||
|
|
||||||
def contract_file_name
|
def contract_file_name
|
||||||
"#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime('%Y.%m.%d')}_#{release_number}_#{filename_suffix.parameterize}"
|
"#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime('%Y.%m.%d')}_#{release_number}_#{filename_suffix.parameterize}"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -30,8 +30,16 @@ class Broadcast < ApplicationRecord
|
|||||||
"https://stream.mux.com/#{stream_playback_uid}.m3u8"
|
"https://stream.mux.com/#{stream_playback_uid}.m3u8"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def full_live_stream_playback_url
|
||||||
|
full_live_stream_playback_uid.blank? ? stream_playback_url : "https://stream.mux.com/#{full_live_stream_playback_uid}.m3u8"
|
||||||
|
end
|
||||||
|
|
||||||
def stream_server_url
|
def stream_server_url
|
||||||
ENV['MUX_BROADCAST_SERVER_URL']
|
stream_url_override.presence || ENV["MUX_BROADCAST_SERVER_URL"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def stream_server_key
|
||||||
|
stream_key_override.presence || stream_key
|
||||||
end
|
end
|
||||||
|
|
||||||
def zoom_meeting_url
|
def zoom_meeting_url
|
||||||
@@ -41,11 +49,13 @@ class Broadcast < ApplicationRecord
|
|||||||
private
|
private
|
||||||
|
|
||||||
def create_mux_live_stream
|
def create_mux_live_stream
|
||||||
stream = MuxLiveStream.new
|
stream = MuxLiveStream.create_with_simulcast
|
||||||
|
|
||||||
self.stream_uid = stream.id
|
self.stream_uid = stream.id
|
||||||
self.stream_key = stream.key
|
self.stream_key = stream.key
|
||||||
self.stream_playback_uid = stream.playback_id
|
self.stream_playback_uid = stream.playback_id
|
||||||
|
self.simulcast_uid = stream.simulcast_id
|
||||||
|
self.director_mode_video_embed ||= stream.simulcast_destination.try(:playback_embed)
|
||||||
self.save!
|
self.save!
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,12 @@ class BroadcastRecording < ApplicationRecord
|
|||||||
|
|
||||||
validates :asset_uid, uniqueness: true
|
validates :asset_uid, uniqueness: true
|
||||||
|
|
||||||
|
scope :visible, -> { where(hidden: false) }
|
||||||
|
|
||||||
|
before_save :set_title_and_description
|
||||||
|
|
||||||
def download_url
|
def download_url
|
||||||
"https://stream.mux.com/#{asset_playback_uid}/#{file_name}?download=#{download_file_name}"
|
"https://stream.mux.com/#{asset_playback_uid}/#{file_name}?download=#{name}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def playback_url
|
def playback_url
|
||||||
@@ -14,6 +18,21 @@ class BroadcastRecording < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
def download_file_name
|
def download_file_name
|
||||||
"#{broadcast_name}_Date_#{created_at.strftime("%Y-%m-%d")}_Time_#{created_at.strftime("%T")}".parameterize
|
"#{broadcast_name}_Date_#{Time.now.in_time_zone(broadcast.shoot_location_time_zone).strftime("%Y-%m-%d")}_Time_#{Time.now.in_time_zone(broadcast.shoot_location_time_zone).strftime("%T")}".parameterize
|
||||||
|
end
|
||||||
|
|
||||||
|
def toggle_star
|
||||||
|
toggle! :starred
|
||||||
|
end
|
||||||
|
|
||||||
|
def thumbnail_url(width = 300)
|
||||||
|
"https://image.mux.com/#{asset_playback_uid}/thumbnail.jpg?width=#{width}"
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_title_and_description
|
||||||
|
self.name ||= download_file_name
|
||||||
|
self.description ||= "No description provided for this recording."
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
32
app/models/concerns/amendmenable.rb
Normal file
32
app/models/concerns/amendmenable.rb
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
module Amendmenable
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
include ActiveStorageSupport::SupportForBase64
|
||||||
|
|
||||||
|
has_one_base64_attached :amendment_signature
|
||||||
|
|
||||||
|
with_options on: :amendment do
|
||||||
|
validates :amendment_signer_name, presence: true
|
||||||
|
validates :amendment_signature, attached: true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def amendment_signable?
|
||||||
|
contract_template.present? && contract_template.amendment_clause.present?
|
||||||
|
end
|
||||||
|
|
||||||
|
def amendment_signed?
|
||||||
|
amendment_signature.attached?
|
||||||
|
end
|
||||||
|
|
||||||
|
def amendment_signature_base64
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def amendment_signature_base64=(data_uri)
|
||||||
|
return if data_uri.blank?
|
||||||
|
|
||||||
|
amendment_signature.attach(data: data_uri, filename: "amendment_signature.png", content_type: "image/png", identify: "false")
|
||||||
|
end
|
||||||
|
end
|
||||||
26
app/models/concerns/approvable.rb
Normal file
26
app/models/concerns/approvable.rb
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
module Approvable
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
include ActiveStorageSupport::SupportForBase64
|
||||||
|
|
||||||
|
has_one_base64_attached :approved_by_user_signature
|
||||||
|
|
||||||
|
# Requires signature when saving in the approval context
|
||||||
|
with_options on: :approval do
|
||||||
|
validates :approved_by_user_signature, attached: true
|
||||||
|
end
|
||||||
|
|
||||||
|
def approve_by(user)
|
||||||
|
return unless approved_at.nil?
|
||||||
|
|
||||||
|
self.approved_by_user_name = user.full_name
|
||||||
|
self.approved_by_user_email = user.email
|
||||||
|
self.approved_at = BigMediaTime.time_zone_now
|
||||||
|
end
|
||||||
|
|
||||||
|
def approved?
|
||||||
|
self.approved_at.present?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
65
app/models/concerns/csv_exportable.rb
Normal file
65
app/models/concerns/csv_exportable.rb
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module CsvExportable
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
COMMON_HEADERS = %i[approved notes tags signed_at].freeze
|
||||||
|
COMMON_VALUES = %w[approved? clean_notes clean_tags signed_on].freeze
|
||||||
|
|
||||||
|
included do
|
||||||
|
class << self
|
||||||
|
def custom_csv_exportable_headers
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
|
||||||
|
def csv_headers
|
||||||
|
headers = custom_csv_exportable_headers + COMMON_HEADERS
|
||||||
|
|
||||||
|
headers.map do |header|
|
||||||
|
I18n.t("#{model_name.plural}.index.table_headers.#{header}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_csv_row
|
||||||
|
(self.class.custom_csv_exportable_headers + COMMON_VALUES).map do |function|
|
||||||
|
send(function)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def owner_info
|
||||||
|
compact_contact_info(name: person_name, address: person_address, phone: person_phone, email: person_email)
|
||||||
|
end
|
||||||
|
|
||||||
|
def contact_info
|
||||||
|
owner_info
|
||||||
|
end
|
||||||
|
|
||||||
|
def compact_contact_info(name: nil, address: nil, phone: nil, email: nil)
|
||||||
|
contact_info = ''
|
||||||
|
contact_info += "#{name}; " if name.present?
|
||||||
|
contact_info += "#{address}; " if address.present?
|
||||||
|
contact_info += "P: #{phone}; " if phone.present?
|
||||||
|
contact_info += "E: #{email}" if email.present?
|
||||||
|
contact_info.delete_suffix '; '
|
||||||
|
end
|
||||||
|
|
||||||
|
def clean_notes
|
||||||
|
notes = ''
|
||||||
|
self.notes.order_by_recent.each do |note|
|
||||||
|
notes += "#{note.content}(#{note.email}), "
|
||||||
|
end
|
||||||
|
notes.delete_suffix ', '
|
||||||
|
end
|
||||||
|
|
||||||
|
def clean_tags
|
||||||
|
tags = ''
|
||||||
|
self.tags.each do |tag|
|
||||||
|
tags += "#{tag.name}, "
|
||||||
|
end
|
||||||
|
tags.delete_suffix ', '
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
17
app/models/concerns/files_filterable.rb
Normal file
17
app/models/concerns/files_filterable.rb
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
module FilesFilterable
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
def image_files
|
||||||
|
files_blobs.where("content_type ILIKE ?", "%image%")
|
||||||
|
end
|
||||||
|
|
||||||
|
def video_files
|
||||||
|
files_blobs.where("content_type ILIKE ?", "%video%")
|
||||||
|
end
|
||||||
|
|
||||||
|
def other_files
|
||||||
|
files_blobs.where("NOT content_type ILIKE ANY (array[?])", ["%image%", "%video%"])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
20
app/models/concerns/second_guardian_name.rb
Normal file
20
app/models/concerns/second_guardian_name.rb
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
module SecondGuardianName
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
def guardian_2_name
|
||||||
|
"#{guardian_2_first_name} #{guardian_2_last_name}".titleize
|
||||||
|
end
|
||||||
|
|
||||||
|
def guardian_2_name=(value)
|
||||||
|
if value.include?(' ')
|
||||||
|
split = value.split(" ", 2)
|
||||||
|
self.guardian_2_first_name = split.first
|
||||||
|
self.guardian_2_last_name = split.last
|
||||||
|
else
|
||||||
|
self.guardian_2_first_name = value
|
||||||
|
self.guardian_2_last_name = "(Not Given)"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
9
app/models/concerns/second_guardian_photoable.rb
Normal file
9
app/models/concerns/second_guardian_photoable.rb
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
module SecondGuardianPhotoable
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
has_one_attached :guardian_2_photo
|
||||||
|
|
||||||
|
validates :guardian_2_photo, content_type: ["image/png", "image/jpeg"]
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -29,6 +29,10 @@ class Contract
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def medical_release?
|
||||||
|
@releasable.instance_of?(MedicalRelease)
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def contract_template
|
def contract_template
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ class ContractTemplate < ApplicationRecord
|
|||||||
include Syncable
|
include Syncable
|
||||||
include PgSearch
|
include PgSearch
|
||||||
|
|
||||||
|
NUMBER_OF_CUSTOM_FIELDS = 15
|
||||||
|
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
belongs_to :parent, class_name: 'ContractTemplate', optional: true
|
belongs_to :parent, class_name: 'ContractTemplate', optional: true
|
||||||
has_many :duplicates, class_name: 'ContractTemplate', foreign_key: 'parent_id'
|
has_many :duplicates, class_name: 'ContractTemplate', foreign_key: 'parent_id'
|
||||||
@@ -14,10 +16,16 @@ class ContractTemplate < ApplicationRecord
|
|||||||
has_many :location_releases, dependent: :restrict_with_error
|
has_many :location_releases, dependent: :restrict_with_error
|
||||||
has_many :material_releases, dependent: :restrict_with_error
|
has_many :material_releases, dependent: :restrict_with_error
|
||||||
has_many :medical_releases, dependent: :restrict_with_error
|
has_many :medical_releases, dependent: :restrict_with_error
|
||||||
|
has_many :misc_releases, dependent: :restrict_with_error
|
||||||
|
|
||||||
monetize :fee_cents
|
monetize :fee_cents
|
||||||
has_rich_text :body
|
has_rich_text :body
|
||||||
has_rich_text :guardian_clause
|
has_rich_text :guardian_clause
|
||||||
|
has_rich_text :signature_legal_text
|
||||||
|
has_rich_text :amendment_clause
|
||||||
|
has_rich_text :exhibit_a_legal_text
|
||||||
|
has_rich_text :exhibit_b_legal_text
|
||||||
|
has_rich_text :questionnaire_legal_text
|
||||||
|
|
||||||
validates :name, presence: true
|
validates :name, presence: true
|
||||||
validates :release_type, presence: true
|
validates :release_type, presence: true
|
||||||
@@ -39,6 +47,8 @@ class ContractTemplate < ApplicationRecord
|
|||||||
scope :non_archived, -> { where(archived_at: nil) }
|
scope :non_archived, -> { where(archived_at: nil) }
|
||||||
scope :order_by_name, -> { order(:name) }
|
scope :order_by_name, -> { order(:name) }
|
||||||
|
|
||||||
|
enum accessibility: [:public_template, :private_template]
|
||||||
|
|
||||||
def fee?
|
def fee?
|
||||||
!fee.zero?
|
!fee.zero?
|
||||||
end
|
end
|
||||||
@@ -51,7 +61,33 @@ class ContractTemplate < ApplicationRecord
|
|||||||
parent.present?
|
parent.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def archived?
|
||||||
|
archived_at.present?
|
||||||
|
end
|
||||||
|
|
||||||
def archive
|
def archive
|
||||||
update(archived_at: Time.zone.now)
|
update(archived_at: Time.zone.now)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def has_questionnaire?
|
||||||
|
(1..NUMBER_OF_CUSTOM_FIELDS).any? { |n| public_send("question_#{n}_text").presence }
|
||||||
|
end
|
||||||
|
|
||||||
|
def has_exhibit_a?
|
||||||
|
exhibit_a_legal_text.present?
|
||||||
|
end
|
||||||
|
|
||||||
|
def has_exhibit_b?
|
||||||
|
exhibit_b_legal_text.present?
|
||||||
|
end
|
||||||
|
|
||||||
|
def editable?
|
||||||
|
releases.size.zero?
|
||||||
|
end
|
||||||
|
|
||||||
|
def attributes
|
||||||
|
result = super()
|
||||||
|
result[:signature_legal_text] = signature_legal_text.as_json
|
||||||
|
result
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -10,6 +10,15 @@ class LocationRelease < ApplicationRecord
|
|||||||
include Syncable
|
include Syncable
|
||||||
include Taggable
|
include Taggable
|
||||||
include PersonName
|
include PersonName
|
||||||
|
include CsvExportable
|
||||||
|
include Approvable
|
||||||
|
include Amendmenable
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def custom_csv_exportable_headers
|
||||||
|
%i[location_info owner_info amendment_signed_column]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
composed_of :address,
|
composed_of :address,
|
||||||
mapping: [
|
mapping: [
|
||||||
@@ -58,6 +67,18 @@ class LocationRelease < ApplicationRecord
|
|||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def location_info
|
||||||
|
compact_contact_info(name: name, address: address)
|
||||||
|
end
|
||||||
|
|
||||||
|
def amendment_signed_column
|
||||||
|
if amendment_signable?
|
||||||
|
amendment_signed?
|
||||||
|
else
|
||||||
|
I18n.t('location_releases.csv.no_amendment_clause')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def end_date_after_start_date
|
def end_date_after_start_date
|
||||||
|
|||||||
@@ -3,15 +3,28 @@ class MaterialRelease < ApplicationRecord
|
|||||||
include Contractable
|
include Contractable
|
||||||
include Exploitable
|
include Exploitable
|
||||||
include Notable
|
include Notable
|
||||||
include Photoable
|
include Photoable # This association needs to be removed after changing the API. Removing it right now will cause failure in API specs.
|
||||||
include Releasable
|
include Releasable
|
||||||
include Searchable
|
include Searchable
|
||||||
include Signable
|
include Signable
|
||||||
include Syncable
|
include Syncable
|
||||||
include Taggable
|
include Taggable
|
||||||
include PersonName
|
include PersonName
|
||||||
|
include CsvExportable
|
||||||
composed_of :person_address,
|
include Approvable
|
||||||
|
include GuardianPhotoable
|
||||||
|
include SecondGuardianPhotoable
|
||||||
|
include GuardianName
|
||||||
|
include SecondGuardianName
|
||||||
|
include FilesFilterable
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def custom_csv_exportable_headers
|
||||||
|
%i[name owner_info files_count]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
composed_of :person_address,
|
||||||
class_name: "Address",
|
class_name: "Address",
|
||||||
mapping: [
|
mapping: [
|
||||||
%w(person_address_street1 street1),
|
%w(person_address_street1 street1),
|
||||||
@@ -22,6 +35,41 @@ class MaterialRelease < ApplicationRecord
|
|||||||
%w(person_address_country country)
|
%w(person_address_country country)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
composed_of :guardian_address,
|
||||||
|
class_name: 'Address',
|
||||||
|
mapping: [
|
||||||
|
%w[guardian_address_street1 street1],
|
||||||
|
%w[guardian_address_street2 street2],
|
||||||
|
%w[guardian_address_city city],
|
||||||
|
%w[guardian_address_state state],
|
||||||
|
%w[guardian_address_zip zip],
|
||||||
|
%w[guardian_address_country country]
|
||||||
|
]
|
||||||
|
|
||||||
|
composed_of :guardian_2_address,
|
||||||
|
class_name: 'Address',
|
||||||
|
mapping: [
|
||||||
|
%w[guardian_2_address_street1 street1],
|
||||||
|
%w[guardian_2_address_street2 street2],
|
||||||
|
%w[guardian_2_address_city city],
|
||||||
|
%w[guardian_2_address_state state],
|
||||||
|
%w[guardian_2_address_zip zip],
|
||||||
|
%w[guardian_2_address_country country]
|
||||||
|
]
|
||||||
|
|
||||||
|
has_many_attached :files
|
||||||
|
|
||||||
|
# We don't care for the argument but method WILL receive option name
|
||||||
|
# when called from inside with_option block, hence * argument
|
||||||
|
def self.face_photo_acceptable_content_types(*)
|
||||||
|
['image/png', 'image/jpeg']
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.acceptable_import_file_extensions
|
||||||
|
['.png', '.jpeg', '.jpg', '.pdf']
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
validates :name, presence: true
|
validates :name, presence: true
|
||||||
validates :person_email, email: true, allow_blank: true
|
validates :person_email, email: true, allow_blank: true
|
||||||
|
|
||||||
@@ -30,20 +78,24 @@ class MaterialRelease < ApplicationRecord
|
|||||||
validates :signature, attached: true
|
validates :signature, attached: true
|
||||||
end
|
end
|
||||||
|
|
||||||
searchable_on %i[
|
searchable_on %i[
|
||||||
name
|
name
|
||||||
person_address_street1 person_address_street2 person_address_city person_address_state person_address_zip person_address_country
|
person_address_street1 person_address_street2 person_address_city person_address_state person_address_zip person_address_country
|
||||||
]
|
]
|
||||||
|
|
||||||
def contact_person
|
def contact_person
|
||||||
@contact_person ||= Contact.new(person_name, person_address, person_email, person_phone)
|
@contact_person ||= Contact.new(person_name, person_address, person_email, person_phone)
|
||||||
end
|
end
|
||||||
|
|
||||||
def minor?
|
def second_guardian_present?
|
||||||
false
|
guardian_2_first_name.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
def uses_edl?
|
def uses_edl?
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def files_count
|
||||||
|
files.any? ? files.size : I18n.t('material_releases.material_release.no_media')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -7,16 +7,52 @@ class MedicalRelease < ApplicationRecord
|
|||||||
include Signable
|
include Signable
|
||||||
include Syncable
|
include Syncable
|
||||||
include PersonName
|
include PersonName
|
||||||
|
include GuardianPhotoable
|
||||||
|
include SecondGuardianPhotoable
|
||||||
|
include GuardianName
|
||||||
|
include SecondGuardianName
|
||||||
|
include CsvExportable
|
||||||
|
include Approvable
|
||||||
|
|
||||||
composed_of :person_address,
|
class << self
|
||||||
|
def custom_csv_exportable_headers
|
||||||
|
%i[name contact_info]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
NUMBER_OF_CUSTOM_FIELDS = 15
|
||||||
|
|
||||||
|
composed_of :person_address,
|
||||||
class_name: "Address",
|
class_name: "Address",
|
||||||
mapping: [
|
mapping: [
|
||||||
%w(person_address_street1 street1),
|
%w[person_address_street1 street1],
|
||||||
%w(person_address_street2 street2),
|
%w[person_address_street2 street2],
|
||||||
%w(person_address_city city),
|
%w[person_address_city city],
|
||||||
%w(person_address_state state),
|
%w[person_address_state state],
|
||||||
%w(person_address_zip zip),
|
%w[person_address_zip zip],
|
||||||
%w(person_address_country country)
|
%w[person_address_country country]
|
||||||
|
]
|
||||||
|
|
||||||
|
composed_of :guardian_address,
|
||||||
|
class_name: 'Address',
|
||||||
|
mapping: [
|
||||||
|
%w[guardian_address_street1 street1],
|
||||||
|
%w[guardian_address_street2 street2],
|
||||||
|
%w[guardian_address_city city],
|
||||||
|
%w[guardian_address_state state],
|
||||||
|
%w[guardian_address_zip zip],
|
||||||
|
%w[guardian_address_country country]
|
||||||
|
]
|
||||||
|
|
||||||
|
composed_of :guardian_2_address,
|
||||||
|
class_name: 'Address',
|
||||||
|
mapping: [
|
||||||
|
%w[guardian_2_address_street1 street1],
|
||||||
|
%w[guardian_2_address_street2 street2],
|
||||||
|
%w[guardian_2_address_city city],
|
||||||
|
%w[guardian_2_address_state state],
|
||||||
|
%w[guardian_2_address_zip zip],
|
||||||
|
%w[guardian_2_address_country country]
|
||||||
]
|
]
|
||||||
|
|
||||||
def self.face_photo_acceptable_content_types
|
def self.face_photo_acceptable_content_types
|
||||||
@@ -26,9 +62,16 @@ class MedicalRelease < ApplicationRecord
|
|||||||
# These validations apply to all releases
|
# These validations apply to all releases
|
||||||
validates :person_first_name, :person_last_name, presence: true
|
validates :person_first_name, :person_last_name, presence: true
|
||||||
validates :person_email, email: true, allow_blank: true
|
validates :person_email, email: true, allow_blank: true
|
||||||
|
validate :valid_answers
|
||||||
|
|
||||||
acts_as_taggable_on :internal_tags, :tags
|
acts_as_taggable_on :internal_tags, :tags
|
||||||
|
|
||||||
|
# These validations apply to releases being signed by a minor
|
||||||
|
with_options if: :minor? do
|
||||||
|
validates :guardian_email, email: true, allow_blank: true
|
||||||
|
validates :guardian_2_email, email: true, allow_blank: true
|
||||||
|
end
|
||||||
|
|
||||||
# These validations apply to releases created natively by the system (i.e. not imported from elsewhere)
|
# These validations apply to releases created natively by the system (i.e. not imported from elsewhere)
|
||||||
with_options on: :native do
|
with_options on: :native do
|
||||||
validates :signature, attached: true
|
validates :signature, attached: true
|
||||||
@@ -61,11 +104,18 @@ class MedicalRelease < ApplicationRecord
|
|||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
def minor?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def contract_file_name
|
def contract_file_name
|
||||||
"#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime("%Y.%m.%d")}_#{release_number}_#{filename_suffix.parameterize}"
|
"#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime("%Y.%m.%d")}_#{release_number}_#{filename_suffix.parameterize}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def valid_answers
|
||||||
|
(1..ContractTemplate::NUMBER_OF_CUSTOM_FIELDS).each do |index|
|
||||||
|
if contract_template && contract_template["question_#{index}_text"].present? &&
|
||||||
|
public_send("question_#{index}_answer").blank?
|
||||||
|
errors.add("question_#{index}", I18n.t('medical_releases.custom_validation_errors.question_answer_is_required'))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
41
app/models/millicast_destination.rb
Normal file
41
app/models/millicast_destination.rb
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
class MillicastDestination
|
||||||
|
attr_reader :name, :token
|
||||||
|
|
||||||
|
def self.create
|
||||||
|
token_stream_name = SecureRandom.urlsafe_base64
|
||||||
|
|
||||||
|
publish_token = Millicast::PublishToken.create(
|
||||||
|
label: SecureRandom.urlsafe_base64,
|
||||||
|
streams: [
|
||||||
|
{ streamName: token_stream_name }
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
new(token_stream_name, publish_token.data.token)
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize(name, token)
|
||||||
|
@name = name
|
||||||
|
@token = token
|
||||||
|
end
|
||||||
|
|
||||||
|
def account_id
|
||||||
|
ENV["MILLICAST_ACCOUNT_ID"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def key
|
||||||
|
"#{name}?token=#{token}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def url
|
||||||
|
"rtmp://live-rtmp-pub.millicast.com:1935/v2/pub"
|
||||||
|
end
|
||||||
|
|
||||||
|
def playback_url
|
||||||
|
"https://viewer.millicast.com/v2?streamId=#{account_id}/#{name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def playback_embed
|
||||||
|
"<iframe src=\"#{playback_url}\" allowfullscreen width=\"640\" height=\"480\"></iframe>"
|
||||||
|
end
|
||||||
|
end
|
||||||
97
app/models/misc_release.rb
Normal file
97
app/models/misc_release.rb
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
class MiscRelease < ApplicationRecord
|
||||||
|
include Contractable
|
||||||
|
include Notable
|
||||||
|
include Photoable
|
||||||
|
include Releasable
|
||||||
|
include Searchable
|
||||||
|
include Signable
|
||||||
|
include Syncable
|
||||||
|
include PersonName
|
||||||
|
include GuardianName
|
||||||
|
include GuardianPhotoable
|
||||||
|
include CsvExportable
|
||||||
|
include Approvable
|
||||||
|
include Exploitable
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def custom_csv_exportable_headers
|
||||||
|
%i[name contact_info]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
NUMBER_OF_CUSTOM_FIELDS = 15
|
||||||
|
|
||||||
|
composed_of :person_address,
|
||||||
|
class_name: "Address",
|
||||||
|
mapping: [
|
||||||
|
%w(person_address_street1 street1),
|
||||||
|
%w(person_address_street2 street2),
|
||||||
|
%w(person_address_city city),
|
||||||
|
%w(person_address_state state),
|
||||||
|
%w(person_address_zip zip),
|
||||||
|
%w(person_address_country country)
|
||||||
|
]
|
||||||
|
|
||||||
|
composed_of :guardian_address,
|
||||||
|
class_name: "Address",
|
||||||
|
mapping: [
|
||||||
|
%w(guardian_address_street1 street1),
|
||||||
|
%w(guardian_address_street2 street2),
|
||||||
|
%w(guardian_address_city city),
|
||||||
|
%w(guardian_address_state state),
|
||||||
|
%w(guardian_address_zip zip),
|
||||||
|
%w(guardian_address_country country)
|
||||||
|
]
|
||||||
|
|
||||||
|
def self.face_photo_acceptable_content_types
|
||||||
|
["image/png", "image/jpeg"]
|
||||||
|
end
|
||||||
|
|
||||||
|
# These validations apply to all releases
|
||||||
|
validates :person_first_name, :person_last_name, presence: true
|
||||||
|
validates :person_email, email: true, allow_blank: true
|
||||||
|
|
||||||
|
acts_as_taggable_on :internal_tags, :tags
|
||||||
|
|
||||||
|
# These validations apply to releases created natively by the system (i.e. not imported from elsewhere)
|
||||||
|
with_options on: :native do
|
||||||
|
validates :signature, attached: true
|
||||||
|
end
|
||||||
|
|
||||||
|
# These validations apply to releases imported to the system from an outside source
|
||||||
|
with_options on: :non_native do
|
||||||
|
validates :contract, attached: true
|
||||||
|
end
|
||||||
|
|
||||||
|
with_options if: :minor? do
|
||||||
|
validates :guardian_first_name, :guardian_last_name, presence: true
|
||||||
|
validates :guardian_phone, presence: true
|
||||||
|
end
|
||||||
|
|
||||||
|
searchable_on %i[
|
||||||
|
person_first_name person_last_name person_email person_phone
|
||||||
|
person_address_street1 person_address_street2 person_address_city person_address_state person_address_zip person_address_country
|
||||||
|
guardian_address_street1 guardian_address_street2 guardian_address_city guardian_address_state guardian_address_zip guardian_address_country
|
||||||
|
]
|
||||||
|
|
||||||
|
# All releases must respond to the following messages
|
||||||
|
def name
|
||||||
|
person_name
|
||||||
|
end
|
||||||
|
|
||||||
|
def filename_suffix
|
||||||
|
"#{person_last_name} #{person_first_name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def contact_person
|
||||||
|
@contact_person ||= Contact.new(person_name, person_address, person_email, person_phone)
|
||||||
|
end
|
||||||
|
|
||||||
|
def uses_edl?
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def contract_file_name
|
||||||
|
"#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime("%Y.%m.%d")}_#{release_number}_#{filename_suffix.parameterize}"
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -7,7 +7,15 @@ class MusicRelease < ApplicationRecord
|
|||||||
include Searchable
|
include Searchable
|
||||||
include Taggable
|
include Taggable
|
||||||
include PersonName
|
include PersonName
|
||||||
|
include CsvExportable
|
||||||
|
include Approvable
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def custom_csv_exportable_headers
|
||||||
|
%i[name file_infos_count composers_count publishers_count]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
has_many :file_infos, as: :releasable, dependent: :destroy
|
has_many :file_infos, as: :releasable, dependent: :destroy
|
||||||
has_many :composers, dependent: :destroy
|
has_many :composers, dependent: :destroy
|
||||||
has_many :publishers, dependent: :destroy
|
has_many :publishers, dependent: :destroy
|
||||||
@@ -72,6 +80,18 @@ class MusicRelease < ApplicationRecord
|
|||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def file_infos_count
|
||||||
|
file_infos.size
|
||||||
|
end
|
||||||
|
|
||||||
|
def composers_count
|
||||||
|
composers.size
|
||||||
|
end
|
||||||
|
|
||||||
|
def publishers_count
|
||||||
|
publishers.size
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def publisher_percentages_add_up_to_100
|
def publisher_percentages_add_up_to_100
|
||||||
|
|||||||
@@ -1,4 +1,15 @@
|
|||||||
class MuxLiveStream
|
class MuxLiveStream
|
||||||
|
attr_accessor :simulcast_id, :simulcast_destination
|
||||||
|
|
||||||
|
def self.create_with_simulcast(destination = nil)
|
||||||
|
destination ||= MillicastDestination.create
|
||||||
|
|
||||||
|
MuxLiveStream.new.tap do |stream|
|
||||||
|
stream.id # force the live stream to be created by calling for its id
|
||||||
|
stream.create_simulcast(destination)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def id
|
def id
|
||||||
live_stream.data.id
|
live_stream.data.id
|
||||||
end
|
end
|
||||||
@@ -15,6 +26,15 @@ class MuxLiveStream
|
|||||||
client.delete_live_stream(stream_uid)
|
client.delete_live_stream(stream_uid)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def create_simulcast(destination)
|
||||||
|
return if test_mode_enabled?
|
||||||
|
|
||||||
|
request = MuxRuby::CreateSimulcastTargetRequest.new(stream_key: destination.key, url: destination.url)
|
||||||
|
result = client.create_live_stream_simulcast_target(id, request)
|
||||||
|
self.simulcast_destination = destination
|
||||||
|
self.simulcast_id = result.data.id
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def live_stream
|
def live_stream
|
||||||
|
|||||||
@@ -2,9 +2,10 @@ class Project < ApplicationRecord
|
|||||||
include Archivable
|
include Archivable
|
||||||
include Filterable
|
include Filterable
|
||||||
include Syncable
|
include Syncable
|
||||||
|
include PgSearch
|
||||||
|
|
||||||
SIGNABLE_RELEASE_TYPES = %w(talent appearance acquired_media location material medical)
|
SIGNABLE_RELEASE_TYPES = %w(talent appearance acquired_media location material medical misc)
|
||||||
AVAILABLE_RELEASE_TYPES = %w(appearance location material acquired_media talent music medical)
|
AVAILABLE_RELEASE_TYPES = %w(appearance location material acquired_media talent music medical misc)
|
||||||
|
|
||||||
belongs_to :account
|
belongs_to :account
|
||||||
has_many :acquired_media_releases, dependent: :destroy
|
has_many :acquired_media_releases, dependent: :destroy
|
||||||
@@ -14,6 +15,7 @@ class Project < ApplicationRecord
|
|||||||
has_many :music_releases, dependent: :destroy
|
has_many :music_releases, dependent: :destroy
|
||||||
has_many :talent_releases, dependent: :destroy
|
has_many :talent_releases, dependent: :destroy
|
||||||
has_many :medical_releases, dependent: :destroy
|
has_many :medical_releases, dependent: :destroy
|
||||||
|
has_many :misc_releases, dependent: :destroy
|
||||||
has_many :videos, dependent: :destroy
|
has_many :videos, dependent: :destroy
|
||||||
has_many :imports, dependent: :destroy
|
has_many :imports, dependent: :destroy
|
||||||
has_many :contract_templates, dependent: :destroy
|
has_many :contract_templates, dependent: :destroy
|
||||||
@@ -23,6 +25,7 @@ class Project < ApplicationRecord
|
|||||||
has_many :downloads, dependent: :destroy
|
has_many :downloads, dependent: :destroy
|
||||||
has_many :broadcasts, dependent: :destroy
|
has_many :broadcasts, dependent: :destroy
|
||||||
has_many :zoom_meetings, dependent: :destroy
|
has_many :zoom_meetings, dependent: :destroy
|
||||||
|
has_many :task_requests, dependent: :destroy
|
||||||
|
|
||||||
accepts_nested_attributes_for :project_memberships
|
accepts_nested_attributes_for :project_memberships
|
||||||
|
|
||||||
@@ -35,10 +38,20 @@ class Project < ApplicationRecord
|
|||||||
music_release: false,
|
music_release: false,
|
||||||
talent_release: false,
|
talent_release: false,
|
||||||
medical_release: false,
|
medical_release: false,
|
||||||
|
misc_release: false,
|
||||||
video_analysis: false,
|
video_analysis: false,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
pg_search_scope :search, {
|
||||||
|
against: [:name],
|
||||||
|
using: {
|
||||||
|
tsearch: {any_word: true, prefix: true},
|
||||||
|
trigram: {},
|
||||||
|
dmetaphone: {any_word: true}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
validates :name, presence: true, uniqueness: { scope: :account_id }
|
validates :name, presence: true, uniqueness: { scope: :account_id }
|
||||||
|
|
||||||
filterable_by :active, :inactive, :archived
|
filterable_by :active, :inactive, :archived
|
||||||
@@ -68,6 +81,7 @@ class Project < ApplicationRecord
|
|||||||
music_release: true,
|
music_release: true,
|
||||||
talent_release: true,
|
talent_release: true,
|
||||||
medical_release: true,
|
medical_release: true,
|
||||||
|
misc_release: true,
|
||||||
video_analysis: true,
|
video_analysis: true,
|
||||||
}
|
}
|
||||||
when "nat_geo"
|
when "nat_geo"
|
||||||
@@ -80,6 +94,7 @@ class Project < ApplicationRecord
|
|||||||
music_release: true,
|
music_release: true,
|
||||||
talent_release: true,
|
talent_release: true,
|
||||||
medical_release: true,
|
medical_release: true,
|
||||||
|
misc_release: true,
|
||||||
video_analysis: true,
|
video_analysis: true,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -10,7 +10,19 @@ class QrCode
|
|||||||
url = Rails.application.routes.url_helpers.url_for(route)
|
url = Rails.application.routes.url_helpers.url_for(route)
|
||||||
filename = [contract_template.project.name, contract_template.name].map(&:parameterize).join("_")
|
filename = [contract_template.project.name, contract_template.name].map(&:parameterize).join("_")
|
||||||
|
|
||||||
new(url, filename)
|
new(url, "#{filename}.png")
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.build_from_multiple_contract_templates(contract_templates, project)
|
||||||
|
account = project.account
|
||||||
|
locale = I18n.locale
|
||||||
|
host = AppHost.new.domain_with_port
|
||||||
|
route = [account, project, :contract_templates, contract_template_ids: contract_templates.ids, locale: I18n.locale, host: AppHost.new.domain_with_port]
|
||||||
|
|
||||||
|
url = Rails.application.routes.url_helpers.url_for(route)
|
||||||
|
filename = [project.account.name, project.name].map(&:parameterize).join("_")
|
||||||
|
|
||||||
|
new(url, "#{filename}.png")
|
||||||
end
|
end
|
||||||
|
|
||||||
def initialize(url, filename = "qrcode.png")
|
def initialize(url, filename = "qrcode.png")
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
class ReleasableParam
|
class ReleasableParam
|
||||||
TYPES = %w(talent appearance location material acquired_media music medical)
|
TYPES = %w(talent appearance location material acquired_media music medical misc)
|
||||||
|
|
||||||
def initialize(params)
|
def initialize(params)
|
||||||
@params = params
|
@params = params
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user