This commit is contained in:
Team3
2026-05-20 23:11:39 +02:00
parent 1544614160
commit f824da8708
5 changed files with 147 additions and 0 deletions

View File

@@ -37,6 +37,21 @@ docker compose exec redmine bundle exec rails generate redmine_plugin <plugin_na
Themes gehören nach `./themes/<theme_name>/`. 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

1
plugins/additionals Submodule

Submodule plugins/additionals added at b923030113

33
scripts/install-mitho-stack.sh Executable file
View File

@@ -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"

97
scripts/seed-mitho.rb Normal file
View File

@@ -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}"

1
themes/purplemine2 Submodule

Submodule themes/purplemine2 added at 27e491ee4e