GithubHelp home page GithubHelp logo

eurucamp / call4papers Goto Github PK

View Code? Open in Web Editor NEW
9.0 14.0 7.0 4.22 MB

eurucamp Call for Papers application

License: Other

Ruby 64.88% JavaScript 0.02% CSS 4.39% HTML 30.70%
ruby conference-speakers conferences cfp eurucamp proposal conference conference-management

call4papers's Introduction

eurucamp Call for Proposals

License Codeship Status

The eurucamp Call for Papers application allows users to submit conference proposals or suggest speakers. Signup works through Github or Twitter.

Donationware

This app was originally created by the team from wroc_love.rb.

This app is currently maintained by members of the Ruby Berlin e.V. on their free time as a community effort for the eurucamp conference. Ruby Berlin is the body behind RailsGirls Berlin and Hamburg, eurucamp, JRubyConf.eu and the Ruby User Group Berlin.

If you end up using the app, please get in contact so that we know. Also, spread the word about our projects. Also, consider donating, especially, if you run a commercial conference. We are a registered non-profit, donations are tax deducible. Betterplace handles all paperwork - if in doubt, send us a mail.

If you cannot or don't want to donate - use it, it's free.

Logo

Don't use the eurucamp logo for your instance to avoid confusion.

Development

An installed postgresql instance and a compiler is needed.

ENV variables used:

  • GITHUB_KEY: Your github application key.
  • GITHUB_SECRET: Your github application secret.
  • TWITTER_KEY: Your twitter application key.
  • TWITTER_SECRET: Your twitter application secret.
  • LOCALE_API_KEY: Your key for Locale.
  • PORT: The port to run on.
  • HOSTNAME: The hostname to bind to. (0.0.0.0 for IPv4, or :: for IPv6)

Basic setup

  • cp .env.sample .env
  • cp config/database.yml.example config/database.yml
  • update config files. You should register on Localeapp for an API key and add your personal LOCALE_API_KEY.
  • run migration scripts
  • bundle exec foreman start

Deployment

Every commit on the branch master is tested by Codeship and a will will be deployed to cfp-staging.eurucamp.org if all tests pass. If master is ready for prime time, send a pull request and merge into the release branch. Codeship will take care of running the tests again and deploy to production.

Contributing to translations

  • Edit the translations directly on the eurucamp/call4papers project on Locale.
  • That's it!
  • The maintainer will then pull translations from the Locale project and push to Github.

Happy translating!

Authors

This app was originally created by the team from wroc_love.rb and subsequently extended by the eurucamp team.

License

GNU-AGPL-3.0, see COPYRIGHT for details.

call4papers's People

Contributors

andrzejkrzywda avatar bascht avatar bitboxer avatar chastell avatar eljojo avatar emilsoman avatar jasiek avatar lucaspinto avatar madpew avatar maser avatar mlomnicki avatar moonglum avatar mostlyobvious avatar myabc avatar paneq avatar phansch avatar pietia avatar polarblau avatar pragtob avatar roxasshadow avatar schokomarie avatar skade avatar thilo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

call4papers's Issues

Validate `call_ids` when submitting talk

When a new talk is created, the call_ids array is not validated properly.
It should be checked whether all calls exist and if a user can submit to the call (e.g. the call must be open).

Duplicate key value violates unique constraint when submitting a new talk

Steps to recreate: Fresh development environment (docker-compose build; docker-compose-up in my case) with an empty database.

Setup

  • rake db:create db:migrate db:seed
  • rails console

Create a new call

c = Call.new(:title => "New Call", :closes_at => "2015-04-30")
c.save!

Create a new User

I created a simple user:

=> #<User id: 3, name: "icke", email: "[email protected]", bio: nil, website_url: nil, twitter_handle: nil, github_handle: nil, created_at: "2015-03-27 18:44:25", updated_at: "2015-03-27 18:57:39", encrypted_password: "$2a$10$TxUo5pAmymFmp6mQaQWDXuLGPYkgnwYYOMkxcAFoAdz...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 3, current_sign_in_at: "2015-03-27 18:57:39", last_sign_in_at: "2015-03-27 18:56:37", current_sign_in_ip: "172.17.42.1", last_sign_in_ip: "172.17.42.1", staff: nil, mentor: false, gender: nil>

Log in & Create a new talk

screenshot from 2015-03-27 20 14 35

Content of the fields doesn't matter. Select a Call.

