From 852af3ff8c3e39018e0128894c35cecbe569e85e Mon Sep 17 00:00:00 2001 From: Nicholas Schwab Date: Sun, 13 Nov 2022 17:08:07 +0100 Subject: [PATCH] Make reference line editable. This is needed since the title is a bad default for some events. --- app/assets/stylesheets/events.css | 8 +- app/models/event.rb | 12 +- app/views/events/_form.html.erb | 4 + ...21113154141_add_reference_line_to_event.rb | 5 + db/schema.rb | 185 +++++++++--------- 5 files changed, 117 insertions(+), 97 deletions(-) create mode 100644 db/migrate/20221113154141_add_reference_line_to_event.rb diff --git a/app/assets/stylesheets/events.css b/app/assets/stylesheets/events.css index 08eb310..24fa471 100644 --- a/app/assets/stylesheets/events.css +++ b/app/assets/stylesheets/events.css @@ -15,7 +15,7 @@ #event_registrations ul { list-style-type: none; padding-left: 0em; - columns: 3 12em;} + columns: 3 12em; } #events .overview dl { @@ -31,3 +31,9 @@ max-width: 15em; word-wrap: break-word; } + +.aligned > .hint { + margin-top: -0.5em; + grid-column: span 2; + text-align: right; +} \ No newline at end of file diff --git a/app/models/event.rb b/app/models/event.rb index 1130516..d1e5d0c 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -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) @@ -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 diff --git a/app/views/events/_form.html.erb b/app/views/events/_form.html.erb index fa59078..6b95512 100644 --- a/app/views/events/_form.html.erb +++ b/app/views/events/_form.html.erb @@ -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 %> + Sollte die Jahreszahl zweistellig enthalten. + <%= form.label :comment %> <%= form.text_area :comment, id: :event_comment, style: 'display: block' %> diff --git a/db/migrate/20221113154141_add_reference_line_to_event.rb b/db/migrate/20221113154141_add_reference_line_to_event.rb new file mode 100644 index 0000000..67d0ede --- /dev/null +++ b/db/migrate/20221113154141_add_reference_line_to_event.rb @@ -0,0 +1,5 @@ +class AddReferenceLineToEvent < ActiveRecord::Migration[6.1] + def change + add_column :events, :reference_line, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index b63dcad..bc2f589 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -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" @@ -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 @@ -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 @@ -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