Compare commits

..

54 Commits

Author SHA1 Message Date
Petko Bordjukov deebcbc95a New dev-friendly schedule endpoint 2024-10-03 23:25:01 +03:00
Tocho Tochev 5660c3ef53 Update talk confirmation template 2024-10-01 15:24:50 +03:00
Petko Bordjukov 71e8ab74da Limit access to archived conferences 2024-10-01 14:59:48 +03:00
Petko Bordjukov 89dd1890fd Add freshness headers to API 2024-10-01 01:36:19 +03:00
Petko Bordjukov 1018b93b11 Introduce thruster 2024-10-01 00:55:19 +03:00
Tocho Tochev 8cd4a4856d Remove the help text 2024-09-25 02:30:08 +03:00
Tocho Tochev 0cffe052c8 Ask volunteers to agree to our ToS 2024-09-25 02:30:08 +03:00
Tocho Tochev 6af2d09896 Fix speaker picture and add name 2024-09-23 13:24:42 +03:00
Tocho Tochev ef5935bd85 Fix race condition on emailing for new proposition 2024-09-22 23:02:25 +03:00
Tocho Tochev 10e68f3453 Use ruby 3.3.5 in all places 2024-09-22 22:44:30 +03:00
Petko Bordjukov 5bbe601110 Enable caching of halfnarp talks 2024-09-13 23:42:55 +03:00
Petko Bordjukov 89438b474b Limit data returned by halfnarp-friendly endpoint 2024-09-13 23:33:55 +03:00
Petko Bordjukov 7a64633ac0 Revert "Speed up json generation"
This reverts commit 6171e484cc.
2024-09-13 23:09:16 +03:00
Petko Bordjukov 6171e484cc Speed up json generation 2024-09-13 22:58:10 +03:00
Petko Bordjukov 2bacd84654 Assume SSL 2024-09-13 22:22:43 +03:00
Petko Bordjukov fc08089796 Introduce volunteer deletion 2024-09-08 18:27:47 +03:00
Petko Bordjukov 93611a3bd9 Configure Rubocop to work with StandardRB 2024-07-03 23:17:22 +03:00
Tocho Tochev 459be53b5c Notify with anonymised email on new volunteer (#48)
People enjoy the instant gratification of a random alert.

This brings back email notifications to organizers on volunteer sign-up so that relevant people can react as soon as possible.

The email now will contain anonymous data (team name and t-shirt size) and a link for curious people to view the profile.

I have considered adding another email address for such notifications, but it seems unnecessarily complicated.

Proof of work:

![image](/attachments/dabd0375-17ac-43c8-9698-678e768aa111)

![image](/attachments/fed16195-e668-47c7-9647-5fe069f1ed2d)

Reviewed-on: #48
Co-authored-by: Tocho Tochev <tocho@tochev.net>
Co-committed-by: Tocho Tochev <tocho@tochev.net>
2024-06-01 12:32:39 +03:00
Tocho Tochev bcac28d4ff Fix volunteer counts shown for a team (#46)
Before this change the count of volunteers in a team was not in sync with the filters applied.

![image](/attachments/0a3a0c5c-f3c2-4ef4-89d7-0bcf1fb9302d)

After the change:
![image](/attachments/b88719f6-fadf-4f07-b4d4-985533b0ea2f)

BTW I feel that we will end up refactoring the relation at some point in the future.

Reviewed-on: #46
Co-authored-by: Tocho Tochev <tocho@tochev.net>
Co-committed-by: Tocho Tochev <tocho@tochev.net>
2024-06-01 12:32:12 +03:00
Tocho Tochev 5ff505d246 Add indication for unverified volunteers (#45)
We want to have some indication for that some volunteers haven't confirmed their email.

Perhaps "unverified" is bad terminology, but until we have proper "verification" it will suffice.

(Ideally there would also be a filter, but my rails is way too rusty...)

Reviewed-on: #45
Co-authored-by: Tocho Tochev <tocho@tochev.net>
Co-committed-by: Tocho Tochev <tocho@tochev.net>
2024-06-01 12:31:38 +03:00
Tocho Tochev 87df897fe9 Remove stray docker-ignore (#43)
I don't think the `.docker-ignore` does anything when there is a `.dockerignore` so let's remove it.

I'm open to amending the PR.

Reviewed-on: #43
Co-authored-by: Tocho Tochev <tocho@tochev.net>
Co-committed-by: Tocho Tochev <tocho@tochev.net>
2024-06-01 12:30:57 +03:00
Tocho Tochev d44738bf58 Add localhost as name to initfest domains (#44)
Before this change if someone is using `localhost` for development instead of `127.0.0.1`, he would get a missing template error.

Reviewed-on: #44
Co-authored-by: Tocho Tochev <tocho@tochev.net>
Co-committed-by: Tocho Tochev <tocho@tochev.net>
2024-06-01 12:30:16 +03:00
Tocho Tochev 486a763277 Add docker-compose (#47)
This is a docker-compose based on production config, without mounting of the local folders, which I admit is a strange setup, but this was the simplest for me to get the local development going.

I'm perfectly ok with not merging this PR.

Reviewed-on: #47
Co-authored-by: Tocho Tochev <tocho@tochev.net>
Co-committed-by: Tocho Tochev <tocho@tochev.net>
2024-06-01 12:29:46 +03:00
Tocho Tochev cd8c3bbcc7 Add devise BG locale (#49)
I will raise the changes to the upstream project after review https://github.com/tochev/devise-i18n/pull/1/files

Co-authored-by: Albert Stefanov <aastefanov@outlook.com>
Reviewed-on: #49
Co-authored-by: Tocho Tochev <tocho@tochev.net>
Co-committed-by: Tocho Tochev <tocho@tochev.net>
2024-06-01 12:29:13 +03:00
Tocho Tochev 2180b0ea9f Update texts 2024-04-21 15:30:23 +03:00
Petko Bordjukov 1c42261f2a Tweak honeypot field for volunteers 2024-04-19 14:42:10 +03:00
Petko Bordjukov d123a8c69d ActiveStorage configuration 2024-04-19 00:54:54 +03:00
Petko Bordjukov ce6fac9764 Mark stored attachments as public 2024-04-19 00:41:21 +03:00
Petko Bordjukov 78c73d273e Make FROM mail addresses more friendly 2024-04-18 21:48:34 +03:00
Petko Bordjukov 1834beb13d Anti-spam measures for volunteering 2024-04-18 21:38:03 +03:00
Petko Bordjukov e461ec504f Add migration for existing volunteers 2024-04-18 19:03:35 +03:00
Petko Bordjukov 0e0d73cbbd Make volunteers choose a single main team 2024-04-18 18:57:26 +03:00
Petko Bordjukov f43c125e6d Fix asset name 2024-04-18 17:08:18 +03:00
Petko Bordjukov 977e231e14 Enable HTTP Early Hints 2024-04-14 00:48:04 +03:00
Petko Bordjukov 20c7c20633 Dockerise clarion 2024-04-13 23:16:43 +03:00
Petko Bordjukov 4c96ba1e9c Migrate from Refile and Carrierwave to ActiveStorage 2024-04-13 22:17:15 +03:00
Petko Bordjukov 281b69e66d Rails 7.1.3 Upgrade 2024-04-13 22:17:15 +03:00
Petko Bordjukov fdd75603f7 Rails 7.0.8 Upgrade 2024-04-13 22:17:15 +03:00
Petko Bordjukov 2ab307bede Rails 6.1.7.6 Upgrade 2024-04-13 22:17:15 +03:00
Petko Bordjukov 5628650e5b Rails 6.0.6.1 upgrade 2024-04-13 22:17:15 +03:00
Petko Bordjukov 28348696c5 Update todo 2024-04-08 14:14:42 +03:00
Petko Bordjukov b80eab40cc Slack's new api 2023-10-30 21:10:14 +02:00
Petko Bordjukov 14dacf02c1 Remove time limit in mailer 2023-10-14 23:11:03 +03:00
Petko Bordjukov 2aa5891e32
Text changes for 2023 (#41)
* Text changes for 2023

* Update app/views/event_mailer/rejection_notification.en.text.erb

Co-authored-by: mboshikyova-qb <87693649+mboshikyova-qb@users.noreply.github.com>

---------

Co-authored-by: mboshikyova-qb <87693649+mboshikyova-qb@users.noreply.github.com>
2023-10-10 22:56:37 +03:00
Petko Bordjukov 19ea5f5880
Merge pull request #39 from OpenFest/add-notes-to-export
Add notes to export
2023-10-07 19:32:52 +03:00
Tocho Tochev e71d9c683c
Add notes to export 2023-10-07 07:17:11 +00:00
Tocho Tochev 6326500ffe
Add event length to csv export 2023-09-27 19:09:22 +00:00
Tocho Tochev ddc11f4fcc Fix texts 2023-07-30 13:07:24 +03:00
Petko Bordjukov 2545a294f7 Enhance logging 2023-05-27 23:01:50 +03:00
Petko Bordjukov 72b7787003 Update volunteer mailer subject 2023-05-27 22:36:10 +03:00
Petko Bordjukov c04be87f53 fix feedback session logging 2022-10-19 01:42:37 +03:00
Petko Bordjukov 05617add98 Remove eagerness 2022-10-19 00:57:37 +03:00
Petko Bordjukov c818f30737 Bundle tweaks 2022-10-19 00:51:43 +03:00
Petko Bordjukov 0af5523a88 Feedback overview 2022-10-19 00:31:17 +03:00
132 changed files with 4686 additions and 1049 deletions

43
.dockerignore Normal file
View File

@ -0,0 +1,43 @@
# See https://docs.docker.com/engine/reference/builder/#dockerignore-file for more about ignoring files.
# Ignore git directory.
/.git/
# Ignore bundler config.
/.bundle
# Ignore all environment files (except templates).
/.env*
!/.env*.erb
# Ignore all default key files.
/config/master.key
/config/credentials/*.key
# Ignore all logfiles and tempfiles.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep
# Ignore pidfiles, but keep the directory.
/tmp/pids/*
!/tmp/pids/.keep
# Ignore storage (uploaded files in development and any SQLite databases).
/storage/*
!/storage/.keep
/tmp/storage/*
!/tmp/storage/.keep
# Ignore assets.
/node_modules/
/app/assets/builds/*
!/app/assets/builds/.keep
/public/assets
# Archives
*.tar.gz
# SQL
*.sql

38
.gitignore vendored
View File

@ -7,19 +7,29 @@
# Ignore bundler config. # Ignore bundler config.
/.bundle /.bundle
# Ignore the default SQLite database. # Ignore all environment files (except templates).
/db/*.sqlite3 /.env*
/db/*.sqlite3-journal !/.env*.erb
# Ignore all logfiles and tempfiles. # Ignore all logfiles and tempfiles.
/log/*.log /log/*
/tmp /tmp/*
/config/database.yml !/log/.keep
/config/secrets.yml !/tmp/.keep
/db/schema.rb
/erd.pdf # Ignore pidfiles, but keep the directory.
/public/uploads/tmp/* /tmp/pids/*
/public/uploads/personal_profile/* !/tmp/pids/
.sass-cache/ !/tmp/pids/.keep
/coverage/
/db/structure.sql # Ignore storage (uploaded files in development and any SQLite databases).
/storage/*
!/storage/.keep
/tmp/storage/*
!/tmp/storage/
!/tmp/storage/.keep
/public/assets
# Ignore master key for decrypting credentials and more.
/config/master.key

7
.rubocop.yml Normal file
View File

@ -0,0 +1,7 @@
require: standard
inherit_gem:
standard: config/base.yml
AllCops:
DisabledByDefault: true

View File

@ -1 +1 @@
2.6.3 3.3.5

View File

@ -2,7 +2,7 @@ language: ruby
dist: xenial dist: xenial
cache: bundler cache: bundler
rvm: rvm:
- 2.6 - 3.3
script: script:
- RAILS_ENV=test bundle exec rake --trace bootstrap spec - RAILS_ENV=test bundle exec rake --trace bootstrap spec
addons: addons:

62
Dockerfile Normal file
View File

@ -0,0 +1,62 @@
# syntax = docker/dockerfile:1
# Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile
ARG RUBY_VERSION=3.3.5
FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base
# Rails app lives here
WORKDIR /rails
# Set production environment
ENV RAILS_ENV="production" \
BUNDLE_DEPLOYMENT="1" \
BUNDLE_PATH="/usr/local/bundle" \
BUNDLE_WITHOUT="development"
# Throw-away build stage to reduce size of final image
FROM base as build
# Install packages needed to build gems
RUN apt-get update -qq && \
apt-get install --no-install-recommends -y build-essential git libvips pkg-config libpq-dev libsqlite3-dev nodejs yarn
# Install application gems
COPY Gemfile Gemfile.lock ./
RUN bundle install && \
rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \
bundle exec bootsnap precompile --gemfile
# Copy application code
COPY . .
# Precompile bootsnap code for faster boot times
RUN bundle exec bootsnap precompile app/ lib/
# Precompiling assets for production without requiring secret RAILS_MASTER_KEY
RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile
# Final stage for app image
FROM base
# Install packages needed for deployment
RUN apt-get update -qq && \
apt-get install --no-install-recommends -y curl libsqlite3-0 nodejs libpq5 libvips && \
rm -rf /var/lib/apt/lists /var/cache/apt/archives
# Copy built artifacts: gems, application
COPY --from=build /usr/local/bundle /usr/local/bundle
COPY --from=build /rails /rails
# Run and own only the runtime files as a non-root user for security
RUN useradd rails --create-home --shell /bin/bash && \
chown -R rails:rails db log storage tmp
USER rails:rails
# Entrypoint prepares the database.
ENTRYPOINT ["/rails/bin/docker-entrypoint"]
# Start the server by default, this can be overwritten at runtime
EXPOSE 80
CMD ["./bin/thrust", "./bin/rails", "server", "--early-hints"]

25
Gemfile
View File

@ -1,7 +1,8 @@
source "https://rubygems.org" source "https://rubygems.org"
gem "rails", "~> 5.2.7" gem "rails", "~> 7.1.0"
gem "bootsnap" gem "bootsnap"
gem "sprockets"
gem "sqlite3" gem "sqlite3"
gem "pg" gem "pg"
@ -10,7 +11,6 @@ gem "sass-rails"
gem "uglifier" gem "uglifier"
gem "coffee-rails" gem "coffee-rails"
gem "mini_racer", platforms: :ruby
gem "jquery-rails" gem "jquery-rails"
gem "slim-rails" gem "slim-rails"
@ -23,18 +23,9 @@ gem "devise-i18n"
gem "simple_form" gem "simple_form"
# Phone validation # Phone validation
gem "phony", "~> 2.15.11" gem "phony"
gem "phony_rails" gem "phony_rails"
# Picture uploads
gem "carrierwave"
# gem 'rmagick'
gem "mini_magick"
gem "refile", github: "refile/refile", require: ["refile/rails", "refile/simple_form"]
gem "refile-mini_magick"
gem "image_processing"
gem "puma", group: :production gem "puma", group: :production
gem "globalize" gem "globalize"
@ -49,7 +40,7 @@ gem "font-awesome-sass", "~> 4.6.2"
gem "nested_form" gem "nested_form"
gem "jquery-datatables-rails" gem "jquery-datatables-rails"
gem "morrisjs-rails" # gem "morrisjs-rails"
gem "raphael-rails" gem "raphael-rails"
gem "copy_carrierwave_file" gem "copy_carrierwave_file"
@ -74,17 +65,12 @@ group :development do
gem "pry-rails" gem "pry-rails"
# gem 'hirb' # gem 'hirb'
gem "awesome_print" gem "awesome_print"
gem "capistrano"
gem "capistrano-rails"
gem 'capistrano-rvm'
gem "capistrano3-puma"
gem "better_errors" gem "better_errors"
gem "binding_of_caller" gem "binding_of_caller"
end end
group :development, :test do group :development, :test do
gem "rspec-rails" gem "rspec-rails"
gem "factory_bot_rails"
gem "faker" gem "faker"
gem "capybara" gem "capybara"
gem "selenium-webdriver" gem "selenium-webdriver"
@ -100,4 +86,7 @@ end
group :test do group :test do
gem "database_cleaner" gem "database_cleaner"
gem "factory_bot_rails"
end end
gem "thruster", "~> 0.1.8"

View File

@ -1,120 +1,133 @@
GIT
remote: git://github.com/refile/refile.git
revision: e690bf5c2d83b3dfd805764d54e8f5daf14993b0
specs:
refile (0.7.0)
mime-types
sinatra (>= 2.0.0, <= 3.0.0)
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
actioncable (5.2.7) actioncable (7.1.3)
actionpack (= 5.2.7) actionpack (= 7.1.3)
activesupport (= 7.1.3)
nio4r (~> 2.0) nio4r (~> 2.0)
websocket-driver (>= 0.6.1) websocket-driver (>= 0.6.1)
actionmailer (5.2.7) zeitwerk (~> 2.6)
actionpack (= 5.2.7) actionmailbox (7.1.3)
actionview (= 5.2.7) actionpack (= 7.1.3)
activejob (= 5.2.7) activejob (= 7.1.3)
activerecord (= 7.1.3)
activestorage (= 7.1.3)
activesupport (= 7.1.3)
mail (>= 2.7.1)
net-imap
net-pop
net-smtp
actionmailer (7.1.3)
actionpack (= 7.1.3)
actionview (= 7.1.3)
activejob (= 7.1.3)
activesupport (= 7.1.3)
mail (~> 2.5, >= 2.5.4) mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0) net-imap
actionpack (5.2.7) net-pop
actionview (= 5.2.7) net-smtp
activesupport (= 5.2.7) rails-dom-testing (~> 2.2)
rack (~> 2.0, >= 2.0.8) actionpack (7.1.3)
actionview (= 7.1.3)
activesupport (= 7.1.3)
nokogiri (>= 1.8.5)
racc
rack (>= 2.2.4)
rack-session (>= 1.0.1)
rack-test (>= 0.6.3) rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0) rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.0, >= 1.0.2) rails-html-sanitizer (~> 1.6)
actionview (5.2.7) actiontext (7.1.3)
activesupport (= 5.2.7) actionpack (= 7.1.3)
activerecord (= 7.1.3)
activestorage (= 7.1.3)
activesupport (= 7.1.3)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.1.3)
activesupport (= 7.1.3)
builder (~> 3.1) builder (~> 3.1)
erubi (~> 1.4) erubi (~> 1.11)
rails-dom-testing (~> 2.0) rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.0, >= 1.0.3) rails-html-sanitizer (~> 1.6)
activejob (5.2.7) activejob (7.1.3)
activesupport (= 5.2.7) activesupport (= 7.1.3)
globalid (>= 0.3.6) globalid (>= 0.3.6)
activemodel (5.2.7) activemodel (7.1.3)
activesupport (= 5.2.7) activesupport (= 7.1.3)
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 (5.2.7) activerecord (7.1.3)
activemodel (= 5.2.7) activemodel (= 7.1.3)
activesupport (= 5.2.7) activesupport (= 7.1.3)
arel (>= 9.0) timeout (>= 0.4.0)
activestorage (5.2.7) activestorage (7.1.3)
actionpack (= 5.2.7) actionpack (= 7.1.3)
activerecord (= 5.2.7) activejob (= 7.1.3)
marcel (~> 1.0.0) activerecord (= 7.1.3)
activesupport (5.2.7) activesupport (= 7.1.3)
marcel (~> 1.0)
activesupport (7.1.3)
base64
bigdecimal
concurrent-ruby (~> 1.0, >= 1.0.2) concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2) connection_pool (>= 2.2.5)
minitest (~> 5.1) drb
tzinfo (~> 1.1) i18n (>= 1.6, < 2)
addressable (2.8.0) minitest (>= 5.1)
public_suffix (>= 2.0.2, < 5.0) mutex_m
airbrussh (1.3.4) tzinfo (~> 2.0)
sshkit (>= 1.6.1, != 1.7.0) addressable (2.8.6)
arel (9.0.0) public_suffix (>= 2.0.2, < 6.0)
ast (2.4.2) ast (2.4.2)
autoprefixer-rails (9.6.1.1) autoprefixer-rails (10.4.16.0)
execjs execjs (~> 2)
awesome_print (1.8.0) awesome_print (1.9.2)
bcrypt (3.1.13) base64 (0.2.0)
better_errors (2.9.1) bcrypt (3.1.20)
coderay (>= 1.0.0) better_errors (2.10.1)
erubi (>= 1.0.0) erubi (>= 1.0.0)
rack (>= 0.9.0) rack (>= 0.9.0)
binding_of_caller (0.8.0) rouge (>= 1.0.0)
better_html (2.0.2)
actionview (>= 6.0)
activesupport (>= 6.0)
ast (~> 2.0)
erubi (~> 1.4)
parser (>= 2.4)
smart_properties
bigdecimal (3.1.6)
binding_of_caller (1.0.0)
debug_inspector (>= 0.0.1) debug_inspector (>= 0.0.1)
bootsnap (1.4.5) bootsnap (1.18.3)
msgpack (~> 1.0) msgpack (~> 1.2)
bootstrap-sass (3.4.1) bootstrap-sass (3.4.1)
autoprefixer-rails (>= 5.2.1) autoprefixer-rails (>= 5.2.1)
sassc (>= 2.0.0) sassc (>= 2.0.0)
bootstrap-sass-extras (0.0.7) bootstrap-sass-extras (0.1.0)
rails (>= 3.1.0) rails (>= 3.1.0)
bootswatch-rails (3.3.5) bootswatch-rails (3.3.5)
railties (>= 3.1) railties (>= 3.1)
builder (3.2.4) builder (3.2.4)
byebug (11.0.1) byebug (11.1.3)
capistrano (3.11.2) capybara (3.40.0)
airbrussh (>= 1.0.0)
i18n
rake (>= 10.0.0)
sshkit (>= 1.9.0)
capistrano-bundler (1.6.0)
capistrano (~> 3.1)
capistrano-rails (1.4.0)
capistrano (~> 3.1)
capistrano-bundler (~> 1.1)
capistrano-rvm (0.1.2)
capistrano (~> 3.0)
sshkit (~> 1.2)
capistrano3-puma (4.0.0)
capistrano (~> 3.7)
capistrano-bundler
puma (~> 4.0)
capybara (3.29.0)
addressable addressable
matrix
mini_mime (>= 0.1.3) mini_mime (>= 0.1.3)
nokogiri (~> 1.8) nokogiri (~> 1.11)
rack (>= 1.6.0) rack (>= 1.6.0)
rack-test (>= 0.6.3) rack-test (>= 0.6.3)
regexp_parser (~> 1.5) regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2) xpath (~> 3.2)
carrierwave (2.2.2) carrierwave (3.0.5)
activemodel (>= 5.0.0) activemodel (>= 6.0.0)
activesupport (>= 5.0.0) activesupport (>= 6.0.0)
addressable (~> 2.6) addressable (~> 2.6)
image_processing (~> 1.1) image_processing (~> 1.1)
marcel (~> 1.0.0) marcel (~> 1.0.0)
mini_mime (>= 0.1.3)
ssrf_filter (~> 1.0) ssrf_filter (~> 1.0)
childprocess (3.0.0)
choice (0.2.0) choice (0.2.0)
chronic (0.10.2) chronic (0.10.2)
chunky_png (1.4.0) chunky_png (1.4.0)
@ -126,58 +139,70 @@ 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.10) concurrent-ruby (1.2.3)
connection_pool (2.4.1)
copy_carrierwave_file (1.3.0) copy_carrierwave_file (1.3.0)
carrierwave (>= 0.9) carrierwave (>= 0.9)
crass (1.0.6) crass (1.0.6)
database_cleaner (1.7.0) database_cleaner (2.0.2)
debug_inspector (0.0.3) database_cleaner-active_record (>= 2, < 3)
database_cleaner-active_record (2.1.0)
activerecord (>= 5.a)
database_cleaner-core (~> 2.0.0)
database_cleaner-core (2.0.1)
date (3.3.4)
debug_inspector (1.2.0)
delorean (2.1.0) delorean (2.1.0)
chronic chronic
devise (4.7.1) devise (4.9.3)
bcrypt (~> 3.0) bcrypt (~> 3.0)
orm_adapter (~> 0.1) orm_adapter (~> 0.1)
railties (>= 4.1.0) railties (>= 4.1.0)
responders responders
warden (~> 1.2.3) warden (~> 1.2.3)
devise-i18n (1.8.2) devise-i18n (1.12.0)
devise (>= 4.6) devise (>= 4.9.0)
diff-lcs (1.3) diff-lcs (1.5.1)
docile (1.3.2) docile (1.4.0)
draper (3.1.0) draper (4.0.2)
actionpack (>= 5.0) actionpack (>= 5.0)
activemodel (>= 5.0) activemodel (>= 5.0)
activemodel-serializers-xml (>= 1.0) activemodel-serializers-xml (>= 1.0)
activesupport (>= 5.0) activesupport (>= 5.0)
request_store (>= 1.0) request_store (>= 1.0)
erubi (1.10.0) ruby2_keywords
execjs (2.7.0) drb (2.2.0)
factory_bot (5.1.1) ruby2_keywords
activesupport (>= 4.2.0) erubi (1.12.0)
factory_bot_rails (5.1.1) execjs (2.9.1)
factory_bot (~> 5.1.0) factory_bot (6.4.6)
railties (>= 4.2.0) activesupport (>= 5.0.0)
faker (2.5.0) factory_bot_rails (6.4.3)
i18n (~> 1.6.0) factory_bot (~> 6.4)
faraday (0.16.2) railties (>= 5.0.0)
multipart-post (>= 1.2, < 3) faker (3.2.3)
ffi (1.15.5) i18n (>= 1.8.11, < 2)
faraday (2.9.0)
faraday-net_http (>= 2.0, < 3.2)
faraday-net_http (3.1.0)
net-http
ffi (1.16.3)
font-awesome-sass (4.6.2) font-awesome-sass (4.6.2)
sass (>= 3.2) sass (>= 3.2)
formatador (0.2.5) formatador (1.1.0)
globalid (1.0.0) globalid (1.2.1)
activesupport (>= 5.0) activesupport (>= 6.1)
globalize (5.3.0) globalize (6.3.0)
activemodel (>= 4.2, < 6.1) activemodel (>= 4.2, < 7.2)
activerecord (>= 4.2, < 6.1) activerecord (>= 4.2, < 7.2)
request_store (~> 1.0) request_store (~> 1.0)
guard (2.15.1) guard (2.18.1)
formatador (>= 0.2.4) formatador (>= 0.2.4)
listen (>= 2.7, < 4.0) listen (>= 2.7, < 4.0)
lumberjack (>= 1.0.12, < 2.0) lumberjack (>= 1.0.12, < 2.0)
nenv (~> 0.1) nenv (~> 0.1)
notiffany (~> 0.0) notiffany (~> 0.0)
pry (>= 0.9.12) pry (>= 0.13.0)
shellany (~> 0.0) shellany (~> 0.0)
thor (>= 0.18.1) thor (>= 0.18.1)
guard-compat (1.2.1) guard-compat (1.2.1)
@ -185,185 +210,218 @@ GEM
guard (~> 2.1) guard (~> 2.1)
guard-compat (~> 1.1) guard-compat (~> 1.1)
rspec (>= 2.99.0, < 4.0) rspec (>= 2.99.0, < 4.0)
highline (2.0.3) highline (3.0.1)
i18n (1.6.0) i18n (1.14.1)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
i18n-tasks (0.9.37) i18n-tasks (1.0.13)
activesupport (>= 4.0.2) activesupport (>= 4.0.2)
ast (>= 2.1.0) ast (>= 2.1.0)
better_html (>= 1.0, < 3.0)
erubi erubi
highline (>= 2.0.0) highline (>= 2.0.0)
i18n i18n
parser (>= 2.2.3.0) parser (>= 3.2.2.1)
rails-i18n rails-i18n
rainbow (>= 2.2.2, < 4.0) rainbow (>= 2.2.2, < 4.0)
terminal-table (>= 1.5.1) terminal-table (>= 1.5.1)
icalendar (2.5.3) icalendar (2.10.1)
ice_cube (~> 0.16) ice_cube (~> 0.16)
ice_cube (0.16.3) ice_cube (0.16.4)
image_processing (1.12.2) image_processing (1.12.2)
mini_magick (>= 4.9.5, < 5) mini_magick (>= 4.9.5, < 5)
ruby-vips (>= 2.0.17, < 3) ruby-vips (>= 2.0.17, < 3)
jaro_winkler (1.5.3) io-console (0.7.2)
jbuilder (2.9.1) irb (1.11.2)
activesupport (>= 4.2.0) rdoc
reline (>= 0.4.2)
jbuilder (2.11.5)
actionview (>= 5.0.0)
activesupport (>= 5.0.0)
jquery-datatables-rails (3.4.0) jquery-datatables-rails (3.4.0)
actionpack (>= 3.1) actionpack (>= 3.1)
jquery-rails jquery-rails
railties (>= 3.1) railties (>= 3.1)
sass-rails sass-rails
jquery-rails (4.3.5) jquery-rails (4.6.0)
rails-dom-testing (>= 1, < 3) rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0) railties (>= 4.2.0)
thor (>= 0.14, < 2.0) thor (>= 0.14, < 2.0)
json (2.2.0) json (2.7.1)
libv8 (7.3.492.27.1) language_server-protocol (3.17.0.3)
listen (3.7.1) lint_roller (1.1.0)
listen (3.8.0)
rb-fsevent (~> 0.10, >= 0.10.3) rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10) rb-inotify (~> 0.9, >= 0.9.10)
loofah (2.15.0) loofah (2.22.0)
crass (~> 1.0.2) crass (~> 1.0.2)
nokogiri (>= 1.5.9) nokogiri (>= 1.12.0)
lumberjack (1.0.13) lumberjack (1.2.10)
mail (2.7.1) mail (2.8.1)
mini_mime (>= 0.1.1) mini_mime (>= 0.1.1)
net-imap
net-pop
net-smtp
marcel (1.0.2) marcel (1.0.2)
method_source (0.9.2) matrix (0.4.2)
mime-types (3.3) method_source (1.0.0)
mime-types-data (~> 3.2015) mini_magick (4.12.0)
mime-types-data (3.2019.0904) mini_mime (1.1.5)
mini_magick (4.11.0) mini_portile2 (2.8.5)
mini_mime (1.1.2) minitest (5.22.2)
mini_portile2 (2.8.0) msgpack (1.7.2)
mini_racer (0.2.6) mutex_m (0.2.0)
libv8 (>= 6.9.411)
minitest (5.15.0)
morrisjs-rails (0.5.1.2)
railties (> 3.1, < 6)
msgpack (1.3.1)
multipart-post (2.1.1)
mustermann (1.0.3)
nenv (0.3.0) nenv (0.3.0)
nested_form (0.3.2) nested_form (0.3.2)
net-scp (2.0.0) net-http (0.4.1)
net-ssh (>= 2.6.5, < 6.0.0) uri
net-ssh (5.2.0) net-imap (0.4.10)
nio4r (2.5.8) date
nokogiri (1.13.3) net-protocol
mini_portile2 (~> 2.8.0) net-pop (0.1.2)
net-protocol
net-protocol (0.2.2)
timeout
net-smtp (0.4.0.1)
net-protocol
nio4r (2.7.0)
nokogiri (1.16.2)
mini_portile2 (~> 2.8.2)
racc (~> 1.4) racc (~> 1.4)
notiffany (0.1.3) notiffany (0.1.3)
nenv (~> 0.1) nenv (~> 0.1)
shellany (~> 0.0) shellany (~> 0.0)
orm_adapter (0.5.0) orm_adapter (0.5.0)
parallel (1.17.0) parallel (1.24.0)
parser (3.1.1.0) parser (3.3.0.5)
ast (~> 2.4.1) ast (~> 2.4.1)
pg (1.1.4) racc
phony (2.15.49) pg (1.5.5)
phony_rails (0.14.13) phony (2.20.12)
phony_rails (0.15.0)
activesupport (>= 3.0) activesupport (>= 3.0)
phony (> 2.15) phony (>= 2.18.12)
pry (0.12.2) pry (0.14.2)
coderay (~> 1.1.0) coderay (~> 1.1)
method_source (~> 0.9.0) method_source (~> 1.0)
pry-rails (0.3.9) pry-rails (0.3.9)
pry (>= 0.10.4) pry (>= 0.10.4)
public_suffix (4.0.6) psych (5.1.2)
puma (4.3.11) stringio
public_suffix (5.0.4)
puma (6.4.2)
nio4r (~> 2.0) nio4r (~> 2.0)
racc (1.6.0) racc (1.7.3)
rack (2.2.3) rack (3.0.9)
rack-protection (2.0.7) rack-session (2.0.0)
rack rack (>= 3.0.0)
rack-test (1.1.0) rack-test (2.1.0)
rack (>= 1.0, < 3) rack (>= 1.3)
rails (5.2.7) rackup (2.1.0)
actioncable (= 5.2.7) rack (>= 3)
actionmailer (= 5.2.7) webrick (~> 1.8)
actionpack (= 5.2.7) rails (7.1.3)
actionview (= 5.2.7) actioncable (= 7.1.3)
activejob (= 5.2.7) actionmailbox (= 7.1.3)
activemodel (= 5.2.7) actionmailer (= 7.1.3)
activerecord (= 5.2.7) actionpack (= 7.1.3)
activestorage (= 5.2.7) actiontext (= 7.1.3)
activesupport (= 5.2.7) actionview (= 7.1.3)
bundler (>= 1.3.0) activejob (= 7.1.3)
railties (= 5.2.7) activemodel (= 7.1.3)
sprockets-rails (>= 2.0.0) activerecord (= 7.1.3)
rails-dom-testing (2.0.3) activestorage (= 7.1.3)
activesupport (>= 4.2.0) activesupport (= 7.1.3)
bundler (>= 1.15.0)
railties (= 7.1.3)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6) nokogiri (>= 1.6)
rails-erd (1.6.0) rails-erd (1.7.2)
activerecord (>= 4.2) activerecord (>= 4.2)
activesupport (>= 4.2) activesupport (>= 4.2)
choice (~> 0.2.0) choice (~> 0.2.0)
ruby-graphviz (~> 1.2) ruby-graphviz (~> 1.2)
rails-html-sanitizer (1.4.2) rails-html-sanitizer (1.6.0)
loofah (~> 2.3) loofah (~> 2.21)
rails-i18n (5.1.3) nokogiri (~> 1.14)
rails-i18n (7.0.8)
i18n (>= 0.7, < 2) i18n (>= 0.7, < 2)
railties (>= 5.0, < 6) railties (>= 6.0.0, < 8)
railties (5.2.7) railties (7.1.3)
actionpack (= 5.2.7) actionpack (= 7.1.3)
activesupport (= 5.2.7) activesupport (= 7.1.3)
method_source irb
rake (>= 0.8.7) rackup (>= 1.0.0)
thor (>= 0.19.0, < 2.0) rake (>= 12.2)
thor (~> 1.0, >= 1.2.2)
zeitwerk (~> 2.6)
rainbow (3.1.1) rainbow (3.1.1)
rake (13.0.6) rake (13.1.0)
raphael-rails (2.1.2) raphael-rails (2.1.2)
rb-fsevent (0.11.1) rb-fsevent (0.11.2)
rb-inotify (0.10.1) rb-inotify (0.10.1)
ffi (~> 1.0) ffi (~> 1.0)
refile-mini_magick (0.2.0) rdoc (6.6.2)
mini_magick (~> 4.0) psych (>= 4.0.0)
refile (~> 0.5) regexp_parser (2.9.0)
regexp_parser (1.6.0) reline (0.4.2)
request_store (1.4.1) io-console (~> 0.5)
request_store (1.6.0)
rack (>= 1.4) rack (>= 1.4)
responders (3.0.0) responders (3.1.1)
actionpack (>= 5.0) actionpack (>= 5.2)
railties (>= 5.0) railties (>= 5.2)
rqrcode (2.1.1) rexml (3.2.6)
rouge (4.2.0)
rqrcode (2.2.0)
chunky_png (~> 1.0) chunky_png (~> 1.0)
rqrcode_core (~> 1.0) rqrcode_core (~> 1.0)
rqrcode_core (1.2.0) rqrcode_core (1.2.0)
rspec (3.8.0) rspec (3.13.0)
rspec-core (~> 3.8.0) rspec-core (~> 3.13.0)
rspec-expectations (~> 3.8.0) rspec-expectations (~> 3.13.0)
rspec-mocks (~> 3.8.0) rspec-mocks (~> 3.13.0)
rspec-core (3.8.2) rspec-core (3.13.0)
rspec-support (~> 3.8.0) rspec-support (~> 3.13.0)
rspec-expectations (3.8.5) rspec-expectations (3.13.0)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0) rspec-support (~> 3.13.0)
rspec-mocks (3.8.2) rspec-mocks (3.13.0)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0) rspec-support (~> 3.13.0)
rspec-rails (3.8.2) rspec-rails (6.1.1)
actionpack (>= 3.0) actionpack (>= 6.1)
activesupport (>= 3.0) activesupport (>= 6.1)
railties (>= 3.0) railties (>= 6.1)
rspec-core (~> 3.8.0) rspec-core (~> 3.12)
rspec-expectations (~> 3.8.0) rspec-expectations (~> 3.12)
rspec-mocks (~> 3.8.0) rspec-mocks (~> 3.12)
rspec-support (~> 3.8.0) rspec-support (~> 3.12)
rspec-support (3.8.3) rspec-support (3.13.0)
rubocop (0.72.0) rubocop (1.60.2)
jaro_winkler (~> 1.5.1) json (~> 2.3)
language_server-protocol (>= 3.17.0)
parallel (~> 1.10) parallel (~> 1.10)
parser (>= 2.6) parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0) rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0)
rubocop-ast (>= 1.30.0, < 2.0)
ruby-progressbar (~> 1.7) ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 1.7) unicode-display_width (>= 2.4.0, < 3.0)
rubocop-performance (1.4.1) rubocop-ast (1.30.0)
rubocop (>= 0.71.0) parser (>= 3.2.1.0)
ruby-graphviz (1.2.4) rubocop-performance (1.20.2)
ruby-progressbar (1.10.1) rubocop (>= 1.48.1, < 2.0)
ruby-vips (2.1.4) rubocop-ast (>= 1.30.0, < 2.0)
ruby-graphviz (1.2.5)
rexml
ruby-progressbar (1.13.0)
ruby-vips (2.2.0)
ffi (~> 1.12) ffi (~> 1.12)
rubyzip (2.0.0) ruby2_keywords (0.0.5)
rubyzip (2.3.2)
sass (3.7.4) sass (3.7.4)
sass-listen (~> 4.0.0) sass-listen (~> 4.0.0)
sass-listen (4.0.0) sass-listen (4.0.0)
@ -371,7 +429,7 @@ GEM
rb-inotify (~> 0.9, >= 0.9.7) rb-inotify (~> 0.9, >= 0.9.7)
sass-rails (6.0.0) sass-rails (6.0.0)
sassc-rails (~> 2.1, >= 2.1.1) sassc-rails (~> 2.1, >= 2.1.1)
sassc (2.2.1) sassc (2.4.0)
ffi (~> 1.9) ffi (~> 1.9)
sassc-rails (2.1.2) sassc-rails (2.1.2)
railties (>= 4.0.0) railties (>= 4.0.0)
@ -379,63 +437,74 @@ GEM
sprockets (> 3.0) sprockets (> 3.0)
sprockets-rails sprockets-rails
tilt tilt
search_object (1.2.2) search_object (1.2.5)
selenium-webdriver (3.142.6) selenium-webdriver (4.18.1)
childprocess (>= 0.5, < 4.0) base64 (~> 0.2)
rubyzip (>= 1.2.2) rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2, < 3.0)
websocket (~> 1.0)
shellany (0.0.1) shellany (0.0.1)
simple_form (5.0.0) simple_form (5.3.0)
actionpack (>= 5.0) actionpack (>= 5.2)
activemodel (>= 5.0) activemodel (>= 5.2)
simplecov (0.17.1) simplecov (0.22.0)
docile (~> 1.1) docile (~> 1.1)
json (>= 1.8, < 3) simplecov-html (~> 0.11)
simplecov-html (~> 0.10.0) simplecov_json_formatter (~> 0.1)
simplecov-html (0.10.2) simplecov-html (0.12.3)
sinatra (2.0.7) simplecov_json_formatter (0.1.4)
mustermann (~> 1.0) slim (5.2.1)
rack (~> 2.0) temple (~> 0.10.0)
rack-protection (= 2.0.7) tilt (>= 2.1.0)
tilt (~> 2.0) slim-rails (3.6.3)
slim (4.0.1)
temple (>= 0.7.6, < 0.9)
tilt (>= 2.0.6, < 2.1)
slim-rails (3.2.0)
actionpack (>= 3.1) actionpack (>= 3.1)
railties (>= 3.1) railties (>= 3.1)
slim (>= 3.0, < 5.0) slim (>= 3.0, < 6.0, != 5.0.0)
spring (2.1.0) smart_properties (1.17.0)
spring (4.1.3)
spring-commands-rspec (1.0.4) spring-commands-rspec (1.0.4)
spring (>= 0.9.1) spring (>= 0.9.1)
sprockets (4.0.3) sprockets (4.2.1)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
rack (> 1, < 3) rack (>= 2.2.4, < 4)
sprockets-rails (3.4.2) sprockets-rails (3.4.2)
actionpack (>= 5.2) actionpack (>= 5.2)
activesupport (>= 5.2) activesupport (>= 5.2)
sprockets (>= 3.0.0) sprockets (>= 3.0.0)
sqlite3 (1.4.1) sqlite3 (1.7.2)
sshkit (1.20.0) mini_portile2 (~> 2.8.0)
net-scp (>= 1.1.2) ssrf_filter (1.1.2)
net-ssh (>= 2.8.0) standard (1.34.0)
ssrf_filter (1.0.7) language_server-protocol (~> 3.17.0.2)
standard (0.1.4) lint_roller (~> 1.0)
rubocop (~> 0.72.0) rubocop (~> 1.60)
rubocop-performance (~> 1.4.0) standard-custom (~> 1.0.0)
temple (0.8.2) standard-performance (~> 1.3)
standard-custom (1.0.2)
lint_roller (~> 1.0)
rubocop (~> 1.50)
standard-performance (1.3.1)
lint_roller (~> 1.1)
rubocop-performance (~> 1.20.2)
stringio (3.1.0)
temple (0.10.3)
terminal-table (3.0.2) terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3) unicode-display_width (>= 1.1.1, < 3)
thor (1.2.1) thor (1.3.0)
thread_safe (0.3.6) thruster (0.1.8)
tilt (2.0.10) tilt (2.3.0)
tzinfo (1.2.9) timeout (0.4.1)
thread_safe (~> 0.1) tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
uglifier (4.2.0) uglifier (4.2.0)
execjs (>= 0.3.0, < 3) execjs (>= 0.3.0, < 3)
unicode-display_width (1.6.1) unicode-display_width (2.5.0)
warden (1.2.8) uri (0.13.0)
rack (>= 2.0.6) warden (1.2.9)
websocket-driver (0.7.5) rack (>= 2.0.9)
webrick (1.8.1)
websocket (1.2.10)
websocket-driver (0.7.6)
websocket-extensions (>= 0.1.0) websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5) websocket-extensions (0.1.5)
xpath (3.2.0) xpath (3.2.0)
@ -443,6 +512,7 @@ GEM
yaml_db (0.7.0) yaml_db (0.7.0)
rails (>= 3.0) rails (>= 3.0)
rake (>= 0.8.7) rake (>= 0.8.7)
zeitwerk (2.6.13)
PLATFORMS PLATFORMS
ruby ruby
@ -457,12 +527,7 @@ DEPENDENCIES
bootstrap-sass-extras bootstrap-sass-extras
bootswatch-rails bootswatch-rails
byebug byebug
capistrano
capistrano-rails
capistrano-rvm
capistrano3-puma
capybara capybara
carrierwave
coffee-rails coffee-rails
copy_carrierwave_file copy_carrierwave_file
database_cleaner database_cleaner
@ -478,25 +543,19 @@ DEPENDENCIES
guard-rspec guard-rspec
i18n-tasks i18n-tasks
icalendar icalendar
image_processing
jbuilder jbuilder
jquery-datatables-rails jquery-datatables-rails
jquery-rails jquery-rails
mini_magick
mini_racer
morrisjs-rails
nested_form nested_form
pg pg
phony (~> 2.15.11) phony
phony_rails phony_rails
pry-rails pry-rails
puma puma
rails (~> 5.2.7) rails (~> 7.1.0)
rails-erd rails-erd
rails-i18n rails-i18n
raphael-rails raphael-rails
refile!
refile-mini_magick
rqrcode rqrcode
rspec-rails rspec-rails
sass-rails sass-rails
@ -507,10 +566,12 @@ DEPENDENCIES
slim-rails slim-rails
spring spring
spring-commands-rspec spring-commands-rspec
sprockets
sqlite3 sqlite3
standard standard
thruster (~> 0.1.8)
uglifier uglifier
yaml_db yaml_db
BUNDLED WITH BUNDLED WITH
1.17.3 2.5.6

View File

@ -1,11 +1,31 @@
Clarion # Clarion
=======
A CfP automation system for OpenFest. A CfP automation system for OpenFest.
Installation ## Installation
------------
1. `git clone https://github.com/ignisf/clarion.git` ### For local development
2. Run `bundle install; bin/rake bootstrap`
3. You can now run the rails server with `bin/rails s` 1. `git clone https://git.openfest.org/Site/clarion/`
2. Run `rvm install "ruby-$(cat .ruby-version)"; rvm install "ruby-$(cat .ruby-version)"`
3. Start up postgresql
4. Run `bundle install; bin/rake bootstrap`
5. You can now run the rails server with `bin/rails s`
### For production
`docker build -t clarion:latest -f Dockerfile .`
Note that the docker image contains a default user (for credentials see `db/seeds.rb`).
### docker-compose
`docker-compose up` will bring everything up on `http://127.0.0.1:3000` with production configuration.
## Initial Usage
1. Go to `http://127.0.0.1:3000/management/`
2. Login (for initial creds see `db/seeds.rb`)
3. Change the credentials
4. Create a conference.
- NB: When creating a conference make sure to use the same `domain` as the one you are currently using, otherwise nothing will be shown.

15
TODO
View File

@ -1,14 +1,14 @@
- User-facing: - User-facing:
- Event proposal: lecture, workshop, open space (CRUD) - # Event proposal: lecture, workshop, open space (CRUD)
- Volunteership - # Volunteership
- Sponsorship - Sponsorship
- Admin: - Admin:
- # Create a conference, halls, tracks - # Create a conference, halls, tracks
- # Starting a CFP - # Starting a CFP
- # conferences#show -> admin dashboard - # conferences#show -> admin dashboard
- volunteers#index -> approved volunteers - # volunteers#index -> approved volunteers
- sponsorships#index -> generate token, links to send around - # sponsorships#index -> generate token, links to send around
- scheduling -> calendar with events - scheduling -> calendar with events
- # proposals#index -> undecided events, grouped by user - # proposals#index -> undecided events, grouped by user
@ -17,12 +17,11 @@
- users: - users:
- # edit profile: image upload and stuff - # edit profile: image upload and stuff
- # show profile - # show profile
- Edit profiles instead - # Edit profiles instead
- Home-area user CRUD - # Home-area user CRUD
- # Controller before_action that checks for current_conference - # Controller before_action that checks for current_conference
- Devise view styling - # Devise view styling
Notes: Notes:
- .row > .col-lg-12 -> put that outside of the "yield"? - .row > .col-lg-12 -> put that outside of the "yield"?
- human_attribute_name -> create a short alias?

View File

@ -0,0 +1,6 @@
//= link_tree ../images
//= link_tree ../../../lib/initfest/assets/images
//= link_directory ../javascripts .js
//= link_directory ../stylesheets .css
//= link initfest/application.css
//= link initfest/application.js

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -3,6 +3,5 @@
//= require jquery_nested_form //= require jquery_nested_form
//= require bootstrap-sprockets //= require bootstrap-sprockets
//= require raphael //= require raphael
//= require morris
//= require chroma-js/chroma //= require chroma-js/chroma
//= require_directory . //= require_directory .

View File

@ -6,7 +6,7 @@
@import "bootstrap"; @import "bootstrap";
@import "bootswatch/simplex/bootswatch"; @import "bootswatch/simplex/bootswatch";
@import "morris"; /* @import "morris"; */
@import "users"; @import "users";
@import "colors"; @import "colors";
@ -19,4 +19,4 @@
& > div { & > div {
display: inline-block; display: inline-block;
} }
} }

View File

@ -0,0 +1,8 @@
class Api::ConferencesController < Api::ApplicationController
include ::PublicApiExposing
def index
@conferences = Conference.all
fresh_when @conferences
end
end

View File

@ -5,5 +5,6 @@ class Api::EventTypesController < Api::ApplicationController
def index def index
@event_types = current_conference.event_types.includes(:translations) @event_types = current_conference.event_types.includes(:translations)
fresh_when @event_types
end end
end end

View File

@ -9,6 +9,5 @@ class Api::EventsController < Api::ApplicationController
def halfnarp_friendly def halfnarp_friendly
@events = current_conference.events.joins(:proposition).includes(:track, :event_type).where.not(propositions: {status: :rejected}) @events = current_conference.events.joins(:proposition).includes(:track, :event_type).where.not(propositions: {status: :rejected})
render json: @events, include: [:track, :event_type]
end end
end end

View File

@ -5,5 +5,6 @@ class Api::HallsController < Api::ApplicationController
def index def index
@halls = current_conference.halls @halls = current_conference.halls
fresh_when @halls
end end
end end

View File

@ -0,0 +1,9 @@
class Api::SchedulesController < Api::ApplicationController
include ::CurrentConferenceAssigning
include ::PublicApiExposing
before_action :require_current_conference!
def show
@halls = Conference.last.halls.includes(:translations, slots: {approved_event: [:participants_with_personal_profiles, :proposition]})
end
end

View File

@ -5,5 +5,7 @@ class Api::SlotsController < Api::ApplicationController
def index def index
@slots = current_conference.slots @slots = current_conference.slots
fresh_when @slots
end end
end end

View File

@ -5,5 +5,6 @@ class Api::SpeakersController < Api::ApplicationController
def index def index
@speakers = PersonalProfile.joins(user: {participations: {event: :proposition}}).where(events: {id: current_conference.approved_events.pluck(:id)}, conference: current_conference).distinct @speakers = PersonalProfile.joins(user: {participations: {event: :proposition}}).where(events: {id: current_conference.approved_events.pluck(:id)}, conference: current_conference).distinct
fresh_when @speakers
end end
end end

View File

@ -5,5 +5,6 @@ class Api::TracksController < Api::ApplicationController
def index def index
@tracks = current_conference.tracks.includes(:translations) @tracks = current_conference.tracks.includes(:translations)
fresh_when @tracks
end end
end end

View File

@ -33,7 +33,8 @@ class ApplicationController < ActionController::Base
# TODO: make this get the domain from the database # TODO: make this get the domain from the database
prepend_view_path "lib/initfest/views" if request.host =~ /openfest/ prepend_view_path "lib/initfest/views" if request.host =~ /openfest/
prepend_view_path "lib/initfest/views" if request.host =~ /example/ prepend_view_path "lib/initfest/views" if request.host =~ /example/
prepend_view_path "lib/initfest/views" if request.host =~ /127\.0\.0/ prepend_view_path "lib/initfest/views" if request.host =~ /^127\.0\.0/
prepend_view_path "lib/initfest/views" if request.host =~ /^localhost$/
end end
protected protected

View File

@ -0,0 +1,13 @@
module Management
class FeedbackController < ManagementController
def index
@conference = find_conference
end
private
def find_conference
Conference.find(params[:conference_id])
end
end
end

View File

@ -8,7 +8,11 @@ module Management
private private
def authorize_user! def authorize_user!
head :forbidden unless current_user.admin? if params[:conference_id] && params[:conference_id].to_i < Conference.last.id
head :forbidden unless current_user.admin? && current_user.owner?
else
head :forbidden unless current_user.admin?
end
end end
end end
end end

View File

@ -53,7 +53,7 @@ module Management
@conference = find_conference @conference = find_conference
@profile = find_profile @profile = find_profile
if @profile.update_attributes(profile_params) if @profile.update(profile_params)
redirect_to [:management, @conference, @profile] redirect_to [:management, @conference, @profile]
else else
render action: "edit" render action: "edit"

View File

@ -4,7 +4,7 @@ module Management
def index def index
@filters = filter_params || {} @filters = filter_params || {}
@volunteers = VolunteerSearch.new(scope: Volunteer.where(conference: current_conference).eager_load(:volunteer_teams), filters: params[:filters]).results @volunteers = VolunteerSearch.new(scope: Volunteer.where(conference: current_conference).eager_load(:volunteer_team), filters: params[:filters]).results
end end
def show def show
@ -15,6 +15,12 @@ module Management
@volunteer = current_conference.volunteers.find(params[:id]) @volunteer = current_conference.volunteers.find(params[:id])
end end
def destroy
@volunteer = current_conference.volunteers.find(params[:id])
@volunteer.destroy!
redirect_to management_conference_volunteers_path(conference_id: current_conference.id)
end
def update def update
@volunteer = current_conference.volunteers.find(params[:id]) @volunteer = current_conference.volunteers.find(params[:id])
@ -30,13 +36,14 @@ module Management
def filter_params def filter_params
params.fetch(:filters, {}).permit(:volunteer_team_id) params.fetch(:filters, {}).permit(:volunteer_team_id)
end end
def volunteer_params def volunteer_params
params.require(:volunteer).permit(:name, :picture, :email, :phone, params.require(:volunteer).permit(:name, :picture, :email, :phone,
:tshirt_size, :tshirt_cut, :tshirt_size, :tshirt_cut,
:food_preferences, :previous_experience, :food_preferences, :previous_experience,
:notes, :language, :notes, :language, :terms_accepted,
volunteer_team_ids: []) :volunteer_team_id,
additional_volunteer_team_ids: [])
end end
end end
end end

View File

@ -4,27 +4,27 @@ class Public::ConferenceFeedbacksController < Public::ApplicationController
@unrated_events = @conference.events @unrated_events = @conference.events
.joins(:proposition).approved .joins(:proposition).approved
.joins("LEFT JOIN feedbacks ON feedbacks.feedback_receiving_id = events.id AND feedbacks.feedback_receiving_type = 'Event'") .joins("LEFT JOIN feedbacks ON feedbacks.feedback_receiving_id = events.id AND feedbacks.feedback_receiving_type = 'Event'")
.where("feedbacks.session_id != ? OR feedbacks.id IS NULL", session.id).distinct .where("feedbacks.session_id != ? OR feedbacks.id IS NULL", session.id.to_s).distinct
@rated_events = @conference.events @rated_events = @conference.events
.joins(:proposition).approved .joins(:proposition).approved
.joins(:feedbacks) .joins(:feedbacks)
.where(feedbacks: {session_id: session.id}).distinct .where(feedbacks: {session_id: session.id.to_s}).distinct
end end
def new def new
if current_conference.feedbacks.where(session_id: session.id).exists? if current_conference.feedbacks.where(session_id: session.id.to_s).exists?
@feedback = current_conference.feedbacks.where(session_id: session.id).order(updated_at: :asc).last @feedback = current_conference.feedbacks.where(session_id: session.id.to_s).order(updated_at: :asc).last
else else
@feedback = current_conference.feedbacks.build @feedback = current_conference.feedbacks.build
@feedback.author_email = Feedback.where(session_id: session.id).order(updated_at: :asc).last.try(:author_email) @feedback.author_email = Feedback.where(session_id: session.id.to_s).order(updated_at: :asc).last.try(:author_email)
end end
end end
def create def create
@feedback = current_conference.feedbacks.build(feedback_params) @feedback = current_conference.feedbacks.build(feedback_params)
@feedback.ip_address = request.remote_ip @feedback.ip_address = request.remote_ip
@feedback.session_id = session.id @feedback.session_id = session.id.to_s
if @feedback.save if @feedback.save
flash[:notice] = I18n.t("public.conference_feedbacks.new.success") flash[:notice] = I18n.t("public.conference_feedbacks.new.success")

View File

@ -1,17 +1,17 @@
class Public::EventFeedbacksController < Public::ApplicationController class Public::EventFeedbacksController < Public::ApplicationController
def new def new
if event.feedbacks.where(session_id: session.id).exists? if event.feedbacks.where(session_id: session.id.to_s).exists?
@feedback = event.feedbacks.where(session_id: session.id).order(updated_at: :asc).last @feedback = event.feedbacks.where(session_id: session.id.to_s).order(updated_at: :asc).last
else else
@feedback = event.feedbacks.build @feedback = event.feedbacks.build
@feedback.author_email = Feedback.where(session_id: session.id).order(updated_at: :asc).last.try(:author_email) @feedback.author_email = Feedback.where(session_id: session.id.to_s).order(updated_at: :asc).last.try(:author_email)
end end
end end
def create def create
@feedback = event.feedbacks.build(feedback_params) @feedback = event.feedbacks.build(feedback_params)
@feedback.ip_address = request.remote_ip @feedback.ip_address = request.remote_ip
@feedback.session_id = session.id @feedback.session_id = session.id.to_s
if @feedback.save if @feedback.save
flash[:notice] = I18n.t("public.event_feedbacks.new.success") flash[:notice] = I18n.t("public.event_feedbacks.new.success")

View File

@ -20,7 +20,7 @@ module Public
def update def update
@profile = current_user.personal_profile(current_conference) @profile = current_user.personal_profile(current_conference)
if @profile.update_attributes(profile_params) if @profile.update(profile_params)
flash[:notice] = t("views.personal_profiles.successfully_updated") flash[:notice] = t("views.personal_profiles.successfully_updated")
redirect_to root_path redirect_to root_path
else else

View File

@ -0,0 +1,20 @@
module Public
class VolunteerConfirmationsController < Public::ApplicationController
def create
@volunteer = Volunteer.find_by!(unique_id: params[:id])
if ActiveSupport::SecurityUtils.secure_compare(@volunteer.confirmation_token, params[:confirmation_token])
@volunteer.transaction do
@volunteer.touch(:confirmed_at)
@volunteer.update(confirmation_token: nil)
end
@volunteer.send_notification_to_volunteer
redirect_to edit_volunteer_path(@volunteer.unique_id), notice: I18n.t("views.volunteers.email_confirmed_successfully")
else
redirect_to root_path, alert: I18n.t("views.volunteers.email_confirmation_error")
end
end
end
end

View File

@ -1,5 +1,6 @@
module Public module Public
class VolunteersController < Public::ApplicationController class VolunteersController < Public::ApplicationController
before_action :check_honey_pot, only: [:create, :edit]
def new def new
@volunteer = current_conference.volunteers.build @volunteer = current_conference.volunteers.build
end end
@ -30,11 +31,15 @@ module Public
private private
def check_honey_pot
head :unauthorized unless params.dig(:volunteer_ht, :full_name).blank?
end
def volunteer_params def volunteer_params
params.require(:volunteer).permit( params.require(:volunteer).permit(
:name, :picture, :email, :phone, :tshirt_size, :tshirt_cut, :name, :picture, :email, :phone, :tshirt_size, :tshirt_cut,
:food_preferences, :previous_experience, :notes, :language, :food_preferences, :previous_experience, :notes, :language,
volunteer_team_ids: [] :terms_accepted, :volunteer_team_id,
) )
end end
end end

View File

@ -2,8 +2,10 @@ class VolunteerMailer < ActionMailer::Base
def team_notification(new_volunteer) def team_notification(new_volunteer)
@volunteer = new_volunteer @volunteer = new_volunteer
mail(to: @volunteer.conference.email, mail(
subject: "Нов доброволец #{@volunteer.name} <#{@volunteer.email}> за екип(и) #{@volunteer.volunteer_teams.map(&:name).join(", ")}") to: @volunteer.conference.email,
subject: "Нов доброволец за #{@volunteer.conference.title} - #{@volunteer.volunteer_team.name}"
)
end end
def volunteer_notification(new_volunteer) def volunteer_notification(new_volunteer)
@ -11,8 +13,19 @@ class VolunteerMailer < ActionMailer::Base
I18n.locale = @volunteer.language I18n.locale = @volunteer.language
mail(to: @volunteer.email, mail(to: @volunteer.email,
reply_to: @volunteer.conference.email, reply_to: @volunteer.conference.email,
from: "no-reply@openfest.org", from: "OpenFest <cfp@openfest.org>",
subject: I18n.t("volunteer_mailer.success_notification.subject", subject: I18n.t("volunteer_mailer.success_notification.subject",
conference_name: @volunteer.conference.title)) conference_name: @volunteer.conference.title))
end end
def volunteer_email_confirmation(new_volunteer)
@volunteer = new_volunteer
I18n.locale = @volunteer.language
mail(to: @volunteer.email,
reply_to: @volunteer.conference.email,
from: "OpenFest <cfp@openfest.org>",
subject: I18n.t("volunteer_mailer.email_confirmation.subject",
conference_name: @volunteer.conference.title))
end
end end

View File

@ -22,10 +22,15 @@ class Conference < ActiveRecord::Base
has_many :participants, -> { distinct }, class_name: "User", through: :events has_many :participants, -> { distinct }, class_name: "User", through: :events
has_many :participant_profiles, class_name: "PersonalProfile" has_many :participant_profiles, class_name: "PersonalProfile"
has_many :slots, through: :halls has_many :slots, through: :halls
has_many :feedbacks, as: :feedback_receiving
has_many :editions, primary_key: :host_name, foreign_key: :host_name, class_name: "Conference" has_many :editions, primary_key: :host_name, foreign_key: :host_name, class_name: "Conference"
has_many :events_of_all_editions, through: :editions, source: :events has_many :events_of_all_editions, through: :editions, source: :events
include FeedbackReceiving
has_many :feedbacks, as: :feedback_receiving
has_many :feedbacks_with_comment, -> { where.not(comment: [nil, ""]) }, as: :feedback_receiving, class_name: 'Feedback'
has_many :event_feedbacks, through: :events, source: :feedbacks
has_many :event_feedbacks_with_comment, through: :events, source: :feedbacks_with_comment
accepts_nested_attributes_for :tracks, :halls, :event_types, :volunteer_teams, accepts_nested_attributes_for :tracks, :halls, :event_types, :volunteer_teams,
reject_if: :all_blank, allow_destroy: true reject_if: :all_blank, allow_destroy: true

View File

@ -20,6 +20,7 @@ class Event < ActiveRecord::Base
scope :ranked, -> { where.not(ranked: nil).where.not(votes: nil) } scope :ranked, -> { where.not(ranked: nil).where.not(votes: nil) }
scope :approved, -> { where(propositions: {status: Proposition.statuses[:approved]})} scope :approved, -> { where(propositions: {status: Proposition.statuses[:approved]})}
scope :approved_joined, -> { joins(:proposition).merge(Proposition.approved) }
validates :conference, presence: true validates :conference, presence: true
validates :title, presence: true, length: {maximum: 65} validates :title, presence: true, length: {maximum: 65}

View File

@ -13,7 +13,7 @@ class PersonalProfile < ActiveRecord::Base
phony_normalize :mobile_phone, default_country_code: "BG", add_plus: false phony_normalize :mobile_phone, default_country_code: "BG", add_plus: false
mount_uploader :picture, PictureUploader has_one_attached :picture
accepts_nested_attributes_for :user accepts_nested_attributes_for :user

View File

@ -4,7 +4,7 @@ class Proposition < ActiveRecord::Base
enum status: [:undecided, :approved, :rejected, :backup] enum status: [:undecided, :approved, :rejected, :backup]
delegate :proposable_title, :proposable_type, :proposable_description, to: :proposable delegate :proposable_title, :proposable_type, :proposable_description, to: :proposable
after_create :send_creation_notification after_commit :send_creation_notification, on: [:create]
before_destroy :send_withdrawal_notification before_destroy :send_withdrawal_notification
def confirm! def confirm!

View File

@ -1,4 +1,5 @@
class Slot < ActiveRecord::Base class Slot < ActiveRecord::Base
belongs_to :hall belongs_to :hall
belongs_to :event, required: false belongs_to :event, required: false
belongs_to :approved_event, -> { joins(:proposition).approved_joined }, class_name: 'Event', foreign_key: 'event_id'
end end

View File

@ -38,7 +38,7 @@ class User < ActiveRecord::Base
def build_personal_profile(conference, params = {}) def build_personal_profile(conference, params = {})
if personal_profiles.last.present? if personal_profiles.last.present?
new_personal_profile = personal_profiles.last.try(:dup) new_personal_profile = personal_profiles.last.try(:dup)
CopyCarrierwaveFile::CopyFileService.new(personal_profiles.last, new_personal_profile, :picture).set_file new_personal_profile.picture.attach(personal_profiles.last.picture.blob)
else else
new_personal_profile = personal_profiles.build new_personal_profile = personal_profiles.build
end end

View File

@ -3,44 +3,63 @@ class Volunteer < ActiveRecord::Base
TSHIRT_CUTS = [:unisex, :female] TSHIRT_CUTS = [:unisex, :female]
FOOD_PREFERENCES = [:none, :vegetarian, :vegan] FOOD_PREFERENCES = [:none, :vegetarian, :vegan]
attachment :picture, type: :image has_one_attached :picture
validates :name, :language, :tshirt_size, :tshirt_cut, :food_preferences, presence: true validates :name, :language, :tshirt_size, :tshirt_cut, :food_preferences, presence: true
validates :tshirt_size, inclusion: {in: TSHIRT_SIZES.map(&:to_s)} validates :tshirt_size, inclusion: {in: TSHIRT_SIZES.map(&:to_s)}
validates :tshirt_cut, inclusion: {in: TSHIRT_CUTS.map(&:to_s)} validates :tshirt_cut, inclusion: {in: TSHIRT_CUTS.map(&:to_s)}
validates :food_preferences, inclusion: {in: FOOD_PREFERENCES.map(&:to_s)} validates :food_preferences, inclusion: {in: FOOD_PREFERENCES.map(&:to_s)}
validates :email, format: {with: /\A[^@]+@[^@]+\z/}, presence: true validates :email, format: {with: /\A[^@]+@[^@]+\z/}, presence: true, uniqueness: {scope: :conference_id}
validates :phone, presence: true, format: {with: /\A[+\- \(\)0-9]+\z/} validates :phone, presence: true, format: {with: /\A[+\- \(\)0-9]+\z/}
validates :volunteer_teams, presence: true validates :volunteer_team, presence: true
validates :terms_accepted, acceptance: true
validate :volunteer_teams_belong_to_conference validate :volunteer_teams_belong_to_conference
phony_normalize :phone, default_country_code: "BG" phony_normalize :phone, default_country_code: "BG"
belongs_to :conference belongs_to :conference
has_and_belongs_to_many :volunteer_teams belongs_to :volunteer_team
has_and_belongs_to_many :additional_volunteer_teams, class_name: "VolunteerTeam"
before_create :ensure_main_volunteer_team_is_part_of_additional_volunteer_teams
before_create :assign_unique_id before_create :assign_unique_id
after_create :send_notification_to_organizers before_create :assign_confirmation_token
after_create :send_notification_to_volunteer after_commit :send_email_confirmation_to_volunteer, on: [:create]
after_commit :send_email_to_organisers, on: [:create] # technically the volunteer's email is not confirmed yet
private
def assign_unique_id
self.unique_id = Digest::SHA256.hexdigest(SecureRandom.uuid)
end
def send_notification_to_organizers
VolunteerMailer.team_notification(self).deliver_later
end
def send_notification_to_volunteer def send_notification_to_volunteer
VolunteerMailer.volunteer_notification(self).deliver_later VolunteerMailer.volunteer_notification(self).deliver_later
end end
private
def ensure_main_volunteer_team_is_part_of_additional_volunteer_teams
self.additional_volunteer_teams |= [volunteer_team] if volunteer_team
end
def assign_unique_id
self.unique_id = Digest::SHA256.hexdigest(SecureRandom.uuid)
end
def assign_confirmation_token
self.confirmation_token = Digest::SHA256.hexdigest(SecureRandom.uuid)
end
def send_email_confirmation_to_volunteer
VolunteerMailer.volunteer_email_confirmation(self).deliver_later
end
def send_email_to_organisers
VolunteerMailer.team_notification(self).deliver_later
end
def volunteer_teams_belong_to_conference def volunteer_teams_belong_to_conference
conference_volunteer_teams = conference.volunteer_teams conference_volunteer_teams = conference.volunteer_teams
unless volunteer_teams.all? { |team| conference_volunteer_teams.include? team } unless additional_volunteer_teams.all? { |team| conference_volunteer_teams.include? team }
errors.add :volunteer_teams, :invalid_volunteer_team errors.add :additional_volunteer_teams, :invalid_volunteer_team
end
unless conference_volunteer_teams.include?(volunteer_team)
errors.add :volunteer_team, :invalid_volunteer_team
end end
end end
end end

View File

@ -1,7 +1,7 @@
class VolunteerSearch class VolunteerSearch
include SearchObject.module(:sorting) include SearchObject.module(:sorting)
option(:volunteer_team_id) { |scope, value| scope.joins(:volunteer_teams).where volunteer_teams: {id: value} } option(:volunteer_team_id) { |scope, value| scope.joins(:volunteer_team).where volunteer_team: {id: value} }
sort_by "name" sort_by "name"
config[:defaults]["sort"] = "#{config[:sort_attributes].first} asc" config[:defaults]["sort"] = "#{config[:sort_attributes].first} asc"

View File

@ -1,6 +1,7 @@
class VolunteerTeam < ActiveRecord::Base class VolunteerTeam < ActiveRecord::Base
belongs_to :conference belongs_to :conference
has_and_belongs_to_many :volunteers has_many :volunteers, inverse_of: :volunteer_team
has_and_belongs_to_many :supporters, class_name: "Volunteer", inverse_of: :additional_volunteer_teams
validates :name, presence: true validates :name, presence: true
validates :color, presence: true, format: {with: /\A#?[a-f0-9]{6}\z/i} validates :color, presence: true, format: {with: /\A#?[a-f0-9]{6}\z/i}

View File

@ -1,53 +0,0 @@
class PictureUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
# include CarrierWave::RMagick
include CarrierWave::MiniMagick
# Choose what kind of storage to use for this uploader:
storage :file
# storage :fog
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
# Provide a default URL as a default if there hasn't been a file uploaded:
def default_url
ActionController::Base.helpers.asset_path("fallback/profile_picture/" + [version_name, "default.png"].compact.join("_"))
end
# Process files as they are uploaded:
# process :scale => [200, 300]
#
# def scale(width, height)
# # do something
# end
# Create different versions of your uploaded files:
version :medium do
process resize_to_fit: [171, 180]
end
version :thumb do
process resize_to_fit: [50, 50]
end
version :schedule do
process resize_to_fill: [100, 100]
end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
def extension_white_list
%w[jpg jpeg png]
end
# Override the filename of the uploaded files:
# Avoid using model.id or version_name here, see uploader/store.rb for details.
# def filename
# "something.jpg" if original_filename
# end
end

View File

@ -0,0 +1 @@
json.array! @conferences, :id, :title, :start_date, :end_date, :created_at, :updated_at

View File

@ -0,0 +1,13 @@
json.array! @events, cached: ->(event) { [event, event.track, event.event_type] } do |event|
json.id event.id
json.title event.title
json.abstract event.abstract
json.track_id event.track_id
json.track do
json.name event.track.name
end
json.event_type do
json.name event.event_type.name
end
end

View File

@ -0,0 +1,22 @@
@halls.each do |hall|
json.set! hall.name do
json.days do
hall.slots.to_a.sort_by(&:starts_at).group_by { |slot| slot.starts_at.to_date }.each do |day, slots|
json.set! day do
json.array! slots do |slot|
next unless slot.approved_event
json.starts_at slot.starts_at
json.starts_at_human l(slot.starts_at, format: '%a, %H:%M')
json.title slot.approved_event.title
json.speakers do
json.array! slot.approved_event.participants_with_personal_profiles do |participant|
json.name participant.name
json.email participant.public_email
end
end
end
end
end
end
end
end

View File

@ -1,6 +1,6 @@
@speakers.each do |speaker| @speakers.each do |speaker|
json.set! speaker.user_id do json.set! speaker.user_id do
json.extract! speaker, :twitter, :github, :biography, :public_email, :organisation, :last_name, :first_name json.extract! speaker, :twitter, :github, :biography, :public_email, :organisation, :last_name, :first_name, :name
json.picture speaker.picture.serializable_hash json.picture rails_blob_url(speaker.picture.variant(resize_to_fill: [100, 100]))
end end
end end

View File

@ -1,10 +1,15 @@
Здравейте, Здравейте,
Изпращаме ви отново този mail с (почти) финалните дати и часове за провеждане на лекциите ви. Имаме удоволствието да ви информираме, че Вашето предложение за участие в „<%= @event.conference.title %>“ с <%= @event.event_type.name.mb_chars.downcase %> на тема „<%= @event.title %>“ беше одобрено. <% if @event.slot.present? -%>
Ще се проведе на <%= I18n.l @event.slot.starts_at, format: :long %> часа.
<% else %>
Определянето на датата и часа на провеждане все още предстои.
<% end %>
Предложението Ви за участие в <%= @event.conference.title %> с <%= @event.event_type.name.mb_chars.downcase %> на тема „<%= @event.title %>“> ще се проведе на <%= I18n.l @event.slot.starts_at, format: :long %> часа. Моля, потвърдете Вашето участие възможно най-скоро като кликнете на следния линк:
<%= confirm_event_url @event, host: @event.conference.host_name, protocol: 'https' %>
Отговорете на този email, ако възникнат някакви допълнителни въпроси. С приложения QR код към този имейл ще можете да достъпите формуляра за обратна връзка на предложеното от Вас събитие. Моля, включете го в презентацията си.
Поздрави, Поздрави,
Екипът на <%= @event.conference.title %> Екипът на <%= @event.conference.title %>

View File

@ -1,20 +1,17 @@
Hello, Hello,
We are happy to notify you that your request for participation in <%= @event.conference.title %> with the <%= @event.event_type.name.downcase %> titled "<%= @event.title %>" was approved. <% if @event.slot.present? -%> We are thrilled to inform you that your request for participation in <%= @event.conference.title %> with the <%= @event.event_type.name.downcase %> titled "<%= @event.title %>" has been approved. <% if @event.slot.present? -%>
It has been scheduled for <%= I18n.l @event.slot.starts_at, format: :long %>. It has been scheduled for <%= I18n.l @event.slot.starts_at, format: :long %>.
<% else %> <% else %>
It has not been scheduled yet. It has not been scheduled yet.
<% end %> <% end %>
Please confirm your participation as soon as you can by following the following link: To confirm your participation please follow the link below as soon as you can:
<%= confirm_event_url @event, host: @event.conference.host_name, protocol: 'https' %> <%= confirm_event_url @event, host: @event.conference.host_name, protocol: 'https' %>
Please make sure you include the QR code attached to this email in your We kindly request that you ensure the inclusion of the QR code attached to this email in your presentation. It links directly to the feedback form for your presentation, making it easier for attendees to provide valuable insights.
presentation. It contains a link to the feedback form for your <%= @event.event_type.name.downcase %>.
Please reply to this email if your presentation will be remote or if you'll be presenting using a MacBook. Should you have any questions or require further information, please do not hesitate to contact us by replying to this email.
Please respond to this email in case you have any questions. Best regards,
Regards,
The <%= @event.conference.title %> Team The <%= @event.conference.title %> Team

View File

@ -1,7 +1,10 @@
Здравейте, Здравейте,
За съжаление, поради големия брой предложения за лекции, които получихме тази година, както и ограниченото време, с което разполагаме, вашето предложение за <%= @event.event_type.name.mb_chars.downcase %> на тема „<%= @event.title %>“ не влезе в програмата. За съжаление, поради голямото количество предложения за лекции, които получихме тази година, и ограниченото ни време, предложението ви за <%= @event.event_type.name.mb_chars.downcase %> на тема „<%= @event.title %>“ няма да може да бъде включено в програмата.
Ако желаете, може да представите лекцията си в 5 минути в слота в програмата за Lightning talks (кратки лекции от по 5 минути). Записването за тях ще става на място. Обаче, ако желаете, може да представите лекцията си в рамките на 5 минути като част от програмата на Lightning talks (кратки 5 минутни лекции). Записването за тези слотове ще бъде възможно на място.
До скоро! Екипът на <%= @event.conference.title %> Благодарим ви за интереса и участието ви в нашето събитие. До скоро!
Поздрави,
Екипът на <%= @event.conference.title %>

View File

@ -1,8 +1,10 @@
Hi, Hello,
Regretfully, because of the high amount of talk submissions that we've received this year and the limited amount of time that we have, your submission for a <%= @event.event_type.name.mb_chars.downcase %> titled "<%= @event.title %>" was not included in the schedule. We regret to inform you that, due to an overwhelming number of talk submissions and the time constraints, we were unable to include your submission for a <%= @event.event_type.name.mb_chars.downcase %> titled "<%= @event.title %>" in the main schedule.
If you prefer, you can present your talk in 5 minutes in the Lightning talks slot (that's for short, 5 minute talks). The sign-up for these would be at the venue itself, during the event. However, we have an alternative option available for you. If you're interested, you can present a condensed, 5-minute version of your talk during our Lightning Talks slot at the event venue. You can sign up for Lightning Talks in person during the event.
See you soon, We appreciate your interest in contributing to <%= @event.conference.title %> and hope to see you there!
<%= @event.conference.title %> team
Best regards,
<%= @event.conference.title %> Team

View File

@ -12,10 +12,10 @@ html
- else - else
| Clarion | Clarion
= stylesheet_link_tag "management/application" = stylesheet_link_tag "management/application", nopush: false
= csrf_meta_tags = csrf_meta_tags
body body
main main
= render 'layouts/management/flash' = render 'layouts/management/flash'
== yield == yield
= javascript_include_tag "management/application" = javascript_include_tag "management/application", nopush: false

View File

@ -15,11 +15,11 @@ html
- else - else
| Clarion | Clarion
= stylesheet_link_tag "management/application" = stylesheet_link_tag "management/application", nopush: false
= csrf_meta_tags = csrf_meta_tags
body body
= render 'layouts/management/navigation' = render 'layouts/management/navigation'
main main
= render 'layouts/management/flash' = render 'layouts/management/flash'
== yield == yield
= javascript_include_tag "management/application" = javascript_include_tag "management/application", nopush: false

View File

@ -32,7 +32,9 @@ nav.navbar.navbar-static-top.navbar-inverse role="navigation"
/ li class="#{'active' if controller_name == 'propositions'}" / li class="#{'active' if controller_name == 'propositions'}"
/ = link_to [:management, current_conference, :propositions] do / = link_to [:management, current_conference, :propositions] do
/ => icon 'question', Proposition.model_name.human(count: 2).mb_chars.capitalize, class: 'fa-fw' / => icon 'question', Proposition.model_name.human(count: 2).mb_chars.capitalize, class: 'fa-fw'
li class="#{'active' if controller_name == 'feedback'}"
= link_to management_conference_feedback_index_path(current_conference) do
=> icon 'star-half-o', t('activerecord.models.feedback', count: 2).mb_chars.capitalize, class: 'fa-fw'
ul.nav.navbar-nav.navbar-right ul.nav.navbar-nav.navbar-right
li.dropdown li.dropdown
= link_to '#', class: 'dropdown-toggle', data: {toggle: 'dropdown'} do = link_to '#', class: 'dropdown-toggle', data: {toggle: 'dropdown'} do

View File

@ -5,7 +5,7 @@
.panel.panel-default .panel.panel-default
- if personal_profile.present? - if personal_profile.present?
.panel-image .panel-image
= image_tag personal_profile.picture.url = image_tag personal_profile.picture
.panel-body .panel-body
.media .media
.media-body .media-body

View File

@ -1,5 +1,5 @@
<%- csv_headers = %w{id title subtitle type track language paticipants status rank number_of_votes} -%> <%- csv_headers = %w{id title subtitle type track language paticipants length status rank number_of_votes proposer_notes} -%>
<%= CSV.generate_line(csv_headers).html_safe -%> <%= CSV.generate_line(csv_headers).html_safe -%>
<%- @events.each do |event| -%> <%- @events.each do |event| -%>
<%= CSV.generate_line([event.id, event.title, event.subtitle, event.event_type.name, event.track.name, event.language, participant_names_with_emails(event).join(', '), event.status, event.rank, event.number_of_votes]).html_safe -%> <%= CSV.generate_line([event.id, event.title, event.subtitle, event.event_type.name, event.track.name, event.language, participant_names_with_emails(event).join(', '), event.length, event.status, event.rank, event.number_of_votes, event.notes]).html_safe -%>
<%- end -%> <%- end -%>

View File

@ -0,0 +1,8 @@
<%- csv_headers = %w{id feedback_receiving_type feedback_receiving_id name/title author_email rating comment ip session_id created_at} -%>
<%= CSV.generate_line(csv_headers).html_safe -%>
<%- @conference.feedbacks.each do |feedback| -%>
<%= CSV.generate_line([feedback.id, feedback.feedback_receiving_type, feedback.feedback_receiving_id, feedback.feedback_receiving&.title || feefback.feedback_receiving&.name, feedback.author_email, feedback.rating, feedback.comment, feedback.ip_address, feedback.session_id, feedback.created_at]).html_safe -%>
<%- end -%>
<%- @conference.event_feedbacks.each do |feedback| -%>
<%= CSV.generate_line([feedback.id, feedback.feedback_receiving_type, feedback.feedback_receiving_id, feedback.feedback_receiving&.title || feefback.feedback_receiving&.name, feedback.author_email, feedback.rating, feedback.comment, feedback.ip_address, feedback.session_id, feedback.created_at]).html_safe -%>
<%- end -%>

View File

@ -0,0 +1,62 @@
- content_for :title
= t '.feedback'
.row
.col-lg-12
h1.page-header
= t '.feedback'
= link_to management_conference_feedback_index_path(@conference, format: 'csv'), class: 'btn btn-info pull-right'
= icon :download, t('.export')
- if @conference.start_date.past? || @conference.rated?
.row
.col-xs-12
h3
=< t '.overall_organisation'
- if @conference.rated?
.row
.col-md-10
.panel.panel-default
.panel-heading = t('.comments')
- if @conference.feedbacks_with_comment.order(created_at: :asc).size > 0
table.table.table-striped
tbody
= render partial: '/management/shared/feedback', collection: @conference.feedbacks_with_comment.order(created_at: :asc), locals: {hide_title: true}
- else
.panel-body
= t ('.no_comments_received')
.col-md-2
.panel.panel-info
.panel-heading
= t '.average_grade'
.panel-body.text-right
.huge
= number_with_precision(@conference.average_rating, precision: 2, strip_insignificant_zeros: true) || ''
= t('.total_feedback_grades', total_grades: @conference.feedbacks.count, count: @conference.feedbacks.count)
- else
p = t '.no_feedback_received'
- if @conference.start_date.past? || @conference.event_feedbacks_with_comment.order(created_at: :asc).size > 0
.row
.col-xs-12
h3
=< t '.events'
- if @conference.event_feedbacks.size > 0
.row
.col-md-10
.panel.panel-default
.panel-heading = t('.comments')
table.table.table-striped
tbody
= render partial: '/management/shared/feedback', collection: @conference.event_feedbacks_with_comment.order(created_at: :asc)
.col-md-2
.panel.panel-info
.panel-heading
= t '.average_grade'
.panel-body.text-right
.huge
= number_with_precision(@conference.event_feedbacks.average(:rating), precision: 2, strip_insignificant_zeros: true) || ''
= t('.total_feedback_grades', total_grades: @conference.event_feedbacks.count, count: @conference.event_feedbacks.count)
- else
p = t '.no_comments_received'

View File

@ -10,9 +10,9 @@
.panel-body .panel-body
.row .row
.col-lg-12 .col-lg-12
- if f.object.picture.present? - if f.object.picture.attached?
.col-sm-offset-3.col-sm-9 .col-sm-offset-3.col-sm-9
= image_tag f.object.picture.medium.url, class: 'img-thumbnail' = image_tag f.object.picture.variant(resize_to_limit: [150, 150]), class: 'img-thumbnail'
= f.input :picture, wrapper: :horizontal_file_input = f.input :picture, wrapper: :horizontal_file_input

View File

@ -27,10 +27,9 @@
.media .media
.media-left .media-left
- if profile.present? - if profile.present?
= image_tag(profile.picture.thumb.url) = image_tag(profile.picture.variant(resize_to_fill: [50, 50]))
- else - else
= image_tag(PictureUploader.new.thumb.url) = image_tag('avatar-placeholder.png')
.media-body .media-body
h4.media-heading h4.media-heading
- if profile.try(:name).present? - if profile.try(:name).present?

View File

@ -9,7 +9,7 @@
.col-sm-5.col-md-4 .col-sm-5.col-md-4
.panel.panel-default .panel.panel-default
.panel-image .panel-image
= image_tag @profile.picture.url = image_tag @profile.picture
.panel-body .panel-body
.media .media
.media-body .media-body

View File

@ -11,6 +11,6 @@ tr
= feedback.author_email = feedback.author_email
- else - else
= t(".anonymous") = t(".anonymous")
- if !local_assigns[:show_title] - if !local_assigns[:hide_title]
span<> = t '.about' span<> = t '.about'
= link_to feedback.feedback_receiving.title, [:management, feedback.feedback_receiving.conference, feedback.feedback_receiving] = link_to feedback.feedback_receiving.title, [:management, current_conference, feedback.feedback_receiving]

View File

@ -5,13 +5,14 @@
.col-lg-12 .col-lg-12
- if f.object.picture.present? - if f.object.picture.present?
.col-sm-offset-3.col-sm-9 .col-sm-offset-3.col-sm-9
= attachment_image_tag(@volunteer, :picture, :fill, 150, 150) if @volunteer.picture.present? = @volunteer.picture.variant(resize_to_limit: [150, 150]) if @volunteer.picture.attached?
= f.input :picture, as: :attachment, wrapper: :horizontal_file_input, direct: true = f.input :picture, as: :file, wrapper: :horizontal_file_input, direct: true
= f.input :name, autofocus: true = f.input :name, autofocus: true
= f.input :email = f.input :email
= f.association :volunteer_teams, as: :check_boxes, wrapper: :horizontal_radio_and_checkboxes, collection: current_conference.volunteer_teams = f.association :volunteer_team, as: :radio_buttons, wrapper: :horizontal_radio_and_checkboxes, collection: current_conference.volunteer_teams
= f.association :additional_volunteer_teams, as: :check_boxes, wrapper: :horizontal_radio_and_checkboxes, collection: current_conference.volunteer_teams
= f.input :phone, input_html: {value: @volunteer.phone.try(:phony_formatted, format: :international)} = f.input :phone, input_html: {value: @volunteer.phone.try(:phony_formatted, format: :international)}
= f.input :language, as: :radio_buttons, wrapper: :horizontal_radio_and_checkboxes, collection: locale_collection, include_blank: false, checked: (@volunteer.language.presence || I18n.locale) = f.input :language, as: :radio_buttons, wrapper: :horizontal_radio_and_checkboxes, collection: locale_collection, include_blank: false, checked: (@volunteer.language.presence || I18n.locale)
= f.input :tshirt_size, collection: Volunteer::TSHIRT_SIZES, as: :radio_buttons, wrapper: :horizontal_radio_and_checkboxes, checked: (@volunteer.tshirt_size.presence || :m) = f.input :tshirt_size, collection: Volunteer::TSHIRT_SIZES, as: :radio_buttons, wrapper: :horizontal_radio_and_checkboxes, checked: (@volunteer.tshirt_size.presence || :m)
@ -19,5 +20,6 @@
= f.input :food_preferences, collection: Volunteer::FOOD_PREFERENCES, wrapper: :horizontal_radio_and_checkboxes, as: :radio_buttons, checked: (@volunteer.food_preferences.presence || :none) = f.input :food_preferences, collection: Volunteer::FOOD_PREFERENCES, wrapper: :horizontal_radio_and_checkboxes, as: :radio_buttons, checked: (@volunteer.food_preferences.presence || :none)
= f.input :previous_experience = f.input :previous_experience
= f.input :notes = f.input :notes
= f.input :terms_accepted
.panel-footer.text-right .panel-footer.text-right
= f.submit class: 'btn btn-primary' = f.submit class: 'btn btn-primary'

View File

@ -1,9 +1,9 @@
<%- csv_headers = %w{id name email language unique_id phone tshirt_size tshirt_cut food_preferences previous_experience notes teams} -%> <%- csv_headers = %w{id name email language unique_id phone tshirt_size tshirt_cut food_preferences previous_experience notes team additional_teams} -%>
<%= CSV.generate_line(csv_headers).html_safe -%> <%= CSV.generate_line(csv_headers).html_safe -%>
<%- @volunteers.each do |volunteer| -%> <%- @volunteers.each do |volunteer| -%>
<%= CSV.generate_line([volunteer.id, <%= CSV.generate_line([volunteer.id,
volunteer.name, volunteer.name,
volunteer.email, "#{volunteer.confirmed_at.nil? ? '(unverified) ' : ''}#{volunteer.email}",
volunteer.language, volunteer.language,
volunteer.unique_id, volunteer.unique_id,
volunteer.phone, volunteer.phone,
@ -12,5 +12,6 @@
volunteer.food_preferences, volunteer.food_preferences,
volunteer.previous_experience, volunteer.previous_experience,
volunteer.notes, volunteer.notes,
volunteer.volunteer_teams.map(&:name).join(', ')]).html_safe -%> volunteer.volunteer_team.name,
volunteer.additional_volunteer_teams.map(&:name).join(', ')]).html_safe -%>
<%- end -%> <%- end -%>

View File

@ -32,7 +32,7 @@
thead thead
tr tr
th = t '.profile' th = t '.profile'
th = Volunteer.human_attribute_name :volunteer_teams th = Volunteer.human_attribute_name :volunteer_team
th.actions th.actions
tbody tbody
- @volunteers.each do |volunteer| - @volunteers.each do |volunteer|
@ -41,16 +41,16 @@
.media .media
.media-left .media-left
- if volunteer.picture.present? - if volunteer.picture.present?
= attachment_image_tag(volunteer, :picture, :fill, 50, 50) = image_tag volunteer.picture.variant(resize_to_limit: [50, 50])
- else - else
= image_tag(PictureUploader.new.thumb.url) = image_tag('avatar-placeholder.png')
.media-body .media-body
h4.media-heading h4.media-heading
= volunteer.name = volunteer.name
p p
= icon(:envelope, volunteer.email) = icon(volunteer.confirmed_at.present? ? "envelope" : "envelope-o", "#{volunteer.confirmed_at.nil? ? '(unverified) ' : ''}#{volunteer.email}")
td td
= volunteer.volunteer_teams.map(&:name).join(', ') = volunteer.volunteer_team.name
td.actions td.actions
div.btn-group.btn-group-sm div.btn-group.btn-group-sm
= action_buttons(current_conference, volunteer, [:show, :edit]) = action_buttons(current_conference, volunteer, [:show, :edit])

View File

@ -10,22 +10,25 @@
.panel-body .panel-body
.media .media
.media-left.hidden-sm.hidden-xs .media-left.hidden-sm.hidden-xs
- if @volunteer.picture.present? - if @volunteer.picture.attached?
= attachment_image_tag(@volunteer, :picture, :fill, 150, 150) = image_tag @volunteer.picture.variant(resize_to_limit: [150, 150])
- else - else
= image_tag(PictureUploader.new.medium.url) = image_tag('avatar-placeholder.png')
.media-body .media-body
.text-center.visible-sm.visible-xs .text-center.visible-sm.visible-xs
- if @volunteer.picture.present? - if @volunteer.picture.attached?
= attachment_image_tag(@volunteer, :picture, :fill, 150, 150) = image_tag @volunteer.picture.variant(resize_to_limit: [150, 150])
- else - else
= image_tag(PictureUploader.new.medium.url) = image_tag('avatar-placeholder.png')
h4.media-heading h4.media-heading
= @volunteer.name = @volunteer.name
hr hr
h4 = Volunteer.human_attribute_name(:volunteer_teams) h4 = Volunteer.human_attribute_name(:volunteer_team)
= @volunteer.volunteer_teams.map(&:name).join(', ') = @volunteer.volunteer_team.name
h4 = Volunteer.human_attribute_name(:additional_volunteer_teams)
= @volunteer.additional_volunteer_teams.map(&:name).join(', ')
- if @volunteer.previous_experience.present? - if @volunteer.previous_experience.present?
h4 = Volunteer.human_attribute_name(:previous_experience) h4 = Volunteer.human_attribute_name(:previous_experience)
= simple_format @volunteer.previous_experience = simple_format @volunteer.previous_experience
@ -35,7 +38,7 @@
h4 = t '.other_info' h4 = t '.other_info'
= icon(:language, t("locales.#{@volunteer.language}")) = icon(:language, t("locales.#{@volunteer.language}"))
br br
= icon(:envelope, @volunteer.email) = icon(@volunteer.confirmed_at.present? ? "envelope" : "envelope-o", @volunteer.email)
br br
= icon(:phone, @volunteer.phone.try(:phony_formatted, format: :international)) = icon(:phone, @volunteer.phone.try(:phony_formatted, format: :international))
br br

View File

@ -1,22 +1,11 @@
Здравейте, Здравейте,
<%= @volunteer.name %> <<%= @volunteer.email %>> изпрати кандидатура за доброволец. Някой изпрати кандидатура за доброволец.
Екипи: <%= @volunteer.volunteer_teams.map(&:name).join(', ') %> Екип: <%= @volunteer.volunteer_team.name %>
Връзка към профил: <%= management_conference_volunteer_url(@volunteer.conference, @volunteer) %>
Снимка: <%= attachment_url(@volunteer, :picture, host: "https://#{@volunteer.conference.host_name}/") %>
Език: <%= @volunteer.language %> Език: <%= @volunteer.language %>
Телефон: <%= @volunteer.phone %>
Размер на тениска: <%= @volunteer.tshirt_size %> Размер на тениска: <%= @volunteer.tshirt_size %>
Кройка на тениска: <%= @volunteer.tshirt_cut %> Кройка на тениска: <%= @volunteer.tshirt_cut %>
Предпочитания за храна: <%= @volunteer.food_preferences %>
<% if @volunteer.previous_experience.present? -%>
Предходен опит:
<%= @volunteer.previous_experience %>
<% end -%>
<% if @volunteer.notes.present? -%>
Бележки:
<%= @volunteer.notes %>
<% end -%>

View File

@ -0,0 +1,5 @@
Здравейте,
Моля, потвърдете e-mail адреса си от следния линк:
<%= confirm_volunteer_url(@volunteer.unique_id, confirmation_token: @volunteer.confirmation_token, host: @volunteer.conference.host_name, protocol: 'https') %>

View File

@ -0,0 +1,5 @@
Hello,
Please confirm your e-mail address by clicking the following link:
<%= confirm_volunteer_url(@volunteer.unique_id, confirmation_token: @volunteer.confirmation_token, host: @volunteer.conference.host_name, protocol: 'https') %>

View File

@ -1,6 +1,6 @@
Здравейте, Здравейте,
Кандидатурата Ви беше получена. Кандидатурата ви беше получена.
Можете да я редактирате по всяко време от този адрес: Можете да я редактирате по всяко време от този адрес:

8
bin/docker-entrypoint Executable file
View File

@ -0,0 +1,8 @@
#!/bin/bash -e
# If running the rails server then create or migrate existing database
if [ "${1}" == "./bin/rails" ] && [ "${2}" == "server" ]; then
./bin/rails db:prepare
fi
exec "${@}"

View File

@ -1,9 +1,4 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
begin APP_PATH = File.expand_path("../config/application", __dir__)
load File.expand_path('../spring', __FILE__) require_relative "../config/boot"
rescue LoadError => e require "rails/commands"
raise unless e.message.include?('spring')
end
APP_PATH = File.expand_path('../config/application', __dir__)
require_relative '../config/boot'
require 'rails/commands'

View File

@ -1,9 +1,4 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
begin require_relative "../config/boot"
load File.expand_path('../spring', __FILE__) require "rake"
rescue LoadError => e
raise unless e.message.include?('spring')
end
require_relative '../config/boot'
require 'rake'
Rake.application.run Rake.application.run

View File

@ -1,36 +1,33 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
require 'fileutils' require "fileutils"
include FileUtils
# path to your application root. # path to your application root.
APP_ROOT = File.expand_path('..', __dir__) APP_ROOT = File.expand_path("..", __dir__)
def system!(*args) def system!(*args)
system(*args) || abort("\n== Command #{args} failed ==") system(*args, exception: true)
end end
chdir APP_ROOT do FileUtils.chdir APP_ROOT do
# This script is a starting point to setup your application. # This script is a way to set up or update your development environment automatically.
# This script is idempotent, so that you can run it at any time and get an expectable outcome.
# Add necessary setup steps to this file. # Add necessary setup steps to this file.
puts '== Installing dependencies ==' puts "== Installing dependencies =="
system! 'gem install bundler --conservative' system! "gem install bundler --conservative"
system('bundle check') || system!('bundle install') system("bundle check") || system!("bundle install")
# Install JavaScript dependencies if using Yarn
# system('bin/yarn')
# puts "\n== Copying sample files ==" # puts "\n== Copying sample files =="
# unless File.exist?('config/database.yml') # unless File.exist?("config/database.yml")
# cp 'config/database.yml.sample', 'config/database.yml' # FileUtils.cp "config/database.yml.sample", "config/database.yml"
# end # end
puts "\n== Preparing database ==" puts "\n== Preparing database =="
system! 'bin/rails db:setup' system! "bin/rails db:prepare"
puts "\n== Removing old logs and tempfiles ==" puts "\n== Removing old logs and tempfiles =="
system! 'bin/rails log:clear tmp:clear' system! "bin/rails log:clear tmp:clear"
puts "\n== Restarting application server ==" puts "\n== Restarting application server =="
system! 'bin/rails restart' system! "bin/rails restart"
end end

View File

@ -1,17 +0,0 @@
#!/usr/bin/env ruby
# This file loads spring without using Bundler, in order to be fast.
# It gets overwritten when you run the `spring binstub` command.
unless defined?(Spring)
require 'rubygems'
require 'bundler'
lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read)
spring = lockfile.specs.detect { |spec| spec.name == "spring" }
if spring
Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path
gem 'spring', spring.version
require 'spring/binstub'
end
end

5
bin/thrust Executable file
View File

@ -0,0 +1,5 @@
#!/usr/bin/env ruby
require "rubygems"
require "bundler/setup"
load Gem.bin_path("thruster", "thrust")

View File

@ -1,9 +1,15 @@
#!/usr/bin/env ruby #!/usr/bin/env ruby
APP_ROOT = File.expand_path('..', __dir__) APP_ROOT = File.expand_path('..', __dir__)
Dir.chdir(APP_ROOT) do Dir.chdir(APP_ROOT) do
begin yarn = ENV["PATH"].split(File::PATH_SEPARATOR).
exec "yarnpkg", *ARGV select { |dir| File.expand_path(dir) != __dir__ }.
rescue Errno::ENOENT product(["yarn", "yarn.cmd", "yarn.ps1"]).
map { |dir, file| File.expand_path(file, dir) }.
find { |file| File.executable?(file) }
if yarn
exec yarn, *ARGV
else
$stderr.puts "Yarn executable was not detected in the system." $stderr.puts "Yarn executable was not detected in the system."
$stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install"
exit 1 exit 1

View File

@ -1,4 +1,6 @@
# This file is used by Rack-based servers to start the application. # This file is used by Rack-based servers to start the application.
require ::File.expand_path("../config/environment", __FILE__) require_relative "config/environment"
run Rails.application run Rails.application
Rails.application.load_server

View File

@ -9,30 +9,33 @@ Bundler.require(*Rails.groups)
module Clarion module Clarion
class Application < Rails::Application class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version. # Initialize configuration defaults for originally generated Rails version.
config.load_defaults 5.2 config.load_defaults 7.1
# Settings in config/environments/* take precedence over those specified here. # Please, add to the `ignore` list any other `lib` subdirectories that do
# Application configuration can go into files in config/initializers # not contain `.rb` files, or that should not be reloaded or eager loaded.
# -- all .rb files in that directory are automatically loaded after loading # Common ones are `templates`, `generators`, or `middleware`, for example.
# the framework and any gems in your application. config.autoload_lib(ignore: %w(assets tasks))
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Configuration for the application, engines, and railties goes here.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. #
# These settings can be overridden in specific environments using the files
# in config/environments, which are processed later.
#
config.time_zone = "Sofia" config.time_zone = "Sofia"
# config.eager_load_paths << Rails.root.join("extras")
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
config.i18n.available_locales = [:bg, :en] config.i18n.available_locales = [:bg, :en]
config.i18n.default_locale = :bg config.i18n.default_locale = :bg
config.active_record.schema_format = :sql config.active_record.schema_format = :sql
config.generators do |g| config.generators do |g|
g.test_framework :rspec, fixtures: true, g.test_framework :rspec,
view_specs: false, fixtures: true,
helper_specs: false, view_specs: false,
routing_specs: false, helper_specs: false,
request_specs: false routing_specs: false,
request_specs: false
g.fixture_replacement :factory_bot, dir: "spec/factories" g.fixture_replacement :factory_bot, dir: "spec/factories"
end end

View File

@ -2,7 +2,7 @@ development:
adapter: async adapter: async
test: test:
adapter: async adapter: test
production: production:
adapter: redis adapter: redis

85
config/database.yml Normal file
View File

@ -0,0 +1,85 @@
# PostgreSQL. Versions 9.3 and up are supported.
#
# Install the pg driver:
# gem install pg
# On macOS with Homebrew:
# gem install pg -- --with-pg-config=/usr/local/bin/pg_config
# On Windows:
# gem install pg
# Choose the win32 build.
# Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem "pg"
#
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: clarion_development
# The specified database role being used to connect to PostgreSQL.
# To create additional roles in PostgreSQL see `$ createuser --help`.
# When left blank, PostgreSQL will use the default role. This is
# the same name as the operating system user running Rails.
#username: clarion
# The password associated with the PostgreSQL role (username).
#password:
# Connect on a TCP socket. Omitted by default since the client uses a
# domain socket that doesn't need configuration. Windows does not have
# domain sockets, so uncomment these lines.
#host: localhost
# The TCP port the server listens on. Defaults to 5432.
# If your server runs on a different port number, change accordingly.
#port: 5432
# Schema search path. The server defaults to $user,public
#schema_search_path: myapp,sharedapp,public
# Minimum log levels, in increasing order:
# debug5, debug4, debug3, debug2, debug1,
# log, notice, warning, error, fatal, and panic
# Defaults to warning.
#min_messages: notice
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: clarion_test
# As with config/credentials.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password or a full connection URL as an environment
# variable when you boot the app. For example:
#
# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase"
#
# If the connection URL is provided in the special DATABASE_URL environment
# variable, Rails will automatically merge its configuration values on top of
# the values provided in this file. Alternatively, you can specify a connection
# URL environment variable explicitly:
#
# production:
# url: <%= ENV["MY_APP_DATABASE_URL"] %>
#
# Read https://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full overview on how database connection configuration can be specified.
#
production:
<<: *default
host: <%= ENV.fetch("CLARION_DATABASE_HOST") { "host.containers.internal" } %>
database: clarion
username: clarion
password: <%= ENV["CLARION_DATABASE_PASSWORD"] %>

View File

@ -39,7 +39,7 @@ set :linked_dirs, fetch(:linked_dirs, []).push("log", "tmp/uploads", "tmp/pids",
# Default value for keep_releases is 5 # Default value for keep_releases is 5
set :keep_releases, 550 set :keep_releases, 550
set :rvm_ruby_version, "2.6.5" set :rvm_ruby_version, "3.3.5"
set :puma_bind, ["tcp://127.0.0.1:9087"] set :puma_bind, ["tcp://127.0.0.1:9087"]
set :puma_init_active_record, true set :puma_init_active_record, true

View File

@ -1,10 +1,12 @@
require "active_support/core_ext/integer/time"
Rails.application.configure do Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb. # Settings specified here will take precedence over those in config/application.rb.
# In the development environment your application's code is reloaded on # In the development environment your application's code is reloaded any time
# every request. This slows down response time but is perfect for development # it changes. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes. # since you don't have to restart the web server when you make code changes.
config.cache_classes = false config.enable_reloading = true
# Do not eager load code on boot. # Do not eager load code on boot.
config.eager_load = false config.eager_load = false
@ -12,14 +14,18 @@ Rails.application.configure do
# Show full error reports. # Show full error reports.
config.consider_all_requests_local = true config.consider_all_requests_local = true
# Enable server timing
config.server_timing = true
# Enable/disable caching. By default caching is disabled. # Enable/disable caching. By default caching is disabled.
# Run rails dev:cache to toggle caching. # Run rails dev:cache to toggle caching.
if Rails.root.join("tmp", "caching-dev.txt").exist? if Rails.root.join("tmp/caching-dev.txt").exist?
config.action_controller.perform_caching = true config.action_controller.perform_caching = true
config.action_controller.enable_fragment_cache_logging = true
config.cache_store = :memory_store config.cache_store = :memory_store
config.public_file_server.headers = { config.public_file_server.headers = {
"Cache-Control" => "public, max-age=#{2.days.to_i}", "Cache-Control" => "public, max-age=#{2.days.to_i}"
} }
else else
config.action_controller.perform_caching = false config.action_controller.perform_caching = false
@ -27,7 +33,7 @@ Rails.application.configure do
config.cache_store = :null_store config.cache_store = :null_store
end end
# Store uploaded files on the local file system (see config/storage.yml for options) # Store uploaded files on the local file system (see config/storage.yml for options).
config.active_storage.service = :local config.active_storage.service = :local
# Don't care if the mailer can't send. # Don't care if the mailer can't send.
@ -41,24 +47,35 @@ Rails.application.configure do
# Print deprecation notices to the Rails logger. # Print deprecation notices to the Rails logger.
config.active_support.deprecation = :log config.active_support.deprecation = :log
# Raise exceptions for disallowed deprecations.
config.active_support.disallowed_deprecation = :raise
# Tell Active Support which deprecation messages to disallow.
config.active_support.disallowed_deprecation_warnings = []
# Raise an error on page load if there are pending migrations. # Raise an error on page load if there are pending migrations.
config.active_record.migration_error = :page_load config.active_record.migration_error = :page_load
# Highlight code that triggered database queries in logs. # Highlight code that triggered database queries in logs.
config.active_record.verbose_query_logs = true config.active_record.verbose_query_logs = true
# Debug mode disables concatenation and preprocessing of assets. # Highlight code that enqueued background job in logs.
# This option may cause significant delays in view rendering with a large config.active_job.verbose_enqueue_logs = true
# number of complex assets.
config.assets.debug = true
# Suppress logger output for asset requests. # Suppress logger output for asset requests.
config.assets.quiet = true config.assets.quiet = true
# Raises error for missing translations # Raises error for missing translations.
# config.action_view.raise_on_missing_translations = true # config.i18n.raise_on_missing_translations = true
# Use an evented file watcher to asynchronously detect changes in source code, # Annotate rendered view with file names.
# routes, locales, etc. This feature depends on the listen gem. # config.action_view.annotate_rendered_view_with_filenames = true
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
# Uncomment if you wish to allow Action Cable access from any origin.
# config.action_cable.disable_request_forgery_protection = true
# Raise error when a before_action's only/except options reference missing actions
config.action_controller.raise_on_missing_callback_actions = true
config.hosts << "dev.openfest.org:3000"
end end

View File

@ -1,8 +1,10 @@
require "active_support/core_ext/integer/time"
Rails.application.configure do Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb. # Settings specified here will take precedence over those in config/application.rb.
# Code is not reloaded between requests. # Code is not reloaded between requests.
config.cache_classes = true config.enable_reloading = false
# Eager load code on boot. This eager loads most of Rails and # Eager load code on boot. This eager loads most of Rails and
# your application in memory, allowing both threaded web servers # your application in memory, allowing both threaded web servers
@ -11,57 +13,72 @@ Rails.application.configure do
config.eager_load = true config.eager_load = true
# Full error reports are disabled and caching is turned on. # Full error reports are disabled and caching is turned on.
config.consider_all_requests_local = false config.consider_all_requests_local = false
config.action_controller.perform_caching = true config.action_controller.perform_caching = true
# Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] # Ensures that a master key has been made available in ENV["RAILS_MASTER_KEY"], config/master.key, or an environment
# or in config/master.key. This key is used to decrypt credentials (and other encrypted files). # key such as config/credentials/production.key. This key is used to decrypt credentials (and other encrypted files).
# config.require_master_key = true # config.require_master_key = true
# Disable serving static files from the `/public` folder by default since # Disable serving static files from `public/`, relying on NGINX/Apache to do so instead.
# Apache or NGINX already handles this. # config.public_file_server.enabled = false
config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present?
# Compress JavaScripts and CSS. # Compress CSS using a preprocessor.
config.assets.js_compressor = :uglifier
# config.assets.css_compressor = :sass # config.assets.css_compressor = :sass
# Do not fallback to assets pipeline if a precompiled asset is missed. # Do not fall back to assets pipeline if a precompiled asset is missed.
config.assets.compile = false config.assets.compile = false
# `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb
# Enable serving of images, stylesheets, and JavaScripts from an asset server. # Enable serving of images, stylesheets, and JavaScripts from an asset server.
# config.action_controller.asset_host = 'http://assets.example.com' # config.asset_host = "http://assets.example.com"
# Specifies the header that your server uses for sending files. # Specifies the header that your server uses for sending files.
# config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for Apache
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX # config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" # for NGINX
# Store uploaded files on the local file system (see config/storage.yml for options) # Store uploaded files on the local file system (see config/storage.yml for options).
config.active_storage.service = :local config.active_storage.service = :local
# Mount Action Cable outside main process or domain # Mount Action Cable outside main process or domain.
# config.action_cable.mount_path = nil # config.action_cable.mount_path = nil
# config.action_cable.url = 'wss://example.com/cable' # config.action_cable.url = "wss://example.com/cable"
# config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] # config.action_cable.allowed_request_origins = [ "http://example.com", /http:\/\/example.*/ ]
# Assume all access to the app is happening through a SSL-terminating reverse proxy.
# Can be used together with config.force_ssl for Strict-Transport-Security and secure cookies.
config.assume_ssl = true
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
config.force_ssl = true config.force_ssl = ENV["CLARION_USE_PLAINTEXT"] != "yes"
# Use the lowest log level to ensure availability of diagnostic information # Log to STDOUT by default
# when problems arise. config.logger = ActiveSupport::Logger.new(STDOUT)
config.log_level = :debug .tap { |logger| logger.formatter = ::Logger::Formatter.new }
.then { |logger| ActiveSupport::TaggedLogging.new(logger) }
# Prepend all log lines with the following tags. # Prepend all log lines with the following tags.
config.log_tags = [:request_id] config.log_tags = [
:request_id,
:subdomain,
->(req) {
session_key = (Rails.application.config.session_options || {})[:key]
session_data = req.cookie_jar.encrypted[session_key] || {}
user_id = session_data["warden.user.user.key"]&.flatten&.first || "guest"
"user: #{user_id}"
}
]
# "info" includes generic and useful information about system operation, but avoids logging too much
# information to avoid inadvertent exposure of personally identifiable information (PII). If you
# want to log everything, set the level to "debug".
config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info")
# Use a different cache store in production. # Use a different cache store in production.
# config.cache_store = :mem_cache_store # config.cache_store = :mem_cache_store
# Use a real queuing backend for Active Job (and separate queues per environment) # Use a real queuing backend for Active Job (and separate queues per environment).
# config.active_job.queue_adapter = :resque # config.active_job.queue_adapter = :resque
# config.active_job.queue_name_prefix = "clarion_#{Rails.env}" # config.active_job.queue_name_prefix = "clarion_production"
config.action_mailer.perform_caching = false config.action_mailer.perform_caching = false
@ -69,30 +86,28 @@ Rails.application.configure do
# Set this to true and configure the email server for immediate delivery to raise delivery errors. # Set this to true and configure the email server for immediate delivery to raise delivery errors.
# config.action_mailer.raise_delivery_errors = false # config.action_mailer.raise_delivery_errors = false
config.action_mailer.delivery_method = :sendmail config.action_mailer.delivery_method = :smtp
config.action_mailer.default_options = {from: "no-reply@openfest.org"} config.action_mailer.default_options = {from: "OpenFest <cfp@openfest.org>"}
config.action_mailer.default_url_options = {host: "cfp.openfest.org"} config.action_mailer.default_url_options = {host: "cfp.openfest.org"}
config.action_mailer.smtp_settings = {
address: ENV.fetch("CLARION_MAIL_SERVER", "mail.openfest.org")
}
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation cannot be found). # the I18n.default_locale when a translation cannot be found).
config.i18n.fallbacks = true config.i18n.fallbacks = true
# Send deprecation notices to registered listeners. # Don't log any deprecations.
config.active_support.deprecation = :notify config.active_support.report_deprecations = false
# Use default logging formatter so that PID and timestamp are not suppressed.
config.log_formatter = ::Logger::Formatter.new
# Use a different logger for distributed setups.
# require 'syslog/logger'
# config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')
if ENV["RAILS_LOG_TO_STDOUT"].present?
logger = ActiveSupport::Logger.new(STDOUT)
logger.formatter = config.log_formatter
config.logger = ActiveSupport::TaggedLogging.new(logger)
end
# Do not dump schema after migrations. # Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false config.active_record.dump_schema_after_migration = false
# Enable DNS rebinding protection and other `Host` header attacks.
# config.hosts = [
# "example.com", # Allow requests from example.com
# /.*\.example\.com/ # Allow requests from subdomains like `www.example.com`
# ]
# Skip DNS rebinding protection for the default health check endpoint.
# config.host_authorization = { exclude: ->(request) { request.path == "/up" } }
end end

View File

@ -1,34 +1,40 @@
require "active_support/core_ext/integer/time"
# The test environment is used exclusively to run your application's
# test suite. You never need to work with it otherwise. Remember that
# your test database is "scratch space" for the test suite and is wiped
# and recreated between test runs. Don't rely on the data there!
Rails.application.configure do Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb. # Settings specified here will take precedence over those in config/application.rb.
# The test environment is used exclusively to run your application's # While tests run files are not watched, reloading is not necessary.
# test suite. You never need to work with it otherwise. Remember that config.enable_reloading = false
# your test database is "scratch space" for the test suite and is wiped
# and recreated between test runs. Don't rely on the data there!
config.cache_classes = true
# Do not eager load code on boot. This avoids loading your whole application # Eager loading loads your entire application. When running a single test locally,
# just for the purpose of running a single test. If you are using a tool that # this is usually not necessary, and can slow down your test suite. However, it's
# preloads Rails for running tests, you may have to set it to true. # recommended that you enable it in continuous integration systems to ensure eager
config.eager_load = false # loading is working properly before deploying your code.
config.eager_load = ENV["CI"].present?
# Configure public file server for tests with Cache-Control for performance. # Configure public file server for tests with Cache-Control for performance.
config.public_file_server.enabled = true config.public_file_server.enabled = true
config.public_file_server.headers = { config.public_file_server.headers = {
"Cache-Control" => "public, max-age=#{1.hour.to_i}", "Cache-Control" => "public, max-age=#{1.hour.to_i}"
} }
# Show full error reports and disable caching. # Show full error reports and disable caching.
config.consider_all_requests_local = true config.consider_all_requests_local = true
config.action_controller.perform_caching = false config.action_controller.perform_caching = false
config.cache_store = :null_store
# Raise exceptions instead of rendering exception templates. # Render exception templates for rescuable exceptions and raise for other exceptions.
config.action_dispatch.show_exceptions = false config.action_dispatch.show_exceptions = :rescuable
# Disable request forgery protection in test environment. # Disable request forgery protection in test environment.
config.action_controller.allow_forgery_protection = false config.action_controller.allow_forgery_protection = false
# Store uploaded files on the local file system in a temporary directory # Store uploaded files on the local file system in a temporary directory.
config.active_storage.service = :test config.active_storage.service = :test
config.action_mailer.perform_caching = false config.action_mailer.perform_caching = false
@ -44,6 +50,18 @@ Rails.application.configure do
# Print deprecation notices to the stderr. # Print deprecation notices to the stderr.
config.active_support.deprecation = :stderr config.active_support.deprecation = :stderr
# Raises error for missing translations # Raise exceptions for disallowed deprecations.
# config.action_view.raise_on_missing_translations = true config.active_support.disallowed_deprecation = :raise
# Tell Active Support which deprecation messages to disallow.
config.active_support.disallowed_deprecation_warnings = []
# Raises error for missing translations.
# config.i18n.raise_on_missing_translations = true
# Annotate rendered view with file names.
# config.action_view.annotate_rendered_view_with_filenames = true
# Raise error when a before_action's only/except options reference missing actions
config.action_controller.raise_on_missing_callback_actions = true
end end

View File

@ -0,0 +1 @@
Rails.application.config.active_storage.resolve_model_to_route = :rails_storage_proxy

View File

@ -5,13 +5,11 @@ Rails.application.config.assets.version = "1.0"
# Add additional assets to the asset load path. # Add additional assets to the asset load path.
# Rails.application.config.assets.paths << Emoji.images_path # Rails.application.config.assets.paths << Emoji.images_path
# Add Yarn node_modules folder to the asset load path.
Rails.application.config.assets.paths << Rails.root.join("node_modules")
Rails.application.config.assets.paths << "lib/initfest/assets/images" Rails.application.config.assets.paths << "lib/initfest/assets/images"
Rails.application.config.assets.paths << "lib/initfest/assets/javascripts" Rails.application.config.assets.paths << "lib/initfest/assets/javascripts"
Rails.application.config.assets.paths << "lib/initfest/assets/stylesheets" Rails.application.config.assets.paths << "lib/initfest/assets/stylesheets"
Rails.application.config.assets.precompile << /\.(?:png|jpg|jpeg|gif)\z/ #Rails.application.config.assets.precompile << /\.(?:png|jpg|jpeg|gif)\z/
# Precompile additional assets. # Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in the app/assets # application.js, application.css, and all non-JS/CSS in the app/assets

View File

@ -1,7 +1,8 @@
# Be sure to restart your server when you modify this file. # Be sure to restart your server when you modify this file.
# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } # Rails.backtrace_cleaner.add_silencer { |line| /my_noisy_library/.match?(line) }
# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code
# Rails.backtrace_cleaner.remove_silencers! # by setting BACKTRACE=1 before calling your invocation, like "BACKTRACE=1 ./bin/rails runner 'MyClass.perform'".
Rails.backtrace_cleaner.remove_silencers! if ENV["BACKTRACE"]

View File

@ -1,25 +1,25 @@
# Be sure to restart your server when you modify this file. # Be sure to restart your server when you modify this file.
# Define an application-wide content security policy # Define an application-wide content security policy.
# For further information see the following documentation # See the Securing Rails Applications Guide for more information:
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy # https://guides.rubyonrails.org/security.html#content-security-policy-header
# Rails.application.config.content_security_policy do |policy| # Rails.application.configure do
# policy.default_src :self, :https # config.content_security_policy do |policy|
# policy.font_src :self, :https, :data # policy.default_src :self, :https
# policy.img_src :self, :https, :data # policy.font_src :self, :https, :data
# policy.object_src :none # policy.img_src :self, :https, :data
# policy.script_src :self, :https # policy.object_src :none
# policy.style_src :self, :https # policy.script_src :self, :https
# policy.style_src :self, :https
# # Specify URI for violation reports # # Specify URI for violation reports
# # policy.report_uri "/csp-violation-report-endpoint" # # policy.report_uri "/csp-violation-report-endpoint"
# end
#
# # Generate session nonces for permitted importmap, inline scripts, and inline styles.
# config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s }
# config.content_security_policy_nonce_directives = %w(script-src style-src)
#
# # Report violations without enforcing the policy.
# # config.content_security_policy_report_only = true
# end # end
# If you are using UJS then enable automatic nonce generation
# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) }
# Report CSP violations to a specified URI
# For further information see the following documentation:
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only
# Rails.application.config.content_security_policy_report_only = true

View File

@ -12,7 +12,7 @@ Devise.setup do |config|
# Configure the e-mail address which will be shown in Devise::Mailer, # Configure the e-mail address which will be shown in Devise::Mailer,
# note that it will be overwritten if you use your own mailer class # note that it will be overwritten if you use your own mailer class
# with default "from" parameter. # with default "from" parameter.
config.mailer_sender = "no-reply@openfest.org" config.mailer_sender = "OpenFest <cfp@openfest.org>"
# Configure the class responsible to send e-mails. # Configure the class responsible to send e-mails.
# config.mailer = 'Devise::Mailer' # config.mailer = 'Devise::Mailer'

View File

@ -1,4 +1,8 @@
# Be sure to restart your server when you modify this file. # Be sure to restart your server when you modify this file.
# Configure sensitive parameters which will be filtered from the log file. # Configure parameters to be partially matched (e.g. passw matches password) and filtered from the log file.
Rails.application.config.filter_parameters += [:password] # Use this to limit dissemination of sensitive information.
# See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors.
Rails.application.config.filter_parameters += [
:passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn
]

View File

@ -4,13 +4,13 @@
# are locale specific, and you may define rules for as many different # are locale specific, and you may define rules for as many different
# locales as you wish. All of these examples are active by default: # locales as you wish. All of these examples are active by default:
# ActiveSupport::Inflector.inflections(:en) do |inflect| # ActiveSupport::Inflector.inflections(:en) do |inflect|
# inflect.plural /^(ox)$/i, '\1en' # inflect.plural /^(ox)$/i, "\\1en"
# inflect.singular /^(ox)en/i, '\1' # inflect.singular /^(ox)en/i, "\\1"
# inflect.irregular 'person', 'people' # inflect.irregular "person", "people"
# inflect.uncountable %w( fish sheep ) # inflect.uncountable %w( fish sheep )
# end # end
# These inflection rules are supported but not enabled by default: # These inflection rules are supported but not enabled by default:
# ActiveSupport::Inflector.inflections(:en) do |inflect| # ActiveSupport::Inflector.inflections(:en) do |inflect|
# inflect.acronym 'RESTful' # inflect.acronym "RESTful"
# end # end

View File

@ -0,0 +1,45 @@
# Be sure to restart your server when you modify this file.
#
# This file contains migration options to ease your Rails 6.0 upgrade.
#
# Once upgraded flip defaults one by one to migrate to the new default.
#
# Read the Guide for Upgrading Ruby on Rails for more info on each option.
# Don't force requests from old versions of IE to be UTF-8 encoded.
# Rails.application.config.action_view.default_enforce_utf8 = false
# Embed purpose and expiry metadata inside signed and encrypted
# cookies for increased security.
#
# This option is not backwards compatible with earlier Rails versions.
# It's best enabled when your entire app is migrated and stable on 6.0.
# Rails.application.config.action_dispatch.use_cookies_with_metadata = true
# Change the return value of `ActionDispatch::Response#content_type` to Content-Type header without modification.
# Rails.application.config.action_dispatch.return_only_media_type_on_content_type = false
# Return false instead of self when enqueuing is aborted from a callback.
# Rails.application.config.active_job.return_false_on_aborted_enqueue = true
# Send Active Storage analysis and purge jobs to dedicated queues.
# Rails.application.config.active_storage.queues.analysis = :active_storage_analysis
# Rails.application.config.active_storage.queues.purge = :active_storage_purge
# When assigning to a collection of attachments declared via `has_many_attached`, replace existing
# attachments instead of appending. Use #attach to add new attachments without replacing existing ones.
Rails.application.config.active_storage.replace_on_assign_to_many = true
# Use ActionMailer::MailDeliveryJob for sending parameterized and normal mail.
#
# The default delivery jobs (ActionMailer::Parameterized::DeliveryJob, ActionMailer::DeliveryJob),
# will be removed in Rails 6.1. This setting is not backwards compatible with earlier Rails versions.
# If you send mail in the background, job workers need to have a copy of
# MailDeliveryJob to ensure all delivery jobs are processed properly.
# Make sure your entire app is migrated and stable on 6.0 before using this setting.
# Rails.application.config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob"
# Enable the same cache key to be reused when the object being cached of type
# `ActiveRecord::Relation` changes by moving the volatile information (max updated at and count)
# of the relation's cache key into the cache version to support recycling cache key.
# Rails.application.config.active_record.collection_cache_versioning = true

View File

@ -0,0 +1,67 @@
# Be sure to restart your server when you modify this file.
#
# This file contains migration options to ease your Rails 6.1 upgrade.
#
# Once upgraded flip defaults one by one to migrate to the new default.
#
# Read the Guide for Upgrading Ruby on Rails for more info on each option.
# Support for inversing belongs_to -> has_many Active Record associations.
# Rails.application.config.active_record.has_many_inversing = true
# Track Active Storage variants in the database.
Rails.application.config.active_storage.track_variants = true
# Apply random variation to the delay when retrying failed jobs.
# Rails.application.config.active_job.retry_jitter = 0.15
# Stop executing `after_enqueue`/`after_perform` callbacks if
# `before_enqueue`/`before_perform` respectively halts with `throw :abort`.
# Rails.application.config.active_job.skip_after_callbacks_if_terminated = true
# Specify cookies SameSite protection level: either :none, :lax, or :strict.
#
# This change is not backwards compatible with earlier Rails versions.
# It's best enabled when your entire app is migrated and stable on 6.1.
# Rails.application.config.action_dispatch.cookies_same_site_protection = :lax
# Generate CSRF tokens that are encoded in URL-safe Base64.
#
# This change is not backwards compatible with earlier Rails versions.
# It's best enabled when your entire app is migrated and stable on 6.1.
# Rails.application.config.action_controller.urlsafe_csrf_tokens = true
# Specify whether `ActiveSupport::TimeZone.utc_to_local` returns a time with an
# UTC offset or a UTC time.
# ActiveSupport.utc_to_local_returns_utc_offset_times = true
# Change the default HTTP status code to `308` when redirecting non-GET/HEAD
# requests to HTTPS in `ActionDispatch::SSL` middleware.
# Rails.application.config.action_dispatch.ssl_default_redirect_status = 308
# Use new connection handling API. For most applications this won't have any
# effect. For applications using multiple databases, this new API provides
# support for granular connection swapping.
# Rails.application.config.active_record.legacy_connection_handling = false
# Make `form_with` generate non-remote forms by default.
# Rails.application.config.action_view.form_with_generates_remote_forms = false
# Set the default queue name for the analysis job to the queue adapter default.
Rails.application.config.active_storage.queues.analysis = nil
# Set the default queue name for the purge job to the queue adapter default.
Rails.application.config.active_storage.queues.purge = nil
# Set the default queue name for the incineration job to the queue adapter default.
# Rails.application.config.action_mailbox.queues.incineration = nil
# Set the default queue name for the routing job to the queue adapter default.
# Rails.application.config.action_mailbox.queues.routing = nil
# Set the default queue name for the mail deliver job to the queue adapter default.
# Rails.application.config.action_mailer.deliver_later_queue_name = nil
# Generate a `Link` header that gives a hint to modern browsers about
# preloading assets when using `javascript_include_tag` and `stylesheet_link_tag`.
# Rails.application.config.action_view.preload_links_header = true

View File

@ -0,0 +1,143 @@
# Be sure to restart your server when you modify this file.
#
# This file eases your Rails 7.0 framework defaults upgrade.
#
# Uncomment each configuration one by one to switch to the new default.
# Once your application is ready to run with all new defaults, you can remove
# this file and set the `config.load_defaults` to `7.0`.
#
# Read the Guide for Upgrading Ruby on Rails for more info on each option.
# https://guides.rubyonrails.org/upgrading_ruby_on_rails.html
# `button_to` view helper will render `<button>` element, regardless of whether
# or not the content is passed as the first argument or as a block.
# Rails.application.config.action_view.button_to_generates_button_tag = true
# `stylesheet_link_tag` view helper will not render the media attribute by default.
# Rails.application.config.action_view.apply_stylesheet_media_default = false
# Change the digest class for the key generators to `OpenSSL::Digest::SHA256`.
# Changing this default means invalidate all encrypted messages generated by
# your application and, all the encrypted cookies. Only change this after you
# rotated all the messages using the key rotator.
#
# See upgrading guide for more information on how to build a rotator.
# https://guides.rubyonrails.org/v7.0/upgrading_ruby_on_rails.html
# Rails.application.config.active_support.key_generator_hash_digest_class = OpenSSL::Digest::SHA256
# Change the digest class for ActiveSupport::Digest.
# Changing this default means that for example Etags change and
# various cache keys leading to cache invalidation.
# Rails.application.config.active_support.hash_digest_class = OpenSSL::Digest::SHA256
# Don't override ActiveSupport::TimeWithZone.name and use the default Ruby
# implementation.
# Rails.application.config.active_support.remove_deprecated_time_with_zone_name = true
# Calls `Rails.application.executor.wrap` around test cases.
# This makes test cases behave closer to an actual request or job.
# Several features that are normally disabled in test, such as Active Record query cache
# and asynchronous queries will then be enabled.
# Rails.application.config.active_support.executor_around_test_case = true
# Set both the `:open_timeout` and `:read_timeout` values for `:smtp` delivery method.
# Rails.application.config.action_mailer.smtp_timeout = 5
# The ActiveStorage video previewer will now use scene change detection to generate
# better preview images (rather than the previous default of using the first frame
# of the video).
Rails.application.config.active_storage.video_preview_arguments =
"-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015),loop=loop=-1:size=2,trim=start_frame=1' -frames:v 1 -f image2"
# Automatically infer `inverse_of` for associations with a scope.
# Rails.application.config.active_record.automatic_scope_inversing = true
# Raise when running tests if fixtures contained foreign key violations
# Rails.application.config.active_record.verify_foreign_keys_for_fixtures = true
# Disable partial inserts.
# This default means that all columns will be referenced in INSERT queries
# regardless of whether they have a default or not.
# Rails.application.config.active_record.partial_inserts = false
# Protect from open redirect attacks in `redirect_back_or_to` and `redirect_to`.
# Rails.application.config.action_controller.raise_on_open_redirects = true
# Change the variant processor for Active Storage.
# Changing this default means updating all places in your code that
# generate variants to use image processing macros and ruby-vips
# operations. See the upgrading guide for detail on the changes required.
# The `:mini_magick` option is not deprecated; it's fine to keep using it.
Rails.application.config.active_storage.variant_processor = :vips
# Enable parameter wrapping for JSON.
# Previously this was set in an initializer. It's fine to keep using that initializer if you've customized it.
# To disable parameter wrapping entirely, set this config to `false`.
# Rails.application.config.action_controller.wrap_parameters_by_default = true
# Specifies whether generated namespaced UUIDs follow the RFC 4122 standard for namespace IDs provided as a
# `String` to `Digest::UUID.uuid_v3` or `Digest::UUID.uuid_v5` method calls.
#
# See https://guides.rubyonrails.org/configuring.html#config-active-support-use-rfc4122-namespaced-uuids for
# more information.
# Rails.application.config.active_support.use_rfc4122_namespaced_uuids = true
# Change the default headers to disable browsers' flawed legacy XSS protection.
# Rails.application.config.action_dispatch.default_headers = {
# "X-Frame-Options" => "SAMEORIGIN",
# "X-XSS-Protection" => "0",
# "X-Content-Type-Options" => "nosniff",
# "X-Download-Options" => "noopen",
# "X-Permitted-Cross-Domain-Policies" => "none",
# "Referrer-Policy" => "strict-origin-when-cross-origin"
# }
# ** Please read carefully, this must be configured in config/application.rb **
# Change the format of the cache entry.
# Changing this default means that all new cache entries added to the cache
# will have a different format that is not supported by Rails 6.1 applications.
# Only change this value after your application is fully deployed to Rails 7.0
# and you have no plans to rollback.
# When you're ready to change format, add this to `config/application.rb` (NOT this file):
# config.active_support.cache_format_version = 7.0
# Cookie serializer: 2 options
#
# If you're upgrading and haven't set `cookies_serializer` previously, your cookie serializer
# is `:marshal`. The default for new apps is `:json`.
#
# Rails.application.config.action_dispatch.cookies_serializer = :json
#
#
# To migrate an existing application to the `:json` serializer, use the `:hybrid` option.
#
# Rails transparently deserializes existing (Marshal-serialized) cookies on read and
# re-writes them in the JSON format.
#
# It is fine to use `:hybrid` long term; you should do that until you're confident *all* your cookies
# have been converted to JSON. To keep using `:hybrid` long term, move this config to its own
# initializer or to `config/application.rb`.
#
# Rails.application.config.action_dispatch.cookies_serializer = :hybrid
#
#
# If your cookies can't yet be serialized to JSON, keep using `:marshal` for backward-compatibility.
#
# If you have configured the serializer elsewhere, you can remove this section of the file.
#
# See https://guides.rubyonrails.org/action_controller_overview.html#cookies for more information.
# Change the return value of `ActionDispatch::Request#content_type` to the Content-Type header without modification.
# Rails.application.config.action_dispatch.return_only_request_media_type_on_content_type = false
# Active Storage `has_many_attached` relationships will default to replacing the current collection instead of appending to it.
# Thus, to support submitting an empty collection, the `file_field` helper will render an hidden field `include_hidden` by default when `multiple_file_field_include_hidden` is set to `true`.
# See https://guides.rubyonrails.org/configuring.html#config-active-storage-multiple-file-field-include-hidden for more information.
Rails.application.config.active_storage.multiple_file_field_include_hidden = true
# ** Please read carefully, this must be configured in config/application.rb (NOT this file) **
# Disables the deprecated #to_s override in some Ruby core classes
# See https://guides.rubyonrails.org/configuring.html#config-active-support-disable-to-s-conversion for more information.
# config.active_support.disable_to_s_conversion = true

View File

@ -0,0 +1,284 @@
# Be sure to restart your server when you modify this file.
#
# This file eases your Rails 7.1 framework defaults upgrade.
#
# Uncomment each configuration one by one to switch to the new default.
# Once your application is ready to run with all new defaults, you can remove
# this file and set the `config.load_defaults` to `7.1`.
#
# Read the Guide for Upgrading Ruby on Rails for more info on each option.
# https://guides.rubyonrails.org/upgrading_ruby_on_rails.html
###
# No longer add autoloaded paths into `$LOAD_PATH`. This means that you won't be able
# to manually require files that are managed by the autoloader, which you shouldn't do anyway.
#
# This will reduce the size of the load path, making `require` faster if you don't use bootsnap, or reduce the size
# of the bootsnap cache if you use it.
#
# To set this configuration, add the following line to `config/application.rb` (NOT this file):
# config.add_autoload_paths_to_load_path = false
###
# Remove the default X-Download-Options headers since it is used only by Internet Explorer.
# If you need to support Internet Explorer, add back `"X-Download-Options" => "noopen"`.
#++
# Rails.application.config.action_dispatch.default_headers = {
# "X-Frame-Options" => "SAMEORIGIN",
# "X-XSS-Protection" => "0",
# "X-Content-Type-Options" => "nosniff",
# "X-Permitted-Cross-Domain-Policies" => "none",
# "Referrer-Policy" => "strict-origin-when-cross-origin"
# }
###
# Do not treat an `ActionController::Parameters` instance
# as equal to an equivalent `Hash` by default.
#++
# Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality = false
###
# Active Record Encryption now uses SHA-256 as its hash digest algorithm.
#
# There are 3 scenarios to consider.
#
# 1. If you have data encrypted with previous Rails versions, and you have
# +config.active_support.key_generator_hash_digest_class+ configured as SHA1 (the default
# before Rails 7.0), you need to configure SHA-1 for Active Record Encryption too:
#++
# Rails.application.config.active_record.encryption.hash_digest_class = OpenSSL::Digest::SHA1
#
# 2. If you have +config.active_support.key_generator_hash_digest_class+ configured as SHA256 (the new default
# in 7.0), then you need to configure SHA-256 for Active Record Encryption:
#++
# Rails.application.config.active_record.encryption.hash_digest_class = OpenSSL::Digest::SHA256
#
# 3. If you don't currently have data encrypted with Active Record encryption, you can disable this setting to
# configure the default behavior starting 7.1+:
#++
# Rails.application.config.active_record.encryption.support_sha1_for_non_deterministic_encryption = false
###
# No longer run after_commit callbacks on the first of multiple Active Record
# instances to save changes to the same database row within a transaction.
# Instead, run these callbacks on the instance most likely to have internal
# state which matches what was committed to the database, typically the last
# instance to save.
#++
# Rails.application.config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction = false
###
# Configures SQLite with a strict strings mode, which disables double-quoted string literals.
#
# SQLite has some quirks around double-quoted string literals.
# It first tries to consider double-quoted strings as identifier names, but if they don't exist
# it then considers them as string literals. Because of this, typos can silently go unnoticed.
# For example, it is possible to create an index for a non existing column.
# See https://www.sqlite.org/quirks.html#double_quoted_string_literals_are_accepted for more details.
#++
# Rails.application.config.active_record.sqlite3_adapter_strict_strings_by_default = true
###
# Disable deprecated singular associations names.
#++
# Rails.application.config.active_record.allow_deprecated_singular_associations_name = false
###
# Enable the Active Job `BigDecimal` argument serializer, which guarantees
# roundtripping. Without this serializer, some queue adapters may serialize
# `BigDecimal` arguments as simple (non-roundtrippable) strings.
#
# When deploying an application with multiple replicas, old (pre-Rails 7.1)
# replicas will not be able to deserialize `BigDecimal` arguments from this
# serializer. Therefore, this setting should only be enabled after all replicas
# have been successfully upgraded to Rails 7.1.
#++
# Rails.application.config.active_job.use_big_decimal_serializer = true
###
# Specify if an `ArgumentError` should be raised if `Rails.cache` `fetch` or
# `write` are given an invalid `expires_at` or `expires_in` time.
# Options are `true`, and `false`. If `false`, the exception will be reported
# as `handled` and logged instead.
#++
# Rails.application.config.active_support.raise_on_invalid_cache_expiration_time = true
###
# Specify whether Query Logs will format tags using the SQLCommenter format
# (https://open-telemetry.github.io/opentelemetry-sqlcommenter/), or using the legacy format.
# Options are `:legacy` and `:sqlcommenter`.
#++
# Rails.application.config.active_record.query_log_tags_format = :sqlcommenter
###
# Specify the default serializer used by `MessageEncryptor` and `MessageVerifier`
# instances.
#
# The legacy default is `:marshal`, which is a potential vector for
# deserialization attacks in cases where a message signing secret has been
# leaked.
#
# In Rails 7.1, the new default is `:json_allow_marshal` which serializes and
# deserializes with `ActiveSupport::JSON`, but can fall back to deserializing
# with `Marshal` so that legacy messages can still be read.
#
# In Rails 7.2, the default will become `:json` which serializes and
# deserializes with `ActiveSupport::JSON` only.
#
# Alternatively, you can choose `:message_pack` or `:message_pack_allow_marshal`,
# which serialize with `ActiveSupport::MessagePack`. `ActiveSupport::MessagePack`
# can roundtrip some Ruby types that are not supported by JSON, and may provide
# improved performance, but it requires the `msgpack` gem.
#
# For more information, see
# https://guides.rubyonrails.org/v7.1/configuring.html#config-active-support-message-serializer
#
# If you are performing a rolling deploy of a Rails 7.1 upgrade, wherein servers
# that have not yet been upgraded must be able to read messages from upgraded
# servers, first deploy without changing the serializer, then set the serializer
# in a subsequent deploy.
#++
# Rails.application.config.active_support.message_serializer = :json_allow_marshal
###
# Enable a performance optimization that serializes message data and metadata
# together. This changes the message format, so messages serialized this way
# cannot be read by older versions of Rails. However, messages that use the old
# format can still be read, regardless of whether this optimization is enabled.
#
# To perform a rolling deploy of a Rails 7.1 upgrade, wherein servers that have
# not yet been upgraded must be able to read messages from upgraded servers,
# leave this optimization off on the first deploy, then enable it on a
# subsequent deploy.
#++
# Rails.application.config.active_support.use_message_serializer_for_metadata = true
###
# Set the maximum size for Rails log files.
#
# `config.load_defaults 7.1` does not set this value for environments other than
# development and test.
#++
# if Rails.env.local?
# Rails.application.config.log_file_size = 100 * 1024 * 1024
# end
###
# Enable raising on assignment to attr_readonly attributes. The previous
# behavior would allow assignment but silently not persist changes to the
# database.
#++
# Rails.application.config.active_record.raise_on_assign_to_attr_readonly = true
###
# Enable validating only parent-related columns for presence when the parent is mandatory.
# The previous behavior was to validate the presence of the parent record, which performed an extra query
# to get the parent every time the child record was updated, even when parent has not changed.
#++
# Rails.application.config.active_record.belongs_to_required_validates_foreign_key = false
###
# Enable precompilation of `config.filter_parameters`. Precompilation can
# improve filtering performance, depending on the quantity and types of filters.
#++
# Rails.application.config.precompile_filter_parameters = true
###
# Enable before_committed! callbacks on all enrolled records in a transaction.
# The previous behavior was to only run the callbacks on the first copy of a record
# if there were multiple copies of the same record enrolled in the transaction.
#++
# Rails.application.config.active_record.before_committed_on_all_records = true
###
# Disable automatic column serialization into YAML.
# To keep the historic behavior, you can set it to `YAML`, however it is
# recommended to explicitly define the serialization method for each column
# rather than to rely on a global default.
#++
# Rails.application.config.active_record.default_column_serializer = nil
###
# Enable a performance optimization that serializes Active Record models
# in a faster and more compact way.
#
# To perform a rolling deploy of a Rails 7.1 upgrade, wherein servers that have
# not yet been upgraded must be able to read caches from upgraded servers,
# leave this optimization off on the first deploy, then enable it on a
# subsequent deploy.
#++
# Rails.application.config.active_record.marshalling_format_version = 7.1
###
# Run `after_commit` and `after_*_commit` callbacks in the order they are defined in a model.
# This matches the behaviour of all other callbacks.
# In previous versions of Rails, they ran in the inverse order.
#++
# Rails.application.config.active_record.run_after_transaction_callbacks_in_order_defined = true
###
# Whether a `transaction` block is committed or rolled back when exited via `return`, `break` or `throw`.
#++
# Rails.application.config.active_record.commit_transaction_on_non_local_return = true
###
# Controls when to generate a value for <tt>has_secure_token</tt> declarations.
#++
# Rails.application.config.active_record.generate_secure_token_on = :initialize
###
# ** Please read carefully, this must be configured in config/application.rb **
#
# Change the format of the cache entry.
#
# Changing this default means that all new cache entries added to the cache
# will have a different format that is not supported by Rails 7.0
# applications.
#
# Only change this value after your application is fully deployed to Rails 7.1
# and you have no plans to rollback.
# When you're ready to change format, add this to `config/application.rb` (NOT
# this file):
# config.active_support.cache_format_version = 7.1
###
# Configure Action View to use HTML5 standards-compliant sanitizers when they are supported on your
# platform.
#
# `Rails::HTML::Sanitizer.best_supported_vendor` will cause Action View to use HTML5-compliant
# sanitizers if they are supported, else fall back to HTML4 sanitizers.
#
# In previous versions of Rails, Action View always used `Rails::HTML4::Sanitizer` as its vendor.
#++
# Rails.application.config.action_view.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor
###
# Configure Action Text to use an HTML5 standards-compliant sanitizer when it is supported on your
# platform.
#
# `Rails::HTML::Sanitizer.best_supported_vendor` will cause Action Text to use HTML5-compliant
# sanitizers if they are supported, else fall back to HTML4 sanitizers.
#
# In previous versions of Rails, Action Text always used `Rails::HTML4::Sanitizer` as its vendor.
#++
# Rails.application.config.action_text.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor
###
# Configure the log level used by the DebugExceptions middleware when logging
# uncaught exceptions during requests.
#++
# Rails.application.config.action_dispatch.debug_exception_log_level = :error
###
# Configure the test helpers in Action View, Action Dispatch, and rails-dom-testing to use HTML5
# parsers.
#
# Nokogiri::HTML5 isn't supported on JRuby, so JRuby applications must set this to :html4.
#
# In previous versions of Rails, these test helpers always used an HTML4 parser.
#++
# Rails.application.config.dom_testing_default_html_version = :html5

View File

@ -0,0 +1,13 @@
# Be sure to restart your server when you modify this file.
# Define an application-wide HTTP permissions policy. For further
# information see: https://developers.google.com/web/updates/2018/06/feature-policy
# Rails.application.config.permissions_policy do |policy|
# policy.camera :none
# policy.gyroscope :none
# policy.microphone :none
# policy.usb :none
# policy.fullscreen :self
# policy.payment :self, "https://secure.example.com"
# end

View File

@ -15,77 +15,6 @@ bg:
change_feedback_for: Преоценете „%{title}“ change_feedback_for: Преоценете „%{title}“
by: от %{authors} by: от %{authors}
feedback_incentive: Бихме били благодарни, ако споделите с нас мнението си за конференцията и събитията в нея. feedback_incentive: Бихме били благодарни, ако споделите с нас мнението си за конференцията и събитията в нея.
management:
volunteers:
index:
all: Всички
profile: Профил
total: "%{current} от общо %{total}"
personal_profiles:
index:
no_profile: 'Този потребител няма въведен профил за текущата конференция.'
total: "%{current} от общо %{total}"
create:
successfully_created: "Профилът беше създаден успешно."
show:
contacts: "Данни за контакт"
event_propositions: "Предложения за събития"
conferences:
update_vote_data:
vote_data_successfully_updated: "Резултатите от гласуването бяха обновени успешно"
error_during_vote_data_save: "Възникна грешка при запазването на резултатите от гласуването"
error_during_connection_with_voting_endpoint: "Възникна грешка при опит за изтегляне на резултатите от гласуването: %{error}"
vote_results:
back_to: "Обратно към %{conference}"
vote_results: "Резултати от гласуването"
vote_data_never_updated: "Резулатите от гласуването не са изтеглени"
voting_results: "Резултати от гласуването"
vote_data_updated_at: "последно обновяване %{updated_at}"
vote_ratio: "%{votes} от общо %{total_votes} гласа"
fetch_vote_results: "Обнови резултатите от гласуването"
percent: "%"
rank: "Позиция"
unranked: "Няма данни"
export: Експорт
show:
full_vote_results: "Пълни резултати от гласуването"
vote_data_never_updated: "Резулатите от гласуването не са изтеглени"
voting_results: "Резултати от гласуването"
vote_data_updated_at: "последно обновяване %{updated_at}"
vote_ratio: "%{votes} от общо %{total_votes} гласа"
summary: 'Обобщение'
cfp_status: 'Състояние на CFP'
fetch_vote_results: "Обнови резултатите от гласуването"
percent: "%"
rank: "Позиция"
events:
conflicts:
conflicts: "Конфликти"
conflicts_of: "Конфликти на „%{event}“"
percent: "Процент"
hint_html: "Следващата таблица илюстрира какъв процент от посетителите, изявили интерес да присъстват на <strong>„%{event}“</strong>, биха желали да присъстват на всяко от посочените събития."
edit:
edit: "Редакция на %{event_type} „%{event_title}“"
speaker:
no_profile: 'Този потребител няма въведени профили в системата.'
profile_from: "профил от %{conference}"
create_profile: "Създай нов профил"
previous_event_propositions: 'Предишни предложения за събития'
contacts: "Информация за контакт"
show:
between_approved_events: "Между настоящото и одобрените събития"
no_approved_events: "Няма достатъчно одобрени събития"
rank: "Класиране"
review: "Преглед на %{event_type} „%{event_title}“"
conflicts: "Конфликти"
percent: "Процент"
index:
all: "Всички"
total: "%{current} от общо %{total}"
event:
create_profile: "Създай профил"
no_records:
no_records_found: 'Не бяха открити записи, които да отговарят на изискванията'
abstract: "Резюме" abstract: "Резюме"
helpers: helpers:
submit: submit:
@ -189,8 +118,10 @@ bg:
food_preferences: Предпочитана храна food_preferences: Предпочитана храна
previous_experience: Предишен опит previous_experience: Предишен опит
notes: Бележки notes: Бележки
terms_accepted: Съгласен съм екипът да се свързва с мен
language: Език language: Език
volunteer_teams: Екипи доброволци volunteer_team: Екип доброволци
additional_volunteer_teams: Допълнителни екипи доброволци
track: track:
color: "Цвят" color: "Цвят"
description: "Описание" description: "Описание"
@ -230,7 +161,9 @@ bg:
attributes: attributes:
picture: picture:
invalid_content_type: "невалиден формат на снимката" invalid_content_type: "невалиден формат на снимката"
volunteer_teams: volunteer_team:
invalid_volunteer_team: "невалиден екип от доброволци"
additional_volunteer_teams:
invalid_volunteer_team: "невалиден екип от доброволци" invalid_volunteer_team: "невалиден екип от доброволци"
models: models:
feedback: feedback:
@ -292,7 +225,7 @@ bg:
did_not_get_confirmation: "Не сте получили инструкции за потвърждение?" did_not_get_confirmation: "Не сте получили инструкции за потвърждение?"
did_not_get_unlock: "Не сте получили инструкции за отключване?" did_not_get_unlock: "Не сте получили инструкции за отключване?"
do_not_want_pass_reset1: "Ако не желаете да смените паролата си, моля изтрийте това писмо." do_not_want_pass_reset1: "Ако не желаете да смените паролата си, моля изтрийте това писмо."
do_not_want_pass_reset2: "Паролата Ви няма да бъде променена, докато не кликнете горния линк и не въведете нова парола." do_not_want_pass_reset2: "Паролата ви няма да бъде променена, докато не кликнете горния линк и не въведете нова парола."
edit: "Редактирай" edit: "Редактирай"
edit_speaker_profile: "Редакция на профил" edit_speaker_profile: "Редакция на профил"
edit_talk: "Редакция на лекция" edit_talk: "Редакция на лекция"
@ -304,12 +237,14 @@ bg:
improbable_phone: "не е валиден телефонен номер" improbable_phone: "не е валиден телефонен номер"
event_mailer: event_mailer:
acceptance_notification: acceptance_notification:
subject: "Предложението Ви за провеждане на %{submission_type} „%{title}“ на %{conference} е одобрено" subject: "Предложението ви за провеждане на %{submission_type} „%{title}“ на %{conference} е одобрено"
rejection_notification: rejection_notification:
subject: "Предложението Ви за %{submission_type} „%{title}“ на %{conference} не е одобрено" subject: "Предложението ви за %{submission_type} „%{title}“ на %{conference} не е одобрено"
volunteer_mailer: volunteer_mailer:
success_notification: success_notification:
subject: "Кандидатурата Ви за доброволец за %{conference_name} беше получена" subject: "Кандидатурата ви за доброволец за %{conference_name} беше получена"
email_confirmation:
subject: "Потвърдете e-mail адреса си, за да се включите в %{conference_name}"
event_states: event_states:
approved: approved:
one: "Одобрено" one: "Одобрено"
@ -329,9 +264,9 @@ bg:
expected_validation: "Очаква се потвърждение на: %{email}" expected_validation: "Очаква се потвърждение на: %{email}"
hello: "Здравейте, %{name}" hello: "Здравейте, %{name}"
home: "Начало" home: "Начало"
home_title: "%{conference} - зов за лектори" home_title: "%{conference} — сподели знания, предложи лекция"
lecture_was_successfully_confirmed: "Лекцията беше потвърдена успешно" lecture_was_successfully_confirmed: "Лекцията беше потвърдена успешно"
license_notice: "Имайте предвид, че презентациите Ви впоследствие ще бъдат публикувани с лиценз CC-BY-ND (Creative Commons Attribution No derivatives)." license_notice: "Имайте предвид, че презентациите ви впоследствие ще бъдат публикувани с лиценз CC-BY-ND (Creative Commons Attribution No derivatives)."
locales: locales:
bg: "Български" bg: "Български"
en: Английски en: Английски
@ -369,7 +304,7 @@ bg:
sign_up: "Регистрация" sign_up: "Регистрация"
unhappy: "Не Сте щастливи?" unhappy: "Не Сте щастливи?"
update: "Промени" update: "Промени"
we_need_your_current_password: "нуждаем се от сегашната Ви парола, за да потвърдим промените" we_need_your_current_password: "нуждаем се от сегашната ви парола, за да потвърдим промените"
resend_instructions_btn: "Изпрати отново инструкциите" resend_instructions_btn: "Изпрати отново инструкциите"
resend_instructions_header: "Повторно изпращане на инструкции за потвърждаване на акаунт" resend_instructions_header: "Повторно изпращане на инструкции за потвърждаване на акаунт"
resend_unlock_instructions_title: "Изпрати отново инструкции за отключване" resend_unlock_instructions_title: "Изпрати отново инструкции за отключване"
@ -417,29 +352,30 @@ bg:
name: "Име на потока" name: "Име на потока"
event: event:
abstract: "Резюме на предложението, което да може да бъде представено на посетителите (1 абзац)" abstract: "Резюме на предложението, което да може да бъде представено на посетителите (1 абзац)"
agreement: "Отбележете съгласни ли сте с това събитието Ви да бъде записано и публикувано под лиценз CC-BY-ND (Creative Commons Attribution No Derivatives)" agreement: "Отбележете съгласни ли сте с това събитието ви да бъде записано и публикувано под лиценз CC-BY-ND (Creative Commons Attribution No Derivatives)"
description: "Подробно описание на предложението (няколко абзаца)" description: "Подробно описание на предложението (няколко абзаца)"
language: "" language: ""
length: "Продължителността на събитието (в минути). Продължителността на %{type} е между %{min} и %{max} минути, заедно с въпросите" length: "Продължителността на събитието (в минути). Продължителността на %{type} е между %{min} и %{max} минути, заедно с въпросите"
notes: "Допълнителни бележки, които искате да споделите с организаторския екип" notes: "Допълнителни бележки, които искате да споделите с организаторския екип"
subtitle: "" subtitle: ""
title: "" title: ""
track: "Потокът от лекции, в който искате да попадне предложението Ви" track: "Потокът от лекции, в който искате да попадне предложението ви"
personal_profile: personal_profile:
biography: "Опишете се с няколко изречения, говорейки за себе си в трето лице :)" biography: "Опишете се с няколко изречения, говорейки за себе си в трето лице :)"
github: "Потребителското Ви име в Github" github: "Потребителското ви име в Github"
mobile_phone: "Мобилен телефон, който ще бъде видим само за организаторите" mobile_phone: "Мобилен телефон, който ще бъде видим само за организаторите"
organisation: "Организацията, която представлявате" organisation: "Организацията, която представлявате"
picture: "Ваша снимка" picture: "Ваша снимка"
public_email: E-mail адрес, който ще бъде видим за посетителите public_email: E-mail адрес, който ще бъде видим за посетителите
twitter: "Потребителското Ви име в Twitter" twitter: "Потребителското ви име в Twitter"
volunteer: volunteer:
email: "Е-mail адресът Ви, който ще бъде видим само от организаторите" name: "Имайте предвид, че това име ще бъде изписано на грамотата ви за участие в конференцията"
phone: "Мобилният Ви телефон, който ще бъде видим само за организаторите" email: "Е-mail адресът ви, който ще бъде видим само от организаторите"
phone: "Мобилният ви телефон, който ще бъде видим само за организаторите"
picture: "Ваша снимка в jpeg, png или gif формат" picture: "Ваша снимка в jpeg, png или gif формат"
volunteer_teams: "Доброволческите екипи, от които искате да сте част. Подробни описания на екипите можете да намерите <a href=\"/volunteer_teams\" target=\"_blank\">тук</a>" volunteer_team: "Доброволческият екип, от които искате да бъдете част. Подробни описания на екипите можете да намерите <a href=\"/volunteer_teams\" target=\"_blank\">тук</a>. Ако желаете да участвате в повече от един екип, споменете това в полето бележка."
user: user:
email: e-mail адресът Ви. Ще бъде видим само от организаторите email: e-mail адресът ви. Ще бъде видим само от организаторите
password: "Парола с дължина между 8 и 128 символа" password: "Парола с дължина между 8 и 128 символа"
password_confirmation: "Отново въведената отгоре парола" password_confirmation: "Отново въведената отгоре парола"
'no': "Не" 'no': "Не"
@ -447,7 +383,7 @@ bg:
mark: "*" mark: "*"
text: "Задължително поле" text: "Задължително поле"
'yes': "Да" 'yes': "Да"
someone_requested_passreset: "Някой поиска линк за промяна на парола на акаунта Ви. Паролата може да бъде променена от линкът отдолу." someone_requested_passreset: "Някой поиска линк за промяна на парола на акаунта ви. Паролата може да бъде променена от линкът отдолу."
speaker_profile: "Личен профил" speaker_profile: "Личен профил"
submit_talk_header: "Предложи нова лекция" submit_talk_header: "Предложи нова лекция"
suggestion_and_speaker_count: "%{suggestions} предложения от %{speakers} лектори" suggestion_and_speaker_count: "%{suggestions} предложения от %{speakers} лектори"
@ -463,31 +399,34 @@ bg:
see_details: "Повече информация" see_details: "Повече информация"
events: events:
edit_event: "Редактиране на %{event_type} %{title}" edit_event: "Редактиране на %{event_type} %{title}"
event_successfully_created: "Предложението Ви за %{event_type} беше създадено успешно" event_successfully_created: "Предложението ви за %{event_type} беше създадено успешно"
event_successfully_updated: "Предложението Ви за %{event_type} беше обновено успешно" event_successfully_updated: "Предложението ви за %{event_type} беше обновено успешно"
successfully_confirmed: "Предложението Ви за %{event_type} беше потвърдено успешно" successfully_confirmed: "Предложението ви за %{event_type} беше потвърдено успешно"
error_on_confirmation: "Възникна грешка при потвърждението на предложението Ви за %{event_type}" error_on_confirmation: "Възникна грешка при потвърждението на предложението ви за %{event_type}"
no_events: "Все още не сте предложили събитие" no_events: "Все още не сте предложили събитие"
submit_event: "Предлагане на %{event_type}" submit_event: "Предлагане на %{event_type}"
navigation: navigation:
my_submissions: "Моите предложения" my_submissions: "Моите предложения"
personal_profiles: personal_profiles:
successfully_created: "Профилът Ви беше създаден успешно" successfully_created: "Профилът ви беше създаден успешно"
successfully_updated: "Профилът Ви беше обновен успешно" successfully_updated: "Профилът ви беше обновен успешно"
user: user:
info: "Информация за потребител" info: "Информация за потребител"
welcome: welcome:
submit_event: "Предложи %{event_type}" submit_event: "Предложи %{event_type}"
volunteers: volunteers:
email_not_confirmed: Вашият e-mail адрес не е потвърден. Моля, проверете електронната си поща и кликнете на линка от полученото писмо за потвърждение.
email_confirmed_successfully: Успешно потвърдихте e-mail адреса си!
email_confirmation_error: Възникна грешка при опит за потвърждаване на e-mail адреса ви.
new_volunteer_title: Кандидатствай за доброволец new_volunteer_title: Кандидатствай за доброволец
edit_volunteer_title: "Кандидатура за доброволец на %{name}" edit_volunteer_title: "Кандидатура за доброволец на %{name}"
apply: Кандидатствай за доброволец apply: Кандидатствай за доброволец
withdraw_application: Оттегли кандидатурата си withdraw_application: Оттегли кандидатурата си
successful_application: "Успешно изпратихте кандидатурата си" successful_application: "Успешно изпратихте кандидатурата си"
successful_application_edit: "Успешно редактирахте кандидатурата си" successful_application_edit: "Успешно редактирахте кандидатурата си"
error_occurred_while_applying: "Възникна грешка и кандидатурата Ви не беше изпратена" error_occurred_while_applying: "Възникна грешка и кандидатурата ви не беше изпратена"
you_successfully_retracted_your_application_for: "Успешно оттеглихте кандидатурата си“" you_successfully_retracted_your_application_for: "Успешно оттеглихте кандидатурата си“"
welcome: "Добре дошли, %{name}" welcome: "Добре дошли, %{name}"
what_we_ask: "Бихме искали да получим предложенията Ви за лекции и уъркшопи, принадлежащи към следните категории, до %{date}г.:" what_we_ask: "Бихме искали да получим предложенията ви за лекции, уъркшопи и щандове до %{date}г. Категориите, които имаме тази година, са:"
workshop_was_successfully_confirmed: "Уъркшопът беше потвърден успешно" workshop_was_successfully_confirmed: "Уъркшопът беше потвърден успешно"
workshops: "Уъркшопи" workshops: "Уъркшопи"

View File

@ -0,0 +1,147 @@
bg:
activerecord:
attributes:
user:
confirmation_sent_at: Потвърждението е изпратено на
confirmation_token: Код за потвърждение
confirmed_at: Дата на потвърждение
created_at: Създаван на
current_password: Настояща парола
current_sign_in_at: Текущо влизане на
current_sign_in_ip: IP на текущото влизане
email: Имейл
encrypted_password: Закодирана парола
failed_attempts: Грешни опити
last_sign_in_at: Последно влизане на
last_sign_in_ip: IP на последното влизане
locked_at: Дата на заключването
password: Парола
password_confirmation: Потвърждаване на паролата
remember_created_at: Дата на създаване на запомнянето
remember_me: Запомни ме
reset_password_sent_at: Дата на изпращане на промяна на парола
reset_password_token: Код за промяна на парола
sign_in_count: Бройка входове
unconfirmed_email: Непотвърден имейл
unlock_token: Код за отключване на профил
updated_at: Последна промяна
models:
user:
one: Потребител
other: Потребители
devise:
confirmations:
confirmed: Регистрацията Ви е потвърдена.
new:
resend_confirmation_instructions: Повторно изпращане на инструкции за потвърждаване
send_instructions: Ще получите имейл с инструкции за потвърждаване на Вашата регистрация до няколко минути.
send_paranoid_instructions: Ако Вашият имейл адрес съществува в нашата база данни, ще получите имейл с инструкции за потвърждаване на Вашия профил до няколко минути.
failure:
already_authenticated: Вече сте влезли в профила си.
inactive: Профилът Ви все още не е активиран.
invalid: Грешни %{authentication_keys} или парола.
last_attempt: Имате още един опит преди акаунтът Ви да бъде заключен.
locked: Профилът Ви е заключен.
not_found_in_database: Грешни %{authentication_keys} или парола.
timeout: Сесията Ви е изтекла, моля влезте отново, за да продължите.
unauthenticated: Преди да продължите, трябва да влезете в профила си или да се регистрирате.
unconfirmed: Преди да продължите, трябва да потвърдите регистрацията си.
mailer:
confirmation_instructions:
action: Потвърждаване на профил
greeting: Добре дошли, %{recipient}!
instruction: 'Можете да потвърдите имейл адреса си чрез линка по-долу:'
subject: Инструкции за потвърждаване
email_changed:
greeting: Здравейте, %{recipient}!
message: Свързваме се с Вас, за да Ви уведомим, че имейлът Ви е сменен на %{email}.
message_unconfirmed: Свързваме се с Вас, за да Ви уведомим, че имейлът Ви се сменя на %{email}.
subject: Промяна на имейл
password_change:
greeting: Здравейте, %{recipient}!
message: Пишем Ви, за да Ви уведомим, че паролата Ви беше променена.
subject: Променена парола
reset_password_instructions:
action: Смяна на парола
greeting: Здравейте, %{recipient}!
instruction: Някой е поискал линк за промяна на паролата Ви. Можете да промените паролата си чрез линка по-долу.
instruction_2: В случай че не сте поискали промяна на паролата си, просто игнорирайте този имейл.
instruction_3: Паролата Ви няма да бъде променена, докато не използвате горния линк, за да създадете нова.
subject: Инструкции за промяна на парола
unlock_instructions:
action: Отключване на профил
greeting: Здравейте, %{recipient}!
instruction: 'Кликнете върху линка по-долу, за да отключите профила си:'
message: Профилът Ви е заключен поради надвишаване на максималния позволен брой неуспешни опити за вход.
subject: Инструкции за отключване
omniauth_callbacks:
failure: Не успяхме да ви оторизираме чрез %{kind}, защото %{reason}.
success: Успешна оторизация чрез %{kind} профил.
passwords:
edit:
change_my_password: Промяна на паролата ми
change_your_password: Променете паролата си
confirm_new_password: Потвърждение на новата парола
new_password: Нова парола
new:
forgot_your_password: Забравена парола?
send_me_reset_password_instructions: Изпрати инструкции за промяна на парола
no_token: Може да достъпите тази страница само от имейл за промяна на паролата. Ако сте отворили тази страница от такъв имейл, уверете се, че използвате целия URL-адрес, който сме Ви изпратили.
send_instructions: Ще получите имейл с инструкции как да промените паролата си до няколко минути.
send_paranoid_instructions: Ако Вашият имейл адрес съществува в базата ни, ще получите инструкции за промяна на Вашата парола.
updated: Паролата Ви е променена успешно. Влязохте успешно в профила си.
updated_not_active: Паролата Ви е променена успешно.
registrations:
destroyed: Довиждане! Вашият профил беше успешно изтрит. Надяваме се скоро да Ви видим отново.
edit:
are_you_sure: Сигурни ли сте?
cancel_my_account: Закриване на профил
currently_waiting_confirmation_for_email: 'Очаква се потвърждение за: %{email}'
leave_blank_if_you_don_t_want_to_change_it: оставете празно, ако не искате да го променяте
title: Редакция на %{resource}
unhappy: Недоволни
update: Обновяване
we_need_your_current_password_to_confirm_your_changes: въведете настоящата си парола за потвърждаване на промените
new:
sign_up: Регистрация
signed_up: Добре дошли! Вие се регистрирахте успешно.
signed_up_but_inactive: Регистрирахте се успешно. Въпреки това, не можете да влезете в профила си, защото той все още не е активиран.
signed_up_but_locked: Регистрирахте се успешно. Въпреки това, не можете да влезете в профила си, защото той е заключен.
signed_up_but_unconfirmed: Писмо с линк за потвърждаване на профила Ви беше изпратено на вашия имейл адрес. Моля, отворете линка, за да активирате Вашия профил.
update_needs_confirmation: Обновихте профила си успешно, но трябва да проверим Вашия нов имейл адрес. Моля, проверете пощата си и отворете линка за потвърждаване на новия адрес.
updated: Обновихте профила си успешно.
updated_but_not_signed_in: Вашият профил бе обновен успешно, но понеже паролата Ви беше променена, трябва да влезнете отново.
sessions:
already_signed_out: Излязохте успешно.
new:
sign_in: Вход
signed_in: Влязохте успешно.
signed_out: Излязохте успешно.
shared:
links:
back: Назад
didn_t_receive_confirmation_instructions: Не сте получили инструкции за потвърждаване?
didn_t_receive_unlock_instructions: Не сте получили инструкции за отключване?
forgot_your_password: Забравена парола?
sign_in: Вход
sign_in_with_provider: Вход с %{provider}
sign_up: Регистрация
minimum_password_length:
one: "(минимум %{count} символ)"
other: "(минимум %{count} символа)"
unlocks:
new:
resend_unlock_instructions: Повторно изпращане на инструкции за отключване
send_instructions: Ще получите имейл с инструкции как да отключите профила си до няколко минути.
send_paranoid_instructions: Ако профилът Ви съществува в базата ни, ще получите имейл с инструкции за отключването му до няколко минути.
unlocked: Профилът Ви е отключен успешно. За да продължите, моля влезте.
errors:
messages:
already_confirmed: е вече потвърден, моля опитайте да влезете в профила си
confirmation_period_expired: трябва да се потвърди в рамките на %{period}, моля направете нова заявка за потвърждаване
expired: е изтекъл, моля заявете нов
not_found: не е намерен
not_locked: не бе заключен
not_saved:
one: 'Една грешка попречи този %{resource} да бъде записан:'
other: "%{count} грешки попречиха този %{resource} да бъде записан:"

View File

@ -1,21 +1,21 @@
en: en:
public: public:
event_feedbacks: event_feedbacks:
new: &new_feedbacks_en new: &new_feedbacks_bg
feedback_for: Rating '%{title}' feedback_for: "Rating '%{title}'"
submit: Submit submit: Submit
success: The feedback was submitted successfully success: The feedback was submitted successfully
conference_feedbacks: conference_feedbacks:
new: *new_feedbacks_en new: *new_feedbacks_bg
index: index:
feedback_for_the_conference: Feedback for the conference feedback_for_the_conference: Feedback for the conference
general_feedback_for: Submit general feedback for "%{title}" general_feedback_for: "Submit general feedback for \"%{title}\""
change_general_feedback_for: Resubmit general feedback for "%{title}" change_general_feedback_for: "Resubmit general feedback for \"%{title}\""
feedback_for: Submit feedback for "%{title}" feedback_for: "Submit feedback for \"%{title}\""
change_feedback_for: Resubmit feedback for "%{title}" change_feedback_for: "Resubmit feedback for \"%{title}\""
by: by %{authors} by: "by %{authors}"
feedback_incentive: We would be happy to receive your feedback about the conference and its events. feedback_incentive: We would be happy to receive your feedback about the conference and its events.
abstract: Abstract abstract: "Abstract"
helpers: helpers:
submit: submit:
event: event:
@ -25,68 +25,90 @@ en:
create: "Submit application" create: "Submit application"
update: "Update application" update: "Update application"
actions: actions:
are_you_sure: Are you sure? are_you_sure: "Are you sure?"
clone:
button: "Clone %{model}"
title: "Clone existing %{model}"
create: create:
button: Create %{model} button: "Create %{model}"
title: 'Create a new #{model}' title: "Create a new #{model}"
destroy: destroy:
button: Destroy %{model} button: "Destroy %{model}"
edit: edit:
button: Edit %{model} button: "Edit %{model}"
title: Editing %{model} title: "Editing %{model}"
index: index:
button: Browse %{models} button: "Browse %{models}"
title: Browse %{models} title: "Browse %{models}"
new: new:
title_f: New %{model} title_f: "New %{model}"
title_m: New %{model} title_m: "New %{model}"
title_c: "New %{model}"
view: view:
button: View %{model} button: "View %{model}"
title: Viewing %{model} title: "Viewing %{model}"
attributes:
average_rating: Average rating
rating: Rating
activerecord: activerecord:
attributes: attributes:
feedback: feedback:
author_email: E-mail author_email: E-mail
rating: Rating rating: Rating
comment: Comment comment: Comment
participation:
participant: Participant
approved: Confirmed by participant
proposition:
status: Status
statuses:
undecided: Undecided
approved: Approved
rejected: Rejected
backup: Backup
conference: conference:
description: Description participants: "Participants"
description: "Description"
email: E-mail email: E-mail
end_date: End date end_date: "End date"
host_name: Domain name host_name: "Domain name"
start_date: Start date start_date: "Start date"
title: Title planned_cfp_end_date: "Planned CFP End date"
title: "Title"
event: event:
abstract: Abstract conference: "Conference"
agreement: I accept status: "Statis"
description: Description abstract: "Abstract"
language: Language agreement: "I accept"
length: Length description: "Description"
notes: Notes language: "Language"
subtitle: Sub-title length: "Length"
title: Title notes: "Notes"
track: Track subtitle: "Sub-title"
user: Speaker title: "Title"
feedbacks: Feedback track: "Track"
rank: "Rank"
user: "Speaker"
participants: "Participants"
feedbacks: "Feedback"
event_type: event_type:
description: Description description: "Description"
name: Name name: "Name"
minimum_length: Minimum length minimum_length: Minimum length
maximum_length: Maximum length maximum_length: Maximum length
hall: hall:
name: Name name: "Name"
personal_profile: personal_profile:
biography: Short bography biography: "Short biography"
first_name: First name first_name: "First name"
github: Github account github: Github account
last_name: Last name last_name: "Last name"
mobile_phone: Mobile phone mobile_phone: "Mobile phone"
organisation: Organization organisation: "Organization"
picture: Photo picture: "Photo"
public_email: Public e-mail public_email: "Public e-mail"
twitter: Twitter account twitter: Twitter account
volunteer: volunteer:
language: Language
picture: Picture picture: Picture
name: Name name: Name
email: E-mail email: E-mail
@ -96,187 +118,206 @@ en:
food_preferences: Food preference food_preferences: Food preference
previous_experience: Previous experience previous_experience: Previous experience
notes: Notes notes: Notes
volunteer_teams: Екипи доброволци terms_accepted: I agree to be contacted by the team
track:
color: Color
description: Description
name: Name
user:
current_password: Current password
email: E-mail
language: Language language: Language
password: Password volunteer_team: Volunteer team
password_confirmation: Password confirmation additional_volunteer_teams: Additional volunteer teams
remember_me: Remember me track:
color: "Color"
description: "Description"
name: "Name"
user:
current_password: "Current password"
email: E-mail
language: "Language"
password: "Password"
password_confirmation: "Password confirmation"
remember_me: "Remember me"
volunteer_team:
name: Name
description: Description
color: Color
errors: errors:
models: models:
event: event:
attributes: attributes:
track: track:
must_be_a_valid_track: must be one of the listed lecture tracks must_be_a_valid_track: "must be one of the listed lecture tracks"
length: length:
must_be_between: "must be between %{minimum} and %{maximum} minutes" must_be_between: "must be between %{minimum} and %{maximum} minutes"
personal_profile: personal_profile:
attributes: attributes:
github: github:
invalid: can contain only alphabet characters, digits or a dash and cannot start with a dash invalid: "can contain only alphabet characters, digits or a dash and cannot start with a dash"
twitter: twitter:
invalid: can contain a maximum of 15 symbols that need to be alphabet charachters, digits or an underscore invalid: "can contain a maximum of 15 symbols that need to be alphabet characters, digits or an underscore"
user: user:
attributes: attributes:
email: email:
invalid: is not a valid e-mail address invalid: "is not a valid e-mail address"
password_confirmation: password_confirmation:
confirmation: does not match the password confirmation: "does not match the password"
volunteer: volunteer:
attributes: attributes:
picture: picture:
invalid_content_type: "invalid picture format" invalid_content_type: "invalid picture format"
volunteer_team:
invalid_volunteer_team: "invalid volunteer team"
additional_volunteer_teams:
invalid_volunteer_team: "invalid volunteer team"
models: models:
feedback:
one: Feedback
other: Feedback
participation:
one: Participation
other: Participation
volunteership: volunteership:
one: volunteership one: volunteership
other: volunteerships other: volunteerships
conference: conference:
one: conference one: "conference"
other: conferences other: "conferences"
event: event:
one: Suggestion one: "Suggestion"
other: Suggestions other: "Suggestions"
event_type: event_type:
one: event type one: "event type"
other: event types other: "event types"
hall: hall:
one: hall one: "hall"
other: halls other: "halls"
lecture: lecture:
one: Lecture one: "Lecture"
other: Lectures other: "Lectures"
personal_profile: personal_profile:
one: Profile one: "Profile"
other: Profiles other: "Profiles"
proposition: proposition:
one: Proposition one: "Proposition"
other: Propositions other: "Propositions"
sponsorship_offer: sponsorship_offer:
one: sponsor one: "sponsor"
other: sponsors other: "sponsors"
track: track:
one: track one: "track"
other: tracks other: "tracks"
volunteer_team: volunteer_team:
one: "volunteer team" one: "volunteer team"
other: "volunteer teams" other: "volunteer teams"
user: user:
one: User one: "User"
other: Users other: "Users"
volunteer: volunteer:
one: volunteer one: "volunteer"
other: volunteers other: "volunteers"
workshop: workshop:
one: Workshop one: "Workshop"
other: Workshops other: "Workshops"
change_pass: Change password change_pass: "Change password"
click_to_unlock: Click the link below to unlock click_to_unlock: "Click the link below to unlock"
confirm_by_clicking: You can confirm your account by clicking the link below confirm_by_clicking: "You can confirm your account by clicking the link below"
confirmations: confirmations:
did_not_receive_confirmation_instructions: You have not received confirmation instructions? did_not_receive_confirmation_instructions: "You have not received confirmation instructions?"
resend: Send resend: "Send"
resend_confirmation: Send confirmation E-mail resend_confirmation: "Send confirmation E-mail"
description: Description description: "Description"
did_not_get_confirmation: You did not receive confirmation instructions? did_not_get_confirmation: "You did not receive confirmation instructions?"
did_not_get_unlock: You did not receive unlock instructions? did_not_get_unlock: "You did not receive unlock instructions?"
do_not_want_pass_reset1: "If you don't want to change your password, please delete this E-mail." do_not_want_pass_reset1: "If you don't want to change your password, please delete this E-mail."
do_not_want_pass_reset2: Your password will not be change unless you click the link above and enter a new password. do_not_want_pass_reset2: "Your password will not be change unless you click the link above and enter a new password."
edit: Edit edit: "Edit"
edit_speaker_profile: Edit profile edit_speaker_profile: "Edit profile"
edit_talk: Edit talk edit_talk: "Edit talk"
edit_title: 'track "%{track}", duration: %{len} min' edit_title: "track \"%{track}\", duration: %{len} min"
edit_workshop: Edit workshop edit_workshop: "Edit workshop"
enter: Enter enter: "Enter"
errors: errors:
messages: messages:
improbable_phone: not a valid phone number improbable_phone: "not a valid phone number"
event_mailer: event_mailer:
acceptance_notification: acceptance_notification:
subject: Your submission for %{conference} for the %{submission_type} "%{title}" has been approved subject: "Your submission for %{conference} for the %{submission_type} \"%{title}\" has been approved"
rejection_notification: rejection_notification:
subject: "Your submission for %{conference} for the %{submission_type} \"%{title}\" has not been approved" subject: "Your submission for %{conference} for the %{submission_type} \"%{title}\" has not been approved"
volunteer_mailer: volunteer_mailer:
success_notification: success_notification:
subject: "Your application for volunteership on %{conference_name} was received" subject: "Your application for \"volunteership\" on %{conference_name} was received"
email_confirmation:
subject: "Confirm your e-mail address to participate in %{conference_name}"
event_states: event_states:
approved: approved:
one: Approved one: "Approved"
other: Approved other: "Approved"
backup: backup:
one: Backup one: "Backup"
other: Backup other: "Backup"
confirmed: confirmed:
one: Confirmed one: "Confirmed"
other: Confirmed other: "Confirmed"
rejected: rejected:
one: Rejected one: "Rejected"
other: Rejected other: "Rejected"
undecided: undecided:
one: Undecided one: "Undecided"
other: Undecided other: "Undecided"
expected_validation: Awaiting confirmation of %{email} expected_validation: "Awaiting confirmation of %{email}"
hello: Hello, %{name} hello: "Hello, %{name}"
home: Home home: "Home"
home_title: "%{conference} - call for participation" home_title: "%{conference} - call for participation"
lecture_was_successfully_confirmed: Your lecture was confirmed successfully lecture_was_successfully_confirmed: "Your lecture was confirmed successfully"
license_notice: Please keep in mind that the presentations will later be published under the CC-BY-ND (Creative Commons Attribution No derivatives) license. license_notice: "Please keep in mind that the presentations will later be published under the CC-BY-ND (Creative Commons Attribution No derivatives) license."
locales: locales:
bg: Bulgarian bg: "Bulgarian"
en: English en: English
login: Login login: "Login"
login_data: Account information login_data: "Account information"
login_with: Log in with %{with} login_with: "Log in with %{with}"
logout: Log out logout: "Log out"
lostpass: Forgotten password? lostpass: "Forgotten password?"
meta_data: 'Language: %{language}, track: "%{track}", duration: %{length} m.' meta_data: "Language: %{language}, track: \"%{track}\", duration: %{length} m."
my_talks: My lecture submissions my_talks: "My lecture submissions"
my_workshops: My workshop submissions my_workshops: "My workshop submissions"
new_workshop_title: Submit a workshop new_workshop_title: "Submit a workshop"
no_talks_submitted: You are yet to submit a lecture no_talks_submitted: "You are yet to submit a lecture"
no_workshops_submitted: You are yet to submit a workshop no_workshops_submitted: "You are yet to submit a workshop"
of_motto: share the freedom of_motto: "share the freedom"
pass_update_hint1: Do not fill this in unless you want to change your password pass_update_hint1: "Do not fill this in unless you want to change your password"
pass_update_hint2: "Fill this in if you'd like to change your password or E-mail address" pass_update_hint2: "Fill this in if you'd like to change your password or E-mail address"
passwords: passwords:
change_your_password: Change your password change_your_password: "Change your password"
confirm_your_new_password: Password confirmation confirm_your_new_password: "Password confirmation"
forgotten_password: Forgotten password forgotten_password: "Forgotten password"
new_password: New password new_password: "New password"
send_instructions: Send instructions send_instructions: "Send instructions"
please_fill_in_your_speaker_profile: Please fill in the data for your personal profile please_fill_in_your_speaker_profile: "Please fill in the data for your personal profile"
registration: Registration registration: "Registration"
registrations: registrations:
account_cancelation: Account deletion account_cancelation: "Account deletion"
add_phone_number: Add a phone number add_phone_number: "Add a phone number"
are_you_sure: Are you sure you want to delete your registration are_you_sure: "Are you sure you want to delete your registration"
cancel_my_account: Delete my account cancel_my_account: "Delete my account"
edit_account: Edit account edit_account: "Edit account"
leave_blank_if_you_do_not_want_to_change: "leave blank if you don't want to change it" leave_blank_if_you_do_not_want_to_change: "leave blank if you don't want to change it"
minimum_characters: at least %{minimum} symbols minimum_characters: "at least %{minimum} symbols"
sign_me_up: Sign me up sign_me_up: "Sign me up"
sign_up: Registration sign_up: "Registration"
unhappy: You are not happy? unhappy: "You are not happy?"
update: Update update: "Update"
we_need_your_current_password: we need your current password in order to confirm the changes we_need_your_current_password: "we need your current password in order to confirm the changes"
resend_instructions_btn: Resend instructions resend_instructions_btn: "Resend instructions"
resend_instructions_header: Resend confirmation instructions resend_instructions_header: "Resend confirmation instructions"
resend_unlock_instructions_title: Resend unlock instructions resend_unlock_instructions_title: "Resend unlock instructions"
send_lostpass_instructions: Resend lost password instructions send_lostpass_instructions: "Resend lost password instructions"
sessions: sessions:
remember_me: Remember me remember_me: "Remember me"
sign_in: Sign in sign_in: "Sign in"
sign_in_heading: Sign in sign_in_heading: "Sign in"
sign_in_with: Sign in with %{with} sign_in_with: "Sign in with %{with}"
sign_out: Sign out sign_out: "Sign out"
simple_form: simple_form:
error_notification: error_notification:
default_message: 'Please see the errors below:' default_message: "Please see the errors below:"
options: options:
volunteer: volunteer:
tshirt_size: tshirt_size:
@ -295,92 +336,97 @@ en:
vegan: Vegan vegan: Vegan
hints: hints:
feedback: feedback:
author_email: "Your E-mail address if you'd like to share it with us" author_email: Your E-mail address if you'd like to share it with us
rating: Select your rating for the event rating: Select your rating for the event
comment: Express your opinion in greater detail here comment: Express your opinion in greater detail here
conference: conference:
description: Conference description description: "Conference description"
email: Orga team email email: Orga team email
end_date: Last day of the conference end_date: "Last day of the conference"
start_date: First day of the conference start_date: "First day of the conference"
title: Title of the conference planned_cfp_end_date: "The day before all speakers must have submitted their proposals. This field is informative, it is not enforced."
title: "Title of the conference"
tracks: tracks:
color: Color color: "Color"
description: Short description description: "Short description"
name: Track name name: "Track name"
event: event:
abstract: An abstract of the event that will be published for the attendees to read (around 1 paragraph) abstract: "An abstract of the event that will be published for the attendees to read (around 1 paragraph)"
agreement: Indicate if you accept your workshop to be recorded and published under the CC-BY-ND (Creative Commons Attribution No Derivatives) license agreement: "Indicate if you accept your workshop to be recorded and published under the CC-BY-ND (Creative Commons Attribution No Derivatives) license"
description: Detailed description of the event (several paragraphs) description: "Detailed description of the event (several paragraphs)"
language: "Language in which the event will be lead" language: ""
length: "Length of the event (in minutes). The length of a %{type} is between %{min} and %{max} minutes" length: "Length of the event (in minutes). The length of a %{type} is between %{min} and %{max} minutes"
notes: "Notes that you'd like the organisation team to read" notes: "Notes that you'd like the organisation team to read"
subtitle: "" subtitle: ""
title: "" title: ""
track: The lecture track for your event track: "The lecture track for your event"
personal_profile: personal_profile:
biography: Describe yourself with a few sentences, writing about yourself in the third person :) biography: "Describe yourself with a few sentences, writing about yourself in the third person :)"
github: Your Github username github: "Your Github username"
mobile_phone: A mobile phone that will be visible only by the organisation team mobile_phone: "A mobile phone that will be visible only by the organisation team"
organisation: The organisation you represent organisation: "The organisation you represent"
picture: Your photo picture: "Your photo"
public_email: E-mail address that will be visible for the attendees public_email: E-mail address that will be visible for the attendees
twitter: Your Twitter handle twitter: "Your Twitter handle"
volunteer: volunteer:
email: "Your E-mail address. It will be visible only to the organizsers" name: "Keep in mind that this name will be written in your certificate for participation in the conference."
phone: "Your mobile phone. It will be visible only to the organizsers" email: "Your E-mail address. It will be visible only to the organizers"
phone: "Your mobile phone. It will be visible only to the organizers"
picture: "A picture of you in jpeg, png or gif format" picture: "A picture of you in jpeg, png or gif format"
volunteer_teams: "The volunteer teams you'd like to be part of. You can find a description of each team <a href=\"/volunteer_teams?locale=en\" target=\"_blank\">here</a>" volunteer_team: "The volunteer team you'd like to be a part of. You can find a description of each team <a href=\"/volunteer_teams?locale=en\" target=\"_blank\">here</a>. Leave a note in the Notes field if you wish to be a part of any additional teams."
user: user:
email: Your e-mail address. Will be visible to the organizers only. email: Your e-mail address. Will be visible to the organizers only.
password: Password with length between 8 and 128 symbols password: "Password with length between 8 and 128 symbols"
password_confirmation: Repeat the password password_confirmation: "Repeat the password"
'no': false 'no': "No"
required: required:
mark: "*" mark: "*"
text: Required field text: "Required field"
'yes': true 'yes': "Yes"
someone_requested_passreset: Someone requested to change the password of your account. The password can be changed by following the link below someone_requested_passreset: "Someone requested to change the password of your account. The password can be changed by following the link below"
speaker_profile: Speaker profile speaker_profile: "Speaker profile"
submit_talk_header: Submit a new talk submit_talk_header: "Submit a new talk"
suggestion_and_speaker_count: "%{suggestions} submissions by %{speakers} speakers" suggestion_and_speaker_count: "%{suggestions} submissions by %{speakers} speakers"
talks: Talks talks: "Talks"
unlocks: unlocks:
did_not_receive_unlock_instructions: DId not receive unlock instructions? did_not_receive_unlock_instructions: "Did not receive unlock instructions?"
resend: Resend resend: "Resend"
resend_unlock_instructions: Resend unlock instructions resend_unlock_instructions: "Resend unlock instructions"
update: Update update: "Update"
views: views:
conference: conference:
info: Conference details info: "Conference details"
see_details: See details see_details: "See details"
events: events:
edit_event: Editing %{event_type} %{title} edit_event: "Editing %{event_type} %{title}"
event_successfully_created: Your %{event_type} submission was successfully created event_successfully_created: "Your %{event_type} submission was successfully created"
event_successfully_updated: Your %{event_type} submission was successfully updated event_successfully_updated: "Your %{event_type} submission was successfully updated"
successfully_confirmed: Your %{event_type} submission was successfully confirmed successfully_confirmed: "Your %{event_type} submission was successfully confirmed"
error_on_confirmation: There was an error during the confirmation of your %{event_type} submission error_on_confirmation: "There was an error during the confirmation of your %{event_type} submission"
no_events: You are yet to submit an event no_events: "You are yet to submit an event"
submit_event: Submit a %{event_type} submit_event: "Submit a %{event_type}"
navigation: navigation:
my_submissions: My submissions my_submissions: "My submissions"
personal_profiles: personal_profiles:
successfully_created: Your personal profile was successfully created successfully_created: "Your personal profile was successfully created"
successfully_updated: Your personal profile was successfully updated successfully_updated: "Your personal profile was successfully updated"
user: user:
info: User details info: "User details"
welcome: welcome:
submit_event: Submit %{event_type} submit_event: "Submit %{event_type}"
volunteers: volunteers:
email_not_confirmed: Your e-mail address has not been confirmed yet. Please check your e-mail and click on the link from the confirmation message you received.
email_confirmed_successfully: You have successfully confirmed your e-mail address!
email_confirmation_error: There was an error during the attempt to confirm your e-mail address.
new_volunteer_title: Apply for a volunteer new_volunteer_title: Apply for a volunteer
edit_volunteer_title: "Volunteership application of %{name}" edit_volunteer_title: "Volunteership application of %{name}"
apply: Apply for a volunteer apply: Apply for a volunteer
withdraw_application: Withraw your application withdraw_application: Withdraw your application
successful_application: "Your application was successfully submitted" successful_application: "Your application was successfully submitted"
successful_application_edit: "Your application was successfully updated" successful_application_edit: "Your application was successfully updated"
error_occurred_while_applying: "There was an error and your application could not be sent" error_occurred_while_applying: "There was an error and your application could not be sent"
you_successfully_retracted_your_application_for: "Your application was successfully retracted" you_successfully_retracted_your_application_for: "Your application was successfully retracted"
welcome: Welcome, %{name} welcome: "Welcome, %{name}"
what_we_ask: 'We would like to receive your lecture and workshop submissions that belong to the following tracks until %{date}:' what_we_ask: "We would like to receive your lecture, workshop, and stand submissions that belong to the following tracks until %{date}:"
workshop_was_successfully_confirmed: The workshop was successfully confirmed workshop_was_successfully_confirmed: "The workshop was successfully confirmed"
workshops: Workshops workshops: "Workshops"

Some files were not shown because too many files have changed in this diff Show More