Browse Source

add register via email

main
Christoph Marzell 1 month ago
parent
commit
17a2b93886
  1. 2
      app/models/user.rb
  2. 20
      app/views/devise/confirmations/new.html.erb
  3. 32
      app/views/devise/passwords/edit.html.erb
  4. 20
      app/views/devise/passwords/new.html.erb
  5. 2
      app/views/devise/registrations/edit.html.erb
  6. 2
      app/views/entries/index.html.erb
  7. 92
      app/views/layouts/application.html.erb
  8. 19
      config/environments/development.rb
  9. 22
      config/environments/production.rb
  10. 2
      config/initializers/devise.rb
  11. 9
      db/migrate/20251108073226_add_confirmable_to_users.rb
  12. 9
      db/migrate/20251108073233_confirm_all_existing_users.rb
  13. 7
      db/schema.rb

2
app/models/user.rb

@ -2,7 +2,7 @@ class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
:recoverable, :rememberable, :validatable, :confirmable
has_many :entries, dependent: :destroy

20
app/views/devise/confirmations/new.html.erb

@ -0,0 +1,20 @@
<div class="container mt-5">
<h2 class="mb-4">Bestätigungs‑Link erneut senden</h2>
<%= form_with(scope: resource_name, url: password_path(resource_name), local: true) do |f| %>
<div class="mb-3">
<%= f.label :email, 'E‑Mail Adresse', class: 'form-label' %>
<%= f.email_field :email, autofocus: true, class: 'form-control', placeholder: 'Ihre E‑Mail' %>
</div>
<div class="mt-4">
<%= f.submit 'Link senden', class: 'btn btn-primary w-100' %>
</div>
<% end %>
<div class="mt-3 text-center">
<%= link_to 'Zurück zur Anmeldung', new_session_path(resource_name), class: 'btn btn-link' %>
</div>
</div>

32
app/views/devise/passwords/edit.html.erb

@ -0,0 +1,32 @@
<div class="container mt-5">
<h2 class="mb-4">🔐 Passwort zurücksetzen</h2>
<%= devise_error_messages! %>
<%= form_with(scope: resource_name, url: password_path(resource_name), method: :put, local: true) do |f| %>
<%= f.hidden_field :reset_password_token, value: params[:reset_password_token] %>
<div class="mb-3">
<%= f.label :email, 'E‑Mail Adresse', class: 'form-label' %>
<%= f.email_field :email, autofocus: true, class: 'form-control', placeholder: 'Ihre E‑Mail' %>
</div>
<div class="mb-3">
<%= f.label :password, 'Neues Passwort', class: 'form-label' %>
<%= f.password_field :password, autocomplete: "new-password", class: 'form-control' %>
</div>
<div class="mb-3">
<%= f.label :password_confirmation, 'Passwort bestätigen', class: 'form-label' %>
<%= f.password_field :password_confirmation, autocomplete: "new-password", class: 'form-control' %>
</div>
<div class="mt-4">
<%= f.submit 'Passwort aktualisieren', class: 'btn btn-primary w-100' %>
</div>
<% end %>
<div class="mt-3 text-center">
<%= link_to 'Zurück zur Anmeldung', new_session_path(resource_name), class: 'btn btn-link' %>
</div>
</div>

20
app/views/devise/passwords/new.html.erb

@ -0,0 +1,20 @@
<div class="container mt-5">
<h2 class="mb-4">Passwort vergessen?</h2>
<%= form_with(scope: resource_name, url: password_path(resource_name), local: true) do |f| %>
<div class="mb-3">
<%= f.label :email, 'E‑Mail Adresse', class: 'form-label' %>
<%= f.email_field :email, autofocus: true, class: 'form-control', placeholder: 'Ihre E‑Mail' %>
</div>
<div class="mt-4">
<%= f.submit 'Zugangsdaten senden', class: 'btn btn-primary w-100' %>
</div>
<% end %>
<div class="mt-3 text-center">
<%= link_to 'Zurück zur Anmeldung', new_session_path(resource_name), class: 'btn btn-link' %>
</div>
</div>

2
app/views/devise/registrations/edit.html.erb

@ -1,5 +1,7 @@
<h2>Profil bearbeiten</h2>
<%= devise_error_messages! %>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
<div class="mb-3">
<%= f.label :email, "E-Mail", class: "form-label" %>

2
app/views/entries/index.html.erb

@ -1,5 +1,7 @@
<div class="container my-4">
<h1 class="mb-4">Meine Einträge</h1>
<!-- 🔢 Zusammenfassung -->

92
app/views/layouts/application.html.erb

