Skip to content

Commit

Permalink
Make reference line editable.
Browse files Browse the repository at this point in the history
This is needed since the title is a bad default for some events.
  • Loading branch information
Nicholas Schwab committed Nov 13, 2022
1 parent 91eb04e commit 852af3f
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 97 deletions.
8 changes: 7 additions & 1 deletion app/assets/stylesheets/events.css
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
#event_registrations ul {
list-style-type: none;
padding-left: 0em;
columns: 3 12em;}
columns: 3 12em;
}

#events .overview dl {
Expand All @@ -31,3 +31,9 @@
max-width: 15em;
word-wrap: break-word;
}

.aligned > .hint {
margin-top: -0.5em;
grid-column: span 2;
text-align: right;
}
12 changes: 8 additions & 4 deletions app/models/event.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ class Event < ApplicationRecord

after_create :create_groups
after_save :update_groups
after_initialize :set_defaults

def set_defaults
self.reference_line ||= create_reference_line
end

# Zu jeder Veranstaltungen existiert für die Organistatoren sowie die Teilnehmer je eine Gruppe
# Diese können anschließend in Rechtemanagement oder in den Mailverteilern weiterverwendet werden. (siehe hierzu model/group.rb)
Expand Down Expand Up @@ -118,11 +123,10 @@ def object_name
title
end

def reference_line
create_reference_line
end

def create_reference_line
if title.nil?
return nil
end
ascii_title = asciify title
ascii_title.gsub(/20\d{2}/) {|match| match.delete_prefix("20")}
end
Expand Down
4 changes: 4 additions & 0 deletions app/views/events/_form.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@
<%= form.label :max_participants %>
<%= form.number_field :max_participants, id: :event_max_participants, min: 1 %>

<%= form.label :reference_line %>
<%= form.text_field :reference_line, id: :event_reference_line %>
<i class="hint">Sollte die Jahreszahl zweistellig enthalten.</i>

<%= form.label :comment %>
<%= form.text_area :comment, id: :event_comment, style: 'display: block' %>
</div>
Expand Down
5 changes: 5 additions & 0 deletions db/migrate/20221113154141_add_reference_line_to_event.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class AddReferenceLineToEvent < ActiveRecord::Migration[6.1]
def change
add_column :events, :reference_line, :string
end
end
185 changes: 93 additions & 92 deletions db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 2022_09_05_133117) do
ActiveRecord::Schema.define(version: 2022_11_13_154141) do

create_table "addresses", force: :cascade do |t|
t.string "addressable_type"
Expand Down Expand Up @@ -62,6 +62,7 @@
t.text "comment"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "reference_line"
t.index ["hostel_id"], name: "index_events_on_hostel_id"
end

Expand Down Expand Up @@ -178,7 +179,7 @@
t.string "bic"
t.string "name_account_holder"
t.integer "person_id"
t.integer "sequence_type"
t.integer "sequence_type"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
Expand Down Expand Up @@ -209,107 +210,107 @@

