Skip to content

Commit

Permalink
Release OpenProject 13.4.1
Browse files Browse the repository at this point in the history
  • Loading branch information
oliverguenther committed Mar 26, 2024
2 parents f8d6a19 + 8fb555b commit 803e8cd
Show file tree
Hide file tree
Showing 420 changed files with 1,930 additions and 1,482 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/crowdin.yml
Expand Up @@ -78,6 +78,9 @@ jobs:
env:
OPENPROJECT_CROWDIN_PROJECT: ${{ secrets.OPENPROJECT_CROWDINV2_PROJECT }}
OPENPROJECT_CROWDIN_API_KEY: ${{ secrets.OPENPROJECT_CROWDINV2_API_KEY }}
- name: "Fix root key in Portuguese crowdin translation files"
run: |
script/i18n/fix_crowdin_pt_language_root_key
- name: "Commit translations"
run: |
git config user.name "OpenProject Actions CI"
Expand Down
56 changes: 48 additions & 8 deletions .github/workflows/docker.yml
Expand Up @@ -21,7 +21,41 @@ env:
REGISTRY_IMAGE: openproject/community

jobs:
extract_version:
runs-on: ubuntu-latest
steps:
- name: Extract version
id: extract_version
run: |
if [[ ${{ github.event_name }} == 'push' ]]; then
TAG_REF=${GITHUB_REF#refs/tags/}
CHECKOUT_REF=$GITHUB_REF
elif [[ ${{ github.event_name }} == 'schedule' ]]; then
TAG_REF=dev
CHECKOUT_REF=refs/heads/dev
elif [[ ${{ github.event_name }} == 'workflow_dispatch' ]]; then
TAG_REF=${{ inputs.tag }}
CHECKOUT_REF=${{ inputs.tag }}
else
echo "Unsupported event"
exit 1
fi
if [ -z "$TAG_REF" ] || [ -z "$CHECKOUT_REF" ]; then
echo "No TAG_REF or CHECKOUT_REF set. Aborting"
exit 1
fi
VERSION=${TAG_REF#v}
echo "Version: $VERSION"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "checkout_ref=$CHECKOUT_REF" >> "$GITHUB_OUTPUT"
outputs:
version: ${{ steps.extract_version.outputs.version }}
checkout_ref: ${{ steps.extract_version.outputs.checkout_ref }}
build:
needs:
- extract_version
if: github.repository == 'opf/openproject'
runs-on: [ self-hosted, aws, ubuntu22, x64, 2XL ]
strategy:
Expand All @@ -48,7 +82,7 @@ jobs:
elif [[ ${{ github.event_name }} == 'workflow_dispatch' ]]; then
TAG_REF=${{ inputs.tag }}
fi
VERSION=${TAG_REF#v}
echo "Version: $VERSION"
echo "::set-output name=version::$VERSION"
Expand Down Expand Up @@ -77,8 +111,13 @@ jobs:
id: meta
uses: docker/metadata-action@v4
with:
context: git
labels: |
io.artifacthub.package.readme-url=https://www.openproject.org/docs/installation-and-operations/installation/docker/
org.opencontainers.image.documentation=https://www.openproject.org/docs/
org.opencontainers.image.vendor=OpenProject GmbH
tags: |
type=semver,pattern={{version}},value=${{ steps.extract_version.outputs.version }}
type=semver,pattern={{version}},value=${{ needs.extract_version.outputs.version }}
images: |
${{ env.REGISTRY_IMAGE }}
- name: Build image
Expand Down Expand Up @@ -139,6 +178,7 @@ jobs:
matrix:
target: [slim, all-in-one]
needs:
- extract_version
- build
steps:
- name: Download digests
Expand All @@ -160,16 +200,16 @@ jobs:
with:
images: ${{ env.REGISTRY_IMAGE }}
labels: |
io.artifacthub.package.readme-url="https://www.openproject.org/docs/installation-and-operations/installation/docker/"
org.opencontainers.image.documentation="https://www.openproject.org/docs/"
org.opencontainers.image.vendor="OpenProject GmbH"
io.artifacthub.package.readme-url=https://www.openproject.org/docs/installation-and-operations/installation/docker/
org.opencontainers.image.documentation=https://www.openproject.org/docs/
org.opencontainers.image.vendor=OpenProject GmbH
flavor: |
latest=false
suffix=${{ steps.set_suffix.outputs.suffix }}
tags: |
type=semver,pattern={{version}},value=${{ steps.extract_version.outputs.version }}
type=semver,pattern={{major}}.{{minor}},value=${{ steps.extract_version.outputs.version }}
type=semver,pattern={{major}},value=${{ steps.extract_version.outputs.version }}
type=semver,pattern={{version}},value=${{ needs.extract_version.outputs.version }}
type=semver,pattern={{major}}.{{minor}},value=${{ needs.extract_version.outputs.version }}
type=semver,pattern={{major}},value=${{ needs.extract_version.outputs.version }}
type=raw,value=dev,priority=200,enable={{is_default_branch}}
- name: Login to Docker Hub
uses: docker/login-action@v2
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test-core.yml
Expand Up @@ -23,7 +23,7 @@ jobs:
all:
name: Units + Features
if: github.repository == 'opf/openproject'
runs-on: runs-on,runner=32cpu-linux,family=m7i+m7a,run-id=${{ github.run_id }}
runs-on: runs-on,runner=32cpu-linux-x64,run-id=${{ github.run_id }}
timeout-minutes: 40
env:
DOCKER_BUILDKIT: 1
Expand Down
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -2,7 +2,7 @@
![GitHub release (latest by date)](https://img.shields.io/github/v/release/opf/openproject)
![GitHub commit activity](https://img.shields.io/github/commit-activity/m/opf/openproject)
![GitHub branch checks state](https://img.shields.io/github/checks-status/opf/openproject/dev)
[![Github Tests](https://github.com/opf/openproject/actions/workflows/test-core.yml/badge.svg?branch=dev)](https://github.com/opf/openproject/actions/workflows/test-core.yml)
[![GitHub Tests](https://github.com/opf/openproject/actions/workflows/test-core.yml/badge.svg?branch=dev)](https://github.com/opf/openproject/actions/workflows/test-core.yml)

OpenProject is a web-based project management software. Its key features are:

Expand Down
1 change: 1 addition & 0 deletions app/helpers/projects_helper.rb
Expand Up @@ -63,6 +63,7 @@ def selected_projects_columns_options
Setting
.enabled_projects_columns
.map { |c| projects_columns_options.find { |o| o[:id].to_s == c } }
.compact
end

def protected_projects_columns_options
Expand Down
4 changes: 4 additions & 0 deletions app/models/queries/projects/selects/custom_field.rb
Expand Up @@ -55,4 +55,8 @@ def custom_field
.visible
.find_by(id: self.class.key.match(attribute)[1])
end

def available?
custom_field.present?
end
end
9 changes: 8 additions & 1 deletion app/models/queries/selects/available_selects.rb
Expand Up @@ -30,7 +30,14 @@ module Queries
module Selects
module AvailableSelects
def select_for(key)
(find_available_select(key) || ::Queries::Selects::NotExistingSelect).new(key.to_sym)
select = (find_available_select(key) || ::Queries::Selects::NotExistingSelect)
.new(key.to_sym)

# It might be that while the class of selects is available, the instantiated select isn't.
# This can e.g. be the case for custom fields that had once been available and have a key that
# leads to them being found by the find_available_select but when instantiated, the custom
# field they refer to is no longer available.
select.available? ? select : ::Queries::Selects::NotExistingSelect.new(key.to_sym)
end

def available_selects
Expand Down
4 changes: 4 additions & 0 deletions app/models/queries/selects/base.rb
Expand Up @@ -55,4 +55,8 @@ def caption
def initialize(attribute)
self.attribute = attribute
end

def available?
true
end
end
Expand Up @@ -48,14 +48,21 @@ def self.instances(_context = nil)
new
end

def self.select_group_by(group_by_statement)
group_by = group_by_statement
group_by = group_by.first if group_by.is_a?(Array)

"#{group_by} id"
end

def self.scoped_column_sum(scope, select, group_by)
scope = scope
.except(:order, :select)

if group_by
scope
.group(group_by)
.select("#{group_by} id", select)
.select(select_group_by(group_by), select)
else
scope
.select(select)
Expand Down
17 changes: 11 additions & 6 deletions app/models/query/results/sums.rb
Expand Up @@ -107,13 +107,18 @@ def sums_callable_joins(grouped)
end

def sums_work_package_scope_selects(grouped)
select = if grouped
["#{query.group_by_statement} id"]
else
[]
end
group_statement =
if grouped
[Queries::WorkPackages::Selects::WorkPackageSelect.select_group_by(query.group_by_statement)]
else
[]
end

group_statement + summed_columns
end

select + query.summed_up_columns.filter_map(&:summable_work_packages_select).map { |c| "SUM(#{c}) #{c}" }
def summed_columns
query.summed_up_columns.filter_map(&:summable_work_packages_select).map { |c| "SUM(#{c}) #{c}" }
end

def callable_summed_up_columns
Expand Down
14 changes: 14 additions & 0 deletions config/constants/settings/definition.rb
Expand Up @@ -742,6 +742,20 @@ class Definition
allowed: (0..),
default: 3
},
httpx_operation_timeout: {
description: '',
format: :float,
writable: false,
allowed: (0..),
default: 10
},
httpx_request_timeout: {
description: '',
format: :float,
writable: false,
allowed: (0..),
default: 10
},
httpx_read_timeout: {
description: '',
format: :float,
Expand Down
10 changes: 5 additions & 5 deletions config/locales/crowdin/cs.yml
Expand Up @@ -1647,7 +1647,7 @@ cs:
disabled_text: "API tokeny nejsou administrátorem povoleny. Pro použití této funkce kontaktujte svého správce."
ical:
title: "iCalendar"
text_hint: 'iCalendar tokens allow users to <a href="%{path}" target="_blank">subscribe to OpenProject calendars</a> and view up-to-date work package information from external clients.'
text_hint: 'Tokeny iCalendar umožňují uživatelům <a href="%{path}" target="_blank">přihlásit se k odběru kalendářů OpenProject</a> a zobrazovat aktuální informace o pracovních balíčcích od externích klientů.'
disabled_text: "iCalendar odběr není administrátorem povolen. Pro použití této funkce kontaktujte svého správce."
empty_text_hint: "Chcete-li přidat token iCalendar, přihlaste se do nového nebo existujícího kalendáře v rámci modulu kalendáře projektu. Musíte mít potřebná oprávnění."
oauth:
Expand Down Expand Up @@ -2907,7 +2907,7 @@ cs:
remaining_quarantined_files_html: >
Antivirová kontrola byla zrušena. %{file_count} zůstává v karanténě. Chcete-li si prohlédnout soubory v karanténě, navštivte tento odkaz: %{link}
remaining_scan_complete_html: >
Remaining files have been scanned. There are %{file_count} in quarantine. You are being redirected to the quarantine page. Use this page to delete or override quarantined files.
Zbývající soubory byly zkontrolovány. V karanténě je %{file_count} . Jste přesměrováni na stránku karantény. Tuto stránku použijte k odstranění nebo přepsání souborů v karanténě.
remaining_rescanned_files: >
Virus byl úspěšně aktivován. Existuje %{file_count} , které byly nahrány dříve a stále je třeba skenovat. Tento proces byl naplánován na pozadí. Soubory zůstanou přístupné během skenování.
upsale:
Expand All @@ -2919,9 +2919,9 @@ cs:
Vyberte akci, která se má provést u souborů, u nichž byl zjištěn virus: <br/>. <ul> <li><strong>%{quarantine_option}</strong>: Umístěte soubor do karantény a zabraňte uživatelům v přístupu k němu. Správci mohou soubory v karanténě kontrolovat a odstraňovat v administraci.</li> <li><strong>%{delete_option}</strong>: Okamžité odstranění souboru.</li> </ul>
modes:
clamav_socket_html: Zadejte soket démona clamd, např. %{example}.
clamav_host_html: Enter the hostname and port to the clamd daemon separated by colon. e.g., %{example}
clamav_host_html: Zadejte název hostitele a port démona clamd oddělený dvojtečkou. např. %{example}
description_html: >
Select the mode in which the antivirus scanner integration should operate. <br/> <ul> <li><strong>%{disabled_option}</strong>: Uploaded files are not scanned for viruses.</li> <li><strong>%{socket_option}</strong>: You have set up ClamAV on the same server as OpenProject and the scan daemon clamd is running in the background</li> <li><strong>%{host_option}</strong>: You are streaming files to an external virus scanning host.</li> </ul>
Vyberte režim, ve kterém by měla fungovat integrace antivirového scanneru. <br/> <ul> <li><strong>%{disabled_option}</strong>: Nahrané soubory nejsou naskenovány pro viry.</li> <li><strong>%{socket_option}</strong>: Nastavili jste ClamAV na stejném serveru jako OpenProject a scan daemon clamd běží na pozadí</li> <li><strong>%{host_option}</strong>: Vysíláte soubory do externího hostitele pro skenování virů.</li> </ul>
brute_force_prevention: "Automatizované blokování uživatelů"
date_format:
first_date_of_week_and_year_set: >
Expand Down Expand Up @@ -3231,7 +3231,7 @@ cs:
text_empty_search_header: "Nenašli jsme žádné odpovídající výsledky."
text_empty_state_description: "Pracovní balíček zatím nebyl s nikým sdílen."
text_empty_state_header: "Není sdíleno"
text_user_limit_reached: "Adding additional users will exceed the current limit. Please contact an administrator to increase the user limit to ensure external users are able to access this work package."
text_user_limit_reached: "Přidáním dalších uživatelů bude aktuální limit překročen. Pro zvýšení limitu uživatelů kontaktujte správce, abyste zajistili přístup externích uživatelů k tomuto pracovnímu balíčku."
text_user_limit_reached_admins: 'Adding additional users will exceed the current limit. Please <a href="%{upgrade_url}">upgrade your plan</a> to be able to add more users.'
warning_user_limit_reached: >
Adding additional users will exceed the current limit. Please contact an administrator to increase the user limit to ensure external users are able to access this work package.
Expand Down
34 changes: 17 additions & 17 deletions config/locales/crowdin/fr.yml
Expand Up @@ -272,8 +272,8 @@ fr:
new:
placeholder: "Nouvelle liste de projets"
delete_modal:
title: "Delete project list"
text: "This action will not delete any project the list contains. Are you sure you want to delete this project list?"
title: "Supprimer la liste des projets"
text: "Cette action ne supprimera aucun projet contenu dans la liste. Voulez-vous vraiment supprimer cette liste de projets ?"
settings:
change_identifier: Changer l'identifiant
activities:
Expand All @@ -296,7 +296,7 @@ fr:
storage:
no_results_title_text: Il n'y a pas d'espace disque supplémentaire utilisé par ce projet.
lists:
can_be_saved_as: "The modifications can only be saved in a new list."
can_be_saved_as: "Les modifications ne peuvent être enregistrées que dans une nouvelle liste."
members:
index:
no_results_title_text: Aucun membre dans ce projet pour le moment.
Expand Down Expand Up @@ -848,8 +848,8 @@ fr:
forbidden: "Les horodatages contiennent des valeurs interdites : %{values}"
format: "%{message}"
selects:
name_not_included: "The 'Name' column needs to be included"
nonexistent: "The column '%{column}' does not exist."
name_not_included: "La colonne 'Nom' doit être incluse"
nonexistent: "La colonne '%{column}' n'existe pas."
format: "%{message}"
group_by_hierarchies_exclusive: "est mutuellement exclusif avec grouper par '%{group_by}'. Vous ne pouvez pas activer les deux."
filters:
Expand Down Expand Up @@ -1203,7 +1203,7 @@ fr:
button_reset: "Réinitialiser"
button_rollback: "Revenir à cette version"
button_save: "Enregistrer"
button_save_as: "Save as"
button_save_as: "Enregistrer sous"
button_apply_changes: "Appliquer les modifications"
button_save_back: "Enregistrer et revenir"
button_show: "Afficher"
Expand Down Expand Up @@ -1788,7 +1788,7 @@ fr:
label_diff_side_by_side: "côte à côte"
label_digital_accessibility: "Accessibilité numérique (DE)"
label_disabled: "désactivé"
label_disabled_uppercase: "Disabled"
label_disabled_uppercase: "Désactivé"
label_display: "Affichage"
label_display_per_page: "Par page: %{value}"
label_display_used_statuses_only: "Afficher uniquement les status utilisés par ce type"
Expand Down Expand Up @@ -2016,7 +2016,7 @@ fr:
label_precedes: "précède"
label_preferences: "Préférences"
label_preview: "Aperçu"
label_preview_not_available: "(Preview not available)"
label_preview_not_available: "(Aperçu indisponible)"
label_previous: "Précédent"
label_previous_week: "Semaine précédente"
label_principal_invite_via_email: " ou inviter de nouveaux utilisateurs par courriel"
Expand Down Expand Up @@ -2603,7 +2603,7 @@ fr:
name_or_identifier: "Nom ou identifiant"
only_subproject_id: "Seulement le sous-projet"
shared_with_user: "Partagée avec l'utilisateur"
shared_with_me: "Shared with me"
shared_with_me: "Partagés avec moi"
subproject_id: "Inclure le sous-projet"
repositories:
at_identifier: "%{identifier}"
Expand Down Expand Up @@ -2754,7 +2754,7 @@ fr:
setting_brute_force_block_minutes: "Temps de bloquage de l'utilisateur"
setting_cache_formatted_text: "Mettre le texte formaté en mémoire cache"
setting_use_wysiwyg_description: "Sélectionnez cette option pour activer l’éditeur CKEditor5 WYSIWYG pour tous les utilisateurs par défaut. CKEditor a des fonctionnalités limitées pour GFM Markdown."
setting_column_options: "Default work package lists columns"
setting_column_options: "Colonnes de listes du lot de travaux par défaut"
setting_commit_fix_keywords: "Réparer les mots clés"
setting_commit_logs_encoding: "Encoding of the Commit messages"
setting_commit_logtime_activity_id: "Activité pour les « Logged Time »"
Expand All @@ -2776,7 +2776,7 @@ fr:
setting_emails_header: "En-tête des courriels"
setting_email_login: "Utiliser l'adresse courriel comme login"
setting_enabled_scm: "Permettre SCM"
setting_enabled_projects_columns: "Columns in a projects list displayed by default"
setting_enabled_projects_columns: "Colonnes d'une liste de projets affichées par défaut"
setting_feeds_enabled: "Permettre les flux"
setting_ical_enabled: "Activer les abonnements iCalendar"
setting_feeds_limit: "Limite du contenu du flux"
Expand Down Expand Up @@ -2852,7 +2852,7 @@ fr:
remaining_scan_complete_html: >
Les fichiers restants ont été analysés. Il y a %{file_count} en quarantaine. Vous allez être redirigé vers la page de quarantaine. Utilisez cette page pour supprimer ou remplacer les fichiers en quarantaine.
remaining_rescanned_files: >
Virus scanning has been enabled successfuly. There are %{file_count} that were uploaded previously and still need to be scanned. This process has been scheduled in the background. The files will remain accessible during the scan.
L'analyse antivirus a été activée avec succès. %{file_count} fichiers ont été téléchargés précédemment et doivent encore être analysés. Ce processus a été planifié en arrière-plan. Les fichiers resteront accessibles pendant l'analyse.
upsale:
description: "Assurez-vous que les fichiers téléversés dans OpenProject sont analysés pour détecter les virus avant d'être accessibles aux autres utilisateurs."
actions:
Expand Down Expand Up @@ -2894,7 +2894,7 @@ fr:
projects:
missing_dependencies: "Le module de projet %{module} a été vérifié et dépend de %{dependencies}. Vous devez également vérifier ces dépendances."
section_new_projects: "Paramètres pour les nouveaux projets"
section_project_overview: "Settings for project lists"
section_project_overview: "Paramètres pour les listes de projets"
session: "Session"
user:
default_preferences: "Préférences par défaut"
Expand Down Expand Up @@ -3060,11 +3060,11 @@ fr:
queries:
apply_filter: Appliquer le filtre pré-configuré
configure_view:
heading: Configure view
heading: Configurer la vue
columns:
input_label: "Add columns"
input_placeholder: "Select a column"
drag_area_label: "Manage and reorder columns"
input_label: "Ajouter des colonnes"
input_placeholder: "Sélectionner une colonne"
drag_area_label: "Gérer et réorganiser les colonnes"
top_menu:
additional_resources: "Ressources supplémentaires"
getting_started: "Pour commencer"
Expand Down

0 comments on commit 803e8cd

Please sign in to comment.