@ -1,53 +1,63 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Praktikumsuhr</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<!-- Flatpickr Theme -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/themes/material_blue.css">
<!-- Custom Styles (optional) -->
<%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
<!-- JS: Bootstrap Bundle (inkl. Popper) -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" defer></script>
<!-- Flatpickr JS -->
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
<!-- JS: Flatpickr Init -->
<script defer>
document.addEventListener("DOMContentLoaded", function () {
flatpickr(".flatpickr", {
dateFormat: "d.m.Y",
allowInput: true
});
});
</script>
<!-- JavaScript from Rails -->
<%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>
</head>
<body class="container mt-4">
<% if notice %><div class="alert alert-success"><%= notice %></div><% end %>
<% if alert %><div class="alert alert-danger"><%= alert %></div><% end %>
<% if user_signed_in? %>
<p class="text-end">
Eingeloggt als <%= current_user.email %> |
<%= link_to "Profil", edit_user_registration_path %> |
<%= link_to "Admin", admin_root_path %> |
<%= link_to "Logout", destroy_user_session_path, method: :delete, data: { turbo: false } %>
</p>
<% end %>
<%= yield %>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light mb-4">
<div class="container">
<%= link_to "Praktikumsuhr", root_path, class: "navbar-brand" %>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<% if user_signed_in? %>
<li class="nav-item">
<%= link_to "Einträge", entries_path, class: "nav-link" %>
</li>
<li class="nav-item">
<%= link_to "Profil", edit_user_registration_path, class: "nav-link" %>
</li>
<li class="nav-item">
<%= link_to "Abmelden", destroy_user_session_path, method: :delete, data: { turbo: false }, class: "nav-link" %>
</li>
<% else %>
<li class="nav-item">
<%= link_to "Anmelden", new_user_session_path, class: "nav-link" %>
</li>
<li class="nav-item">
<%= link_to "Registrieren", new_user_registration_path, class: "nav-link" %>
</li>
<% end %>
</ul>
</div>
</div>
</nav>
<div class="container">
<% if notice %>
<div class="alert alert-success"><%= notice %></div>
<% end %>
<% if alert %>
<div class="alert alert-danger"><%= alert %></div>
<% end %>
<%= yield %>
</div>
</body>
</html>

19
config/environments/development.rb

@ -37,10 +37,25 @@ Rails.application.configure do
config.active_storage.service = :local
# Don't care if the mailer can't send.
config.action_mailer.raise_delivery_errors = false
config.action_mailer.perform_caching = false
config.action_mailer.default_url_options = { :host => "localhost:3000", :protocol => 'http', from: 'praktikum@marzell.net' }
config.action_mailer.delivery_method = :smtp
# SMTP settings for gmail
config.action_mailer.perform_deliveries = true
config.action_mailer.smtp_settings = {
:address => 'smtp.ionos.de',
:port => 587,
domain: "marzell.net",
:user_name => 'praktikum@marzell.net',
:password => 'CSSABXGRhSzUFK9',
authentication: 'plain',
enable_starttls_auto: true
}
# Print deprecation notices to the Rails logger.
config.active_support.deprecation = :log

22
config/environments/production.rb

@ -95,19 +95,21 @@ Rails.application.configure do
# Skip DNS rebinding protection for the default health check endpoint.
# config.host_authorization = { exclude: ->(request) { request.path == "/up" } }
config.action_mailer.default_url_options = {
host: "praktikum.marzell.net",
protocol: "https"
}
config.action_mailer.perform_caching = false
config.action_mailer.default_url_options = { :host => "praktikum.marzell.net", :protocol => 'https', from: 'praktikum@marzell.net' }
config.action_mailer.delivery_method = :smtp
# SMTP settings for gmail
config.action_mailer.perform_deliveries = true
config.action_mailer.smtp_settings = {
address: "smtp.mailgun.org",
port: 587,
domain: "mg.marzell.net",
user_name: "postmaster@mg.marzell.net", # ⬅️ das bekommst du bei Mailgun
password: ENV["MAILGUN_SMTP_PASSWORD"], # ⬅️ sicher via ENV setzen
authentication: "plain",
:address => 'smtp.ionos.de',
:port => 587,
:user_name => 'praktikum@marzell.net',
:password => 'CSSABXGRhSzUFK9',
domain: "marzell.net",
authentication: 'plain',
enable_starttls_auto: true
}

2
config/initializers/devise.rb

@ -24,7 +24,7 @@ Devise.setup do |config|
# 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
# with default "from" parameter.
config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'
config.mailer_sender = 'praktikum@marzell.net'
# Configure the class responsible to send e-mails.
# config.mailer = 'Devise::Mailer'

9
db/migrate/20251108073226_add_confirmable_to_users.rb

@ -0,0 +1,9 @@
class AddConfirmableToUsers < ActiveRecord::Migration[7.1]
def change
add_column :users, :confirmation_token, :string
add_index :users, :confirmation_token
add_column :users, :confirmed_at, :datetime
add_column :users, :confirmation_sent_at, :datetime
add_column :users, :unconfirmed_email, :string
end
end

9
db/migrate/20251108073233_confirm_all_existing_users.rb

@ -0,0 +1,9 @@
class ConfirmAllExistingUsers < ActiveRecord::Migration[7.1]
def up
User.update_all(confirmed_at: Time.current)
end
def down
User.update_all(confirmed_at: nil)
end
end

7
db/schema.rb

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.1].define(version: 2025_11_07_054255) do
ActiveRecord::Schema[7.1].define(version: 2025_11_08_073233) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@ -39,6 +39,11 @@ ActiveRecord::Schema[7.1].define(version: 2025_11_07_054255) do
t.integer "weekly_target_hours", default: 12, null: false
t.jsonb "required_hours_matrix", default: {}, null: false
t.jsonb "weekly_target_matrix", default: {}, null: false
t.string "confirmation_token"
t.datetime "confirmed_at"
t.datetime "confirmation_sent_at"
t.string "unconfirmed_email"
t.index ["confirmation_token"], name: "index_users_on_confirmation_token"
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end

Loading…
Cancel
Save