Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ROLES: explizites Start- und Enddatum #2775

Comments

@daniel-illi
Copy link
Contributor

daniel-illi commented Aug 19, 2024

Rollen können eine beschränkte Gültigkeitsdauer haben.
Bisher wurden created_at und deleted_at dafür missbraucht, die Gültigkeit einer Rolle abzubilden.
Neu soll auf der Rolle ein optionales Startdatum start_on und Enddatum end_on hinterlegt sein.
Dies vereinfacht das Handling von zukünftigen Rollen sowie von Rollen mit vordefiniertem Ablaufdatum.

Um möglichst Kompatibel mit bestehendem Code zu bleiben, soll ein neuer default_scope definiert werden, welche analog dem bisherigen default scope von paranoia nur die aktuell gültigen Rollen enthält.

Die alten timestamps deleted_at, delete_on sowie convert_on werden nicht mehr benötigt und die entsprechenden Spalten sollen entfernt werden. Ebenso wird die Rollenklasse FutureRole nicht mehr benötigt und wird gelöscht.

Auf Role gibt es after_create und after_destroy callbacks, welche die Attribute Person#primary_group_id und Person#contact_data_visible setzen. Diese Mutationen sollen nur durch die Callbacks durchgeführt werden, wenn die bearbeitete Rolle aktuell aktiv ist.
Die Mutationen müssen ebenfalls durchgeführt werden, nachdem eine Rolle aktiv wird (start_on erreicht) und wenn sie abläuft (end_on überschritten). Dazu wird ein Hintergrundjob implementiert, welcher für die Personen aller aktiv gewordenen und abgelaufenen Rollen seit dem letzten Job run die Mutationen durchführt.

Tech-Spec

Siehe auch Draft PRs #2763 , hitobito/hitobito_sac_cas#850

  • Migrationen erstellen:

    • Spalten hinzufügen:
      change_table :roles, bulk: true do |t|
        t.date :start_on
        t.date :end_on
      end
    • Timestamps migrieren: (separate Migration verwenden, mysql unterstützt keine Transaktionen bei Schemaänderungen!)
      execute <<~SQL
        UPDATE roles
        SET
          start_on = created_at,
          end_on = COALESCE(deleted_at, delete_on)
      SQL
    • alte Spalten löschen:
      change_table :roles, bulk: true do |t|
        t.remove :deleted_at, type: :datetime
        t.remove :delete_on, type: :date
        t.remove :convert_on, type: :date
        t.remove :convert_to, type: :string
      end
  • Role anpassen

    • acts_as_paranoid entfernen
    • Validierungen von created_at, delete_on entfernen
    • Valideren dass end_on >= start_on ist falls beide gesetzt sind
    • Scopes implementieren:
      • active:
        scope :active, ->(date = Date.current) {
          where("start_on <= :date OR start_on IS NULL AND end_on >= :date OR end_on IS NULL", date:)
        }
      • default scope:
        default_scope` { active }
      • with_inactive: da der default scope mit start_on/end_on filtert, müssen diese attrs unscoped werden:
        scope :with_inactive, -> { unscope(where: [:start_on, :end_on]) }
      • inactive: anpassen dass statt dem deleted_at von paranoia die neuen attrs verwendet werden:
        scope :inactive, -> {
          with_inactive.where(
            "archived_at <= :now OR start_on > :today OR end_on < :today",
            now: Time.current.utc,
            today: Date.current
          )
        }
      • ended, future:
        scope :ended, -> { with_inactive.where("end_on < :today", today: Date.current) }
        scope :future, -> { with_inactive.where("start_on > :today", today: Date.current) }
    • #destroy: bisheriges Verhalten anpassen:
      • wo vorher "soft-destroy" verwendet wurde, soll neu das end_on auf gestern gesetzt werden, ausser end_on ist bereits auf ein vergangenes Datum gesetzt
      • wo vorher #really_destroy! zum Zuge kam, soll neu ein reguläres active record #destroy verwendet werden (da Role nicht mehr "paranoid" ist)
      • destroy callbacks sollen auch ausgeführt werden, wenn end_on gesetzt wird statt löschen
    • #really_destroy!(**) implementieren: #destroy auf super aufrufen.
      (diese Methode wird aufgerufen, wenn Group#really_destroy aufgerufen wird wegen der Option dependent: :destroy auf der Relation)
    • accessors entfernen
      • #start_on
      • #end_on
      • #outdated?
      • #paranoia_destroy_attributes
    • def ended? = end_on? && end_on < Date.current
    • #archive!
  • SAC Wagon
    Siehe auch Draft PR DRAFT: explicit validity period hitobito_sac_cas#850

    • auf Group::SektionsMitglieder::Mitglied und MitgliedZusatzsektion Validierung von delete_on entfernen
    • SacCas::Role::MitgliedCommon
      • Validierung von created_at entfernen
      • Presence Validierung für start_on, end_on
    • SacCas::Role::ClassMethods#select_with_membership_years anpassen
    • weitere Referenzen an angepasste scopes/Attribute/Methoden anpassen
  • SBV Wagon:

    • hitobito_sbv/lib/tasks/reactivate.rake: wird diese Funktion noch benötigt? Anpassen oder löschen
  • Andere Wagons anpassen

    • Alle anderen Wagons kontrollieren und calls auf die angepassten Role Methoden kontrollieren, anpassen.
      z.B. auf Github die Organisation hitobito durchsuchen nach delete_on, convert_on, convert_to, FutureRole
  • Role lifecycle callbacks auch als Job #2788

ToDo

  • Specs schreiben
  • Mit angemessener Rolle "durchklicken"
@richardjubla
Copy link
Contributor

Wir haben in unserem Wagon noch hitobito/hitobito_jubla#60 offen.

@daniel-illi
Copy link
Contributor Author

@richardjubla merci für den Hinweis. Ich habs im PR entsprechend kommentiert 👍

@richardjubla
Copy link
Contributor

@richardjubla merci für den Hinweis. Ich habs im PR entsprechend kommentiert 👍

Danke, bin froh habe ich hier den Zusammenhang korrekt gesehen.

@amaierhofer amaierhofer linked a pull request Aug 28, 2024 that will close this issue
@amaierhofer amaierhofer linked a pull request Sep 3, 2024 that will close this issue
@amaierhofer amaierhofer self-assigned this Sep 3, 2024
daniel-illi added a commit to hitobito/hitobito_youth that referenced this issue Oct 15, 2024
daniel-illi added a commit to hitobito/hitobito_youth that referenced this issue Oct 15, 2024
@daniel-illi daniel-illi reopened this Oct 15, 2024
daniel-illi added a commit to hitobito/hitobito_youth that referenced this issue Oct 15, 2024
daniel-illi added a commit to hitobito/hitobito_youth that referenced this issue Oct 15, 2024
daniel-illi added a commit to hitobito/hitobito_youth that referenced this issue Oct 15, 2024
amaierhofer pushed a commit to hitobito/hitobito_youth that referenced this issue Nov 15, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment