From f824da8708790a2ff25901b7f43783b0cbd646e3 Mon Sep 17 00:00:00 2001 From: Team3 Date: Wed, 20 May 2026 23:11:39 +0200 Subject: [PATCH] setup --- README.md | 15 ++++++ plugins/additionals | 1 + scripts/install-mitho-stack.sh | 33 ++++++++++++ scripts/seed-mitho.rb | 97 ++++++++++++++++++++++++++++++++++ themes/purplemine2 | 1 + 5 files changed, 147 insertions(+) create mode 160000 plugins/additionals create mode 100755 scripts/install-mitho-stack.sh create mode 100644 scripts/seed-mitho.rb create mode 160000 themes/purplemine2 diff --git a/README.md b/README.md index 0a315d7..2dc5ac5 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,21 @@ docker compose exec redmine bundle exec rails generate redmine_plugin /`. Aktivieren unter *Administration → Settings → Display*. +## mitho-Konfiguration anwenden + +Setzt Branding, Theme (PurpleMine 2), Additionals-Plugin-Settings, Rollen +(`PM`, `Devel`, `Devel2`, `Backoffice`, `Projektkunden`) und Workflow nach +`doc/reference-mitho.md`. + +```bash +# Plugin + Theme klonen + migrieren + restart +bash scripts/install-mitho-stack.sh + +# Settings, Rollen, Workflow (idempotent) +docker compose cp scripts/seed-mitho.rb redmine:/tmp/seed-mitho.rb +docker compose exec redmine bundle exec rails runner -e production /tmp/seed-mitho.rb +``` + ## Logs ```bash diff --git a/plugins/additionals b/plugins/additionals new file mode 160000 index 0000000..b923030 --- /dev/null +++ b/plugins/additionals @@ -0,0 +1 @@ +Subproject commit b923030113fb876e33a8310d526809c323719820 diff --git a/scripts/install-mitho-stack.sh b/scripts/install-mitho-stack.sh new file mode 100755 index 0000000..6df38f2 --- /dev/null +++ b/scripts/install-mitho-stack.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -euo pipefail +cd "$(dirname "$0")/.." + +PLUGIN_DIR=plugins/additionals +THEME_DIR=themes/purplemine2 + +# Additionals (Stable-Branch passend zu Redmine 5.1) +if [ ! -d "$PLUGIN_DIR/.git" ]; then + echo ">> cloning additionals" + git clone --depth 1 --branch 3.4.0 https://github.com/alphanodes/additionals.git "$PLUGIN_DIR" +else + echo ">> additionals already present, skipping clone" +fi + +# PurpleMine 2 Theme +if [ ! -d "$THEME_DIR/.git" ]; then + echo ">> cloning PurpleMine2" + git clone --depth 1 https://github.com/mrliptontea/PurpleMine2.git "$THEME_DIR" +else + echo ">> PurpleMine2 already present, skipping clone" +fi + +echo ">> bundle install in container" +docker compose exec -T redmine bundle install + +echo ">> plugin migrate" +docker compose exec -T redmine bundle exec rake redmine:plugins:migrate RAILS_ENV=production + +echo ">> restart" +docker compose restart redmine + +echo ">> done" diff --git a/scripts/seed-mitho.rb b/scripts/seed-mitho.rb new file mode 100644 index 0000000..9581637 --- /dev/null +++ b/scripts/seed-mitho.rb @@ -0,0 +1,97 @@ +# Wendet die mitho-Konfiguration auf das lokale Redmine an. +# Aufruf: docker compose exec redmine bundle exec rails runner -e production scripts/seed-mitho.rb + +User.current = User.find_by(login: 'admin') + +# --- Core-Settings --- +Setting.app_title = "Servicecenter – mitho®" +Setting.ui_theme = "purplemine2" +Setting.default_language = "de" +Setting.force_default_language_for_anonymous = 1 +Setting.force_default_language_for_loggedin = 1 +Setting.default_projects_modules = %w[issue_tracking wiki news documents files boards] + +# --- Additionals-Plugin-Settings --- +add = Setting.plugin_additionals || {} +add.merge!( + 'account_login_bottom' => 'h2. Willkommen im mitho® Servicecenter!', + 'add_go_to_top' => '1', + 'remove_help' => '1', + 'global_wiki_sidebar' => "Wiki-Seiten sind nur für *mitho* sichtbar!\n\nh3. Seiten\n\n{{child_pages()}}", + 'new_ticket_message' => <<~TXT + h3. Hinweise zur Erstellung eines neuen Tickets + + Bitte beachten Sie, dass wir ein Support-Ticket nur bearbeiten können, + wenn Sie einen entsprechenden Support-Level ausgewählt haben: + + *Support-3* => Eine Reaktion unsererseits erfolgt werktags innerhalb 3h + *Support-6* => Eine Reaktion unsererseits erfolgt werktags innerhalb 6h + *Support-36* => Eine Reaktion unsererseits erfolgt werktags innerhalb 36h + + Die Preise für die angebotenen Support-Level können Sie dem Auswahl-Menü + (Tracker) entnehmen. + TXT +) +Setting.plugin_additionals = add + +# --- Rollen --- +def ensure_role(name, source_name, *adjust) + role = Role.find_by(name: name) + return role if role + + src = Role.find_by(name: source_name) or raise "Quellrolle #{source_name} fehlt" + role = Role.new( + name: name, + assignable: src.assignable, + issues_visibility: src.issues_visibility, + users_visibility: src.users_visibility, + time_entries_visibility: src.time_entries_visibility, + permissions: src.permissions.dup + ) + role.save! + + # Workflow je Tracker kopieren (Status- und Feldberechtigungen) + Tracker.all.each do |t| + WorkflowRule.copy(t, src, t, role) + end + + adjust.each { |fn| fn.call(role) } + role.save! + role +end + +grant = ->(perms) { ->(r) { r.add_permission!(*perms) } } +revoke = ->(perms) { ->(r) { perms.each { |p| r.remove_permission!(p) }; nil } } + +intern_extra = grant.call(%i[ + view_member_box + view_project_activity +]) + +pm = ensure_role('PM', 'Manager', intern_extra) +devel = ensure_role('Devel', 'Entwickler', intern_extra) +devel2 = ensure_role('Devel2', 'Entwickler', intern_extra) +backoffice = ensure_role('Backoffice','Manager', intern_extra, + revoke.call(%i[manage_repository browse_repository view_changesets commit_access manage_related_issues]) +) + +projektkunden = ensure_role('Projektkunden', 'Reporter', + revoke.call(%i[ + view_wiki_pages view_wiki_edits export_wiki_pages edit_wiki_pages rename_wiki_pages + delete_wiki_pages delete_wiki_pages_attachments view_wiki_page_watchers add_wiki_page_watchers + delete_wiki_page_watchers protect_wiki_pages manage_wiki + view_messages add_messages edit_messages edit_own_messages delete_messages delete_own_messages manage_boards + ]) +) + +# --- Workflow: Kunden dürfen Status nur ab "Neu" ändern --- +# Status-Übergänge sind WorkflowTransition. "Nur-lesen" für andere Status = +# alle Transitions löschen, deren Ausgangs-Status nicht "Neu" ist. +new_status = IssueStatus.find_by(name: 'New') || IssueStatus.find_by(name: 'Neu') || IssueStatus.first +removed = WorkflowTransition.where(role_id: projektkunden.id).where.not(old_status_id: new_status.id).delete_all +puts "WorkflowTransitions entfernt (Projektkunden, alte Status != #{new_status.name}): #{removed}" + +puts "OK" +puts "Rollen: #{[pm, devel, devel2, backoffice, projektkunden].map(&:name).join(', ')}" +puts "Theme: #{Setting.ui_theme}" +puts "Titel: #{Setting.app_title}" diff --git a/themes/purplemine2 b/themes/purplemine2 new file mode 160000 index 0000000..27e491e --- /dev/null +++ b/themes/purplemine2 @@ -0,0 +1 @@ +Subproject commit 27e491ee4e3097fe521ad377b659c7894ae51ce5