create_view "active_affiliations", sql_definition: <<-SQL
-- Liefert die Liste aller momentan gültigen Gruppenzugehörigkeiten
SELECT group_id, groupable_type, groupable_id
FROM affiliations
WHERE (start IS NULL OR start <= DATETIME('now'))
AND (end IS NULL OR end >= DATETIME('now'))
SELECT group_id, groupable_type, groupable_id
FROM affiliations
WHERE (start IS NULL OR start <= DATETIME('now'))
AND (end IS NULL OR end >= DATETIME('now'))
SQL
create_view "recursive_subgroups", sql_definition: <<-SQL
/* Erzeugt eine SQL-View, welche für jede Gruppe alle hinzugefügten Untergruppen
zurückliefert. Dabei werden auch mehrfach ineinander geschachtelte Gruppen berücksichtigt. */
WITH RECURSIVE
-- Liste der direkt eingetragen Untergruppen
direct_subgroups(group_id, child_id) AS (
SELECT group_id, groupable_id FROM active_affiliations
WHERE groupable_type = 'Group'),
-- Liste aller enthaltenen Untergruppen (auch rekursiv geschachtelt)
recursive_subgroups_relation(group_id, descendant_id) AS (
SELECT id, id FROM groups
UNION
SELECT DISTINCT d.group_id, r.descendant_id
FROM direct_subgroups AS d, recursive_subgroups_relation AS r
WHERE d.child_id = r.group_id)
SELECT * FROM recursive_subgroups_relation
zurückliefert. Dabei werden auch mehrfach ineinander geschachtelte Gruppen berücksichtigt. */
WITH RECURSIVE
-- Liste der direkt eingetragen Untergruppen
direct_subgroups(group_id, child_id) AS (
SELECT group_id, groupable_id FROM active_affiliations
WHERE groupable_type = 'Group'),
-- Liste aller enthaltenen Untergruppen (auch rekursiv geschachtelt)
recursive_subgroups_relation(group_id, descendant_id) AS (
SELECT id, id FROM groups
UNION
SELECT DISTINCT d.group_id, r.descendant_id
FROM direct_subgroups AS d, recursive_subgroups_relation AS r
WHERE d.child_id = r.group_id)
SELECT * FROM recursive_subgroups_relation
SQL
create_view "recursive_members", sql_definition: <<-SQL
/* Erzeugt eine SQL-View, welche für jede Gruppe alle darin enthaltenen Personen zurückliefert.
Dabei werden auch automatisch verwaltete Gruppen sowie rekursive Beziehungen von
verschachtelten Gruppen berücksichtigt */
WITH RECURSIVE
-- Liste der automatisch eingetragenen Gruppenmitglieder
automatic_members(group_id, person_id) AS (
SELECT groups.id, registrations.person_id
FROM groups, registrations
WHERE groups.event_id = registrations.event_id AND
((groups.program = 7 AND registrations.organizer) OR
(groups.program = 8 AND registrations.status IN (1, 2)))
UNION
SELECT groups.id, people.id
FROM groups, people
WHERE (groups.program = 4 AND people.active AND (DATETIME('now') BETWEEN people.joined AND people.member_until)) OR
(groups.program = 5 AND people.active AND (NOT DATETIME('now') BETWEEN people.joined AND people.member_until OR
people.joined IS NULL OR people.member_until IS NULL)) OR
(groups.program = 6 AND people.active AND people.newsletter)),
-- Liste der manuell eingetragenen Gruppenmitglieder
direct_members(group_id, person_id) AS (
SELECT group_id, groupable_id FROM active_affiliations
WHERE groupable_type = 'Person'
UNION
SELECT * FROM automatic_members),
-- Liste aller momentanen Mitgleider einer Gruppe (auch rekursiv durch Untergruppen)
recursive_members_relation(group_id, person_id) AS (
SELECT DISTINCT r.group_id, d.person_id
FROM recursive_subgroups AS r, direct_members AS d
WHERE d.group_id = r.descendant_id)
SELECT * FROM recursive_members_relation
Dabei werden auch automatisch verwaltete Gruppen sowie rekursive Beziehungen von
verschachtelten Gruppen berücksichtigt */
WITH RECURSIVE
-- Liste der automatisch eingetragenen Gruppenmitglieder
automatic_members(group_id, person_id) AS (
SELECT groups.id, registrations.person_id
FROM groups, registrations
WHERE groups.event_id = registrations.event_id AND
((groups.program = 7 AND registrations.organizer) OR
(groups.program = 8 AND registrations.status IN (1, 2)))
UNION
SELECT groups.id, people.id
FROM groups, people
WHERE (groups.program = 4 AND people.active AND (DATETIME('now') BETWEEN people.joined AND people.member_until)) OR
(groups.program = 5 AND people.active AND (NOT DATETIME('now') BETWEEN people.joined AND people.member_until OR
people.joined IS NULL OR people.member_until IS NULL)) OR
(groups.program = 6 AND people.active AND people.newsletter)),
-- Liste der manuell eingetragenen Gruppenmitglieder
direct_members(group_id, person_id) AS (
SELECT group_id, groupable_id FROM active_affiliations
WHERE groupable_type = 'Person'
UNION
SELECT * FROM automatic_members),
-- Liste aller momentanen Mitgleider einer Gruppe (auch rekursiv durch Untergruppen)
recursive_members_relation(group_id, person_id) AS (
SELECT DISTINCT r.group_id, d.person_id
FROM recursive_subgroups AS r, direct_members AS d
WHERE d.group_id = r.descendant_id)
SELECT * FROM recursive_members_relation
SQL
create_view "accounts", sql_definition: <<-SQL
/* Erzeugt eine SQL-View, welche für jede Berechtigunsgruppe
wie Homepage, Gallery eine Liste aller Accounts liefert */
SELECT
groups.title AS group_title,
people.id AS account_id,
people.account_name AS account_name,
people.crypted_password AS crypted_password,
people.email_address AS email_address
FROM recursive_members AS m, groups, people
WHERE m.group_id = groups.id AND m.person_id = people.id
wie Homepage, Gallery eine Liste aller Accounts liefert */
SELECT
groups.title AS group_title,
people.id AS account_id,
people.account_name AS account_name,
people.crypted_password AS crypted_password,
people.email_address AS email_address
FROM recursive_members AS m, groups, people
WHERE m.group_id = groups.id AND m.person_id = people.id
SQL
create_view "all_subscriptions", sql_definition: <<-SQL
/* Erzeugt eine SQL-View, welche für jede Emailverteiler
eine Liste aller eingetragenen Emailadressen mit zugehörigen Rechten liefert.
Dabei werden auch automatische eingetragenen Emailadressen beachtet. */
WITH
-- Sendergruppe einer Mailingliste
senders(mailinglist_id, email_address, first_name, last_name) AS (
SELECT ml.id, p.email_address, p.first_name, p.last_name
FROM recursive_members AS gp, mailinglists AS ml, people AS p
WHERE gp.person_id = p.id AND gp.group_id = ml.sender_group_id),
-- Empfängergruppe einer Mailingliste
receivers(mailinglist_id, email_address, first_name, last_name) AS (
SELECT ml.id, p.email_address, p.first_name, p.last_name
FROM recursive_members AS gp, mailinglists AS ml, people AS p
WHERE gp.person_id = p.id AND gp.group_id = ml.receiver_group_id),
-- Moderatorengruppe einer Mailingliste
moderators(mailinglist_id, email_address, first_name, last_name) AS (
SELECT ml.id, p.email_address, p.first_name, p.last_name
FROM recursive_members AS gp, mailinglists AS ml, people AS p
WHERE gp.person_id = p.id AND gp.group_id = ml.moderator_group_id),
-- Alle über Gruppen automatisch eintragenen Sender, Empfänger und Moderatoren
automatic(mailinglist_id, email_address, first_name, last_name, as_sender, as_receiver, as_moderator) AS (
SELECT mailinglist_id, email_address, first_name, last_name, MAX(as_sender) = 1, MAX(as_receiver) = 1, MAX(as_moderator) = 1 FROM (
SELECT *, 1 AS as_sender, 0 AS as_receiver, 0 AS as_moderator FROM senders UNION
SELECT *, 0 AS as_sender, 1 AS as_receiver, 0 AS as_moderator FROM receivers UNION
SELECT *, 0 AS as_sender, 0 AS as_receiver, 1 AS as_moderator FROM moderators) AS flag_table
GROUP BY mailinglist_id, email_address),
-- Manuelle Änderungen an der Mailingliste
manual(mailinglist_id, email_address, first_name, last_name, as_sender, as_receiver, as_moderator) AS (
SELECT mailinglist_id, email_address, first_name, last_name, as_sender, as_receiver, as_moderator
FROM subscriptions)
SELECT mailinglist_id, email_address, first_name, last_name, as_sender, as_receiver, as_moderator, MAX(m) AS manual
FROM (
SELECT *, TRUE AS m FROM manual UNION
SELECT *, FALSE AS m FROM automatic) AS combination_table
GROUP BY mailinglist_id, email_address
eine Liste aller eingetragenen Emailadressen mit zugehörigen Rechten liefert.
Dabei werden auch automatische eingetragenen Emailadressen beachtet. */
WITH
-- Sendergruppe einer Mailingliste
senders(mailinglist_id, email_address, first_name, last_name) AS (
SELECT ml.id, p.email_address, p.first_name, p.last_name
FROM recursive_members AS gp, mailinglists AS ml, people AS p
WHERE gp.person_id = p.id AND gp.group_id = ml.sender_group_id),
-- Empfängergruppe einer Mailingliste
receivers(mailinglist_id, email_address, first_name, last_name) AS (
SELECT ml.id, p.email_address, p.first_name, p.last_name
FROM recursive_members AS gp, mailinglists AS ml, people AS p
WHERE gp.person_id = p.id AND gp.group_id = ml.receiver_group_id),
-- Moderatorengruppe einer Mailingliste
moderators(mailinglist_id, email_address, first_name, last_name) AS (
SELECT ml.id, p.email_address, p.first_name, p.last_name
FROM recursive_members AS gp, mailinglists AS ml, people AS p
WHERE gp.person_id = p.id AND gp.group_id = ml.moderator_group_id),
-- Alle über Gruppen automatisch eintragenen Sender, Empfänger und Moderatoren
automatic(mailinglist_id, email_address, first_name, last_name, as_sender, as_receiver, as_moderator) AS (
SELECT mailinglist_id, email_address, first_name, last_name, MAX(as_sender) = 1, MAX(as_receiver) = 1, MAX(as_moderator) = 1 FROM (
SELECT *, 1 AS as_sender, 0 AS as_receiver, 0 AS as_moderator FROM senders UNION
SELECT *, 0 AS as_sender, 1 AS as_receiver, 0 AS as_moderator FROM receivers UNION
SELECT *, 0 AS as_sender, 0 AS as_receiver, 1 AS as_moderator FROM moderators) AS flag_table
GROUP BY mailinglist_id, email_address),
-- Manuelle Änderungen an der Mailingliste
manual(mailinglist_id, email_address, first_name, last_name, as_sender, as_receiver, as_moderator) AS (
SELECT mailinglist_id, email_address, first_name, last_name, as_sender, as_receiver, as_moderator
FROM subscriptions)
SELECT mailinglist_id, email_address, first_name, last_name, as_sender, as_receiver, as_moderator, MAX(m) AS manual
FROM (
SELECT *, TRUE AS m FROM manual UNION
SELECT *, FALSE AS m FROM automatic) AS combination_table
GROUP BY mailinglist_id, email_address
SQL
end

0 comments on commit 852af3f

Please sign in to comment.