Click Create Talk

screenshot from 2015-03-27 20 14 48

Rails Log

web_1 | Started POST "/talks" for 172.17.42.1 at 2015-03-27 19:00:59 +0000
web_1 | Processing by TalksController#create as HTML
web_1 |   Parameters: {"utf8"=>"✓", "authenticity_token"=>"iQQMd/1ly7CrF1RHnzfKz7DgcDZf9gDLGRjowgTLZFWRikuSV7rdXbqx+UANuxEtJGWYTYSyFgKQkPk9PIkmDA==", "talk"=>{"title"=>"fasdf", "public_description"=>"adsf", "private_description"=>"asdfasd", "time_slot"=>"15 minutes", "mentor_name"=>"fasdfas", "mentors_can_read"=>"1", "user_attributes"=>{"gender"=>"", "bio"=>"", "mentor"=>"0", "id"=>"3"}, "call_ids"=>["3", ""], "terms_and_conditions"=>"1"}, "commit"=>"Create Talk"}
web_1 |   User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 3]]
web_1 |    (0.5ms)  SELECT COUNT(*) AS count_all, call_id AS call_id FROM "proposals" INNER JOIN "calls" ON "calls"."id" = "proposals"."call_id" WHERE (closes_at >= '2015-03-27 19:00:59.959409' AND (opens_at IS NULL OR opens_at <= '2015-03-27 19:00:59.959409')) GROUP BY call_id
web_1 |    (0.3ms)  SELECT COUNT(*) FROM "users" WHERE "users"."staff" IS NULL
web_1 | Unpermitted parameter: id
web_1 |   Call Load (0.2ms)  SELECT  "calls".* FROM "calls" WHERE "calls"."id" = $1 LIMIT 1  [["id", 3]]
web_1 | Unpermitted parameter: id
web_1 | Unpermitted parameter: id
web_1 |    (0.2ms)  BEGIN
web_1 |   Call Exists (0.5ms)  SELECT  1 AS one FROM "calls" WHERE ("calls"."title" = 'Neu' AND "calls"."id" != 3) LIMIT 1
web_1 |   Call Exists (0.5ms)  SELECT  1 AS one FROM "calls" WHERE ("calls"."title" = 'Neu' AND "calls"."id" != 3) LIMIT 1
web_1 |   Authentication Exists (0.3ms)  SELECT  1 AS one FROM "authentications" WHERE "authentications"."user_id" = $1 LIMIT 1  [["user_id", 3]]
web_1 |   Authentication Exists (0.2ms)  SELECT  1 AS one FROM "authentications" WHERE "authentications"."user_id" = $1 LIMIT 1  [["user_id", 3]]
web_1 |   SQL (0.4ms)  UPDATE "users" SET "bio" = $1, "updated_at" = $2 WHERE "users"."id" = $3  [["bio", ""], ["updated_at", "2015-03-27 19:00:59.979392"], ["id", 3]]
web_1 |   Call Exists (0.4ms)  SELECT  1 AS one FROM "calls" WHERE ("calls"."title" = 'Neu' AND "calls"."id" != 3) LIMIT 1
web_1 |   Call Exists (0.3ms)  SELECT  1 AS one FROM "calls" WHERE ("calls"."title" = 'Neu' AND "calls"."id" != 3) LIMIT 1
web_1 |   Authentication Exists (0.2ms)  SELECT  1 AS one FROM "authentications" WHERE "authentications"."user_id" = $1 LIMIT 1  [["user_id", 3]]
web_1 |   Authentication Exists (0.2ms)  SELECT  1 AS one FROM "authentications" WHERE "authentications"."user_id" = $1 LIMIT 1  [["user_id", 3]]
web_1 |   SQL (0.4ms)  INSERT INTO "talks" ("title", "public_description", "private_description", "time_slot", "mentor_name", "user_id", "track", "id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING "id"  [["title", "fasdf"], ["public_description", "adsf"], ["private_description", "asdfasd"], ["time_slot", "15 minutes"], ["mentor_name", "fasdfas"], ["user_id", 3], ["track", "Test"], ["id", "430c81acd49a26dc017e85e7b47ac4cd"], ["created_at", "2015-03-27 19:00:59.987639"], ["updated_at", "2015-03-27 19:00:59.987639"]]
web_1 |   SQL (0.4ms)  INSERT INTO "proposals" ("call_id", "id", "talk_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["call_id", 3], ["id", "d23183e7435a1a990d4529126c28feab"], ["talk_id", "430c81acd49a26dc017e85e7b47ac4cd"], ["created_at", "2015-03-27 19:00:59.989938"], ["updated_at", "2015-03-27 19:00:59.989938"]]
web_1 |   SQL (1.6ms)  INSERT INTO "proposals" ("talk_id", "call_id", "id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["talk_id", "430c81acd49a26dc017e85e7b47ac4cd"], ["call_id", 3], ["id", "712ebfbde11b0dd70c3db0c88e230944"], ["created_at", "2015-03-27 19:00:59.995127"], ["updated_at", "2015-03-27 19:00:59.995127"]]
web_1 | PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_proposals_on_talk_id_and_call_id"
web_1 | DETAIL:  Key (talk_id, call_id)=(430c81acd49a26dc017e85e7b47ac4cd, 3) already exists.
web_1 | : INSERT INTO "proposals" ("talk_id", "call_id", "id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"
web_1 |    (0.1ms)  ROLLBACK
web_1 | Completed 500 Internal Server Error in 45ms
web_1 | 
web_1 | ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_proposals_on_talk_id_and_call_id"
web_1 | DETAIL:  Key (talk_id, call_id)=(430c81acd49a26dc017e85e7b47ac4cd, 3) already exists.
web_1 | : INSERT INTO "proposals" ("talk_id", "call_id", "id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"):
web_1 |   app/controllers/talks_controller.rb:30:in `create'
web_1 | 
web_1 | 
web_1 |   Rendered /usr/local/bundle/gems/web-console-2.0.0/lib/action_dispatch/templates/rescues/_source.erb (7.4ms)
web_1 |   Rendered /usr/local/bundle/gems/web-console-2.0.0/lib/action_dispatch/templates/rescues/_trace.html.erb (4.1ms)
web_1 |   Rendered /usr/local/bundle/gems/web-console-2.0.0/lib/action_dispatch/templates/rescues/_request_and_response.html.erb (0.8ms)
web_1 |   Rendered /usr/local/bundle/gems/web-console-2.0.0/lib/action_dispatch/templates/rescues/_web_console.html.erb (0.6ms)
web_1 |   Rendered /usr/local/bundle/gems/web-console-2.0.0/lib/action_dispatch/templates/rescues/diagnostics.html.erb within rescues/layout (21.3ms)

Checkbox "I am okay with mentors reading my submission"

There is a problem we didn't cover: review of submissions before the mentors were paired. I am sure not everyone would like to have others read their submission (because mentors can be competitors), so I'd suggest a box that this is allowed.

Also, later on add a way to read the submission and give feedback ;).

The box should be checked by default.

Revalidate voting system

The voting system was designed, implemented and debugged during the voting. I recommend finding a better solution :).

Couldn't create Communication for users with empty profiles

Lucas tried to create a new Comunication/Message for all the users with a paper for eurucamp 2014 with empty profiles, but rails kept complaining "recipients cannot be empty".

When reproducing from the console, it seemed to work.
It might happen that recipients gets assigned before call_id so the model doesn't pick it up correctly.

Staging is broken

thin Unexpected error while processing request: Missing `secret_token` and `secret_key_base` for 'staging' environment, set these values in `config/secrets.yml`                                              
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/railties-4.2.0/lib/rails/application.rb:520:in `validate_secret_key_config!'                            
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/railties-4.2.0/lib/rails/application.rb:246:in `env_config'                                             
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/railties-4.2.0/lib/rails/engine.rb:514:in `call'                                                        
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/railties-4.2.0/lib/rails/application.rb:164:in `call'                                                   
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/railties-4.2.0/lib/rails/railtie.rb:194:in `public_send'                                                
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/railties-4.2.0/lib/rails/railtie.rb:194:in `method_missing'                                             
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/thin-1.6.3/lib/thin/connection.rb:86:in `block in pre_process'                                          
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/thin-1.6.3/lib/thin/connection.rb:84:in `catch'                                                         
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/thin-1.6.3/lib/thin/connection.rb:84:in `pre_process'                                                   
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/thin-1.6.3/lib/thin/connection.rb:53:in `process'                                                       
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/thin-1.6.3/lib/thin/connection.rb:39:in `receive_data'                                                  
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/eventmachine-1.0.4/lib/eventmachine.rb:187:in `run_machine'                                             
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/eventmachine-1.0.4/lib/eventmachine.rb:187:in `run'                                                     
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/thin-1.6.3/lib/thin/backends/base.rb:73:in `start'                                                      
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/thin-1.6.3/lib/thin/server.rb:162:in `start'                                                            
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/thin-1.6.3/lib/thin/controllers/controller.rb:87:in `start'                                             
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/thin-1.6.3/lib/thin/runner.rb:200:in `run_command'                                                      
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/thin-1.6.3/lib/thin/runner.rb:156:in `run!'                                                             
thin    /home/app/app/releases/cf612bebca09890043b654f12b17a9c04b829d31/vendor/bundle/ruby/2.2.0/gems/thin-1.6.3/bin/thin:6:in `<top (required)>'                                                             
thin    /home/app/app/releases/39ce1c12f49ae4a984053b8f31d2c6b1079c5cc8/vendor/bundle/bin/thin:16:in `load'                                                                                                   
thin    /home/app/app/releases/39ce1c12f49ae4a984053b8f31d2c6b1079c5cc8/vendor/bundle/bin/thin:16:in `<main>'

Separate concept of Paper to Talk and Proposal

Instead of having papers, there should be talks and proposals. A user creates a talk (with information about the topic etc.) and one or more proposals to a subset of the three conferences. So a Call has many Papers through Proposals.

This is required in order to be able to implement check boxes to choose for which conferences to propose

Add reviewer notes

Add a possibility for admins to leave notes on papers. This allows them to prescreen proposals when they have time.

Only allow this when the call is closed, because otherwise, the note might refer to a proposal that was rewritten.

Papers uneditable

As Paper.find() involves the default_scope and joins are per default read_only in Rails 4, papers are currently uneditable. (Since yesterday late night, just to calm the general public)

Profile picture in speaker profile page is broken

Here's a screenshot :

image

Looks like we're using a wrong image url :
<img src="https://twitter.com/api/users/profile_image/emilsoman?size=bigger" alt="Emilsoman?size=bigger">

Maybe stick with Gravatar instead ?

Drop Ruby 2.1 support

The app works with Ruby 2.2, there is no real reason to keep supporting 2.1. We can finish what was started in bc8e848.

Add Shelly Cloud Footer

We're hosted on Shelly Cloud and they're really kind – so let's add a banner somewhere in the footer. I just had a chat with Sebastian from Shelly Cloud and we can add the logos to our repo:

  • Transparent
    or
  • Solid

Cannot view proposal's details

I was playing around with the app to figure out some things thereby I bumped on this:

In the admin section I click on a talk's title to view the details. Then this exception occurs:

screen shot 2015-03-18 at 14 20 24

Exchange jruby cover image (again)

thanks for the quick exchange yesterday, we probably should look for even another photo (or maybe it's just me) - the current cover photo has the eurucamp logo displayed prominently which can be confusing for potential speakers (you know I <3 eurucamp)

I don't have suggestions just now :o

selection_054

Rails renders Yes/No when submitting talk without calls

When I submit a talk without any checked calls, validation fails and in the rendered form, I get Yes/No checkboxes asking if I want to submit to any conference.

screen shot 2015-03-27 at 19 46 48

This screenshot shows the line in app/views/talks/_form.html.erb which causes the problem.

Show list of proposals per conference

Currently /admin/proposals just shows all proposals. When a talk is proposed for multiple conferences, this is confusing as it shows up twice.

  • Change this to /admin/calls/:call_id/proposals so there is less danger of somebody rating the wrong proposal.
  • Show a list of calls when going to the "Admin section" that point to the new path. Remove the global proposal list.
  • On the rating form, make the "Vote and go to papers list" button go to the list of proposals for the call of the rated proposal.
  • On the same form, make the "Vote and go to next paper" button stay inside the call of the rated proposal.

Cannot create messages for selected call

I can only create messages that go to "All Users". If I select one of the other options (e.g. "All Users for selected Call") and select a call (hint: only open calls are shown), a validation error is shown on the "Recipients" field.

I went back to bc8e848 and could reproduce it, so I believe we did not break this in recent changes.

Make new talks form not look quite so horrible

  • Conference selection needs more padding so people actually notice it.
  • CoC checkbox has a strange line break.
  • Change “Calls” to “I want to submit this to the following conferences”.
  • Public/private descriptions should be text areas to allow input of bigger texts.
  • Validate that at least one conference is selected.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.