Release OpenProject 11.0.4

pull/8872/head v11.0.4
ulferts 4 years ago
commit da7175d514
No known key found for this signature in database
GPG Key ID: A205708DE1284017
  1. 4
      .pkgr.yml
  2. 2
      Gemfile
  3. 2
      Gemfile.lock
  4. 10
      app/controllers/admin_controller.rb
  5. 33
      app/models/work_package/pdf_export/attachments.rb
  6. 109
      app/models/work_package/pdf_export/work_package_list_to_pdf.rb
  7. 10
      app/workers/work_packages/exports/export_job.rb
  8. 2
      config/locales/crowdin/ar.yml
  9. 2
      config/locales/crowdin/bg.yml
  10. 2
      config/locales/crowdin/ca.yml
  11. 62
      config/locales/crowdin/cs.yml
  12. 2
      config/locales/crowdin/da.yml
  13. 24
      config/locales/crowdin/de.yml
  14. 2
      config/locales/crowdin/el.yml
  15. 2
      config/locales/crowdin/es.yml
  16. 2
      config/locales/crowdin/fi.yml
  17. 2
      config/locales/crowdin/fil.yml
  18. 4
      config/locales/crowdin/fr.yml
  19. 2
      config/locales/crowdin/hr.yml
  20. 2
      config/locales/crowdin/hu.yml
  21. 2
      config/locales/crowdin/id.yml
  22. 2
      config/locales/crowdin/it.yml
  23. 2
      config/locales/crowdin/ja.yml
  24. 6
      config/locales/crowdin/js-de.yml
  25. 10
      config/locales/crowdin/js-sv.yml
  26. 6
      config/locales/crowdin/ko.yml
  27. 4
      config/locales/crowdin/lt.yml
  28. 2
      config/locales/crowdin/nl.yml
  29. 2
      config/locales/crowdin/no.yml
  30. 2
      config/locales/crowdin/pl.yml
  31. 4
      config/locales/crowdin/pt.yml
  32. 4
      config/locales/crowdin/ro.yml
  33. 2
      config/locales/crowdin/ru.yml
  34. 2
      config/locales/crowdin/sk.yml
  35. 2
      config/locales/crowdin/sl.yml
  36. 16
      config/locales/crowdin/sv.yml
  37. 2
      config/locales/crowdin/tr.yml
  38. 2
      config/locales/crowdin/uk.yml
  39. 2
      config/locales/crowdin/vi.yml
  40. 2
      config/locales/crowdin/zh-CN.yml
  41. 2
      config/locales/crowdin/zh-TW.yml
  42. 3
      config/locales/en.yml
  43. 40
      db/migrate/20201125121949_remove_renamed_cron_job.rb
  44. 3
      docker/setup/preinstall-common.sh
  45. 4
      docs/development/create-openproject-plugin/README.md
  46. 4
      docs/development/security/README.md
  47. 4
      docs/getting-started/my-account/README.md
  48. 3
      docs/getting-started/sign-in-registration/README.md
  49. 3
      docs/installation-and-operations/installation/manual/README.md
  50. 2
      docs/installation-and-operations/misc/custom-openid-connect-providers/README.md
  51. 2
      docs/installation-and-operations/operation/faq/README.md
  52. 28
      docs/release-notes/11-0-4/README.md
  53. 4
      docs/release-notes/8-0-0/README.md
  54. 7
      docs/release-notes/README.md
  55. 7
      docs/system-admin-guide/authentication/ldap-authentication/ldap-group-synchronization/README.md
  56. 18
      docs/system-admin-guide/enumerations/README.md
  57. 1
      docs/system-admin-guide/manage-work-packages/work-package-status/README.md
  58. 3
      docs/system-admin-guide/system-settings/display-settings/README.md
  59. 8
      docs/user-guide/budgets/README.md
  60. 4
      docs/user-guide/integrations/README.md
  61. 3
      docs/user-guide/meetings/README.md
  62. 10
      docs/user-guide/projects/project-settings/activities-time-tracking/README.md
  63. 7
      docs/user-guide/work-packages/README.md
  64. 9
      docs/user-guide/work-packages/edit-work-package/README.md
  65. BIN
      docs/user-guide/work-packages/edit-work-package/image-20201119163714831.png
  66. 24
      docs/user-guide/work-packages/work-package-table-configuration/README.md
  67. 3
      frontend/src/app/modules/backlogs/backlogs-page/styles/taskboard.sass
  68. 2
      lib/open_project/version.rb
  69. 4
      modules/avatars/config/locales/crowdin/js-ro.yml
  70. 2
      modules/backlogs/config/locales/crowdin/de.yml
  71. 6
      modules/bim/config/locales/crowdin/js-fi.yml
  72. 2
      modules/bim/spec/support/pages/ifc_models/index.rb
  73. 2
      modules/boards/config/locales/crowdin/js-ko.yml
  74. 2
      modules/boards/config/locales/crowdin/tr.yml
  75. 7
      modules/budgets/app/controllers/budgets_controller.rb
  76. 54
      modules/budgets/app/models/budget.rb
  77. 89
      modules/budgets/spec/features/budgets/copy_budget_spec.rb
  78. 9
      modules/budgets/spec/support/pages/budget_form.rb
  79. 6
      modules/budgets/spec/support/pages/edit_budget.rb
  80. 4
      modules/costs/config/locales/crowdin/cs.yml
  81. 2
      modules/meeting/app/controllers/meeting_contents_controller.rb
  82. 2
      modules/meeting/config/locales/crowdin/de.yml
  83. 1
      modules/overviews/config/locales/crowdin/ar.yml
  84. 1
      modules/overviews/config/locales/crowdin/bg.yml
  85. 1
      modules/overviews/config/locales/crowdin/ca.yml
  86. 1
      modules/overviews/config/locales/crowdin/cs.yml
  87. 1
      modules/overviews/config/locales/crowdin/da.yml
  88. 1
      modules/overviews/config/locales/crowdin/de.yml
  89. 1
      modules/overviews/config/locales/crowdin/el.yml
  90. 1
      modules/overviews/config/locales/crowdin/es.yml
  91. 1
      modules/overviews/config/locales/crowdin/fi.yml
  92. 1
      modules/overviews/config/locales/crowdin/fil.yml
  93. 1
      modules/overviews/config/locales/crowdin/fr.yml
  94. 1
      modules/overviews/config/locales/crowdin/hr.yml
  95. 1
      modules/overviews/config/locales/crowdin/hu.yml
  96. 1
      modules/overviews/config/locales/crowdin/id.yml
  97. 1
      modules/overviews/config/locales/crowdin/it.yml
  98. 1
      modules/overviews/config/locales/crowdin/ja.yml
  99. 1
      modules/overviews/config/locales/crowdin/ko.yml
  100. 1
      modules/overviews/config/locales/crowdin/lt.yml
  101. Some files were not shown because too many files have changed in this diff Show More

@ -10,6 +10,7 @@ targets:
- unrtf
- tesseract-ocr
- catdoc
- imagemagick
debian-10:
<<: *debian9
ubuntu-16.04:
@ -22,12 +23,15 @@ targets:
dependencies:
- unzip
- epel-release
- ImageMagick
centos-7:
dependencies:
- epel-release
- ImageMagick
sles-12:
build_dependencies:
- sqlite3-devel
- ImageMagick
before_precompile: "packaging/setup"
after_precompile: "packaging/teardown"
services:

@ -187,6 +187,8 @@ gem 'rest-client', '~> 2.0'
gem 'ruby-progressbar', '~> 1.10.0', require: false
gem 'mini_magick', '~> 4.11.0', require: false
group :test do
gem 'launchy', '~> 2.5.0'
gem 'rack-test', '~> 1.1.0'

@ -617,6 +617,7 @@ GEM
mime-types-data (~> 3.2015)
mime-types-data (3.2020.0512)
mimemagic (0.3.5)
mini_magick (4.11.0)
mini_mime (1.0.2)
mini_portile2 (2.4.0)
minisyntax (0.2.5)
@ -1027,6 +1028,7 @@ DEPENDENCIES
livingstyleguide (~> 2.1.0)
lograge (~> 0.11.0)
meta-tags (~> 2.13.0)
mini_magick (~> 4.11.0)
multi_json (~> 1.15.0)
my_page!
net-ldap (~> 0.16.0)

@ -26,6 +26,7 @@
#
# See docs/COPYRIGHT.rdoc for more details.
#++
require 'open3'
class AdminController < ApplicationController
layout 'admin'
@ -84,6 +85,7 @@ class AdminController < ApplicationController
@checklist += file_storage_checks
@checklist += plaintext_extraction_checks
@checklist += admin_information_hook_checks
@checklist += image_conversion_checks
@storage_information = OpenProject::Storage.mount_information
end
@ -118,6 +120,14 @@ class AdminController < ApplicationController
end
end
def image_conversion_checks
[[:'image_conversion.imagemagick', image_conversion_libs_available?]]
end
def image_conversion_libs_available?
Open3.capture2e('convert', '-version').first.include?('ImageMagick')
end
def file_storage_checks
# Add local directory test if we're not using fog
if OpenProject::Configuration.file_storage?

@ -50,14 +50,45 @@ module WorkPackage::PDFExport::Attachments
# Access the local file. For Carrierwave attachments, this will be blocking.
file_path = attachment.file.local_file.path
# Let's not include the raw images as the sum of all images can hit the memory limit of the worker process.
# As we do not need the full image size when printing small images into the PDF let's reduce it on the fly.
# It uses CPU and time. However, we don't expect that feature to get used often.
resized_file_path = resize_image(file_path)
# Fit the image roughly in the center of each cell
pdf.make_cell(image: file_path, fit: [available_width, 125], position: :center)
pdf.make_cell(image: resized_file_path, fit: [available_width, 125], position: :center)
rescue => e
Rails.logger.error { "Failed to attach work package image to PDF: #{e} #{e.message}" }
nil
end
def resize_image(file_path)
resized_file_path = extend_file_name_in_path(file_path, '__x325')
image = MiniMagick::Image.open(file_path)
image.resize("x325")
image.write(resized_file_path)
@resized_image_paths << resized_file_path
resized_file_path
end
def extend_file_name_in_path(file_path, name_suffix)
dir_path = File.dirname(file_path)
file_extension = File.extname(file_path)
file_name = File.basename(file_path, '.*')
File.join(dir_path, "#{file_name}#{name_suffix}#{file_extension}")
end
def pdf_embeddable?(attachment)
%w[image/jpeg image/png].include?(attachment.content_type)
end
def delete_all_resized_images
@resized_image_paths.each do |file_path|
File.delete(file_path)
end
end
end

@ -28,6 +28,20 @@
# See docs/COPYRIGHT.rdoc for more details.
#++
# Exporter for work package table.
#
# It can optionally export a work package with
# - description, or with
# - attached images, or with
# - description and attached images.
#
# When exporting with attached images then the memory consumption can quickly
# grow beyond limits. Therefore we create multiple smaller PDFs that we finally
# merge do one file.
require 'mini_magick'
require 'open3'
class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exporter::Base
include WorkPackage::PDFExport::Common
include WorkPackage::PDFExport::Attachments
@ -35,26 +49,29 @@ class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exporter::Base
attr_accessor :pdf,
:options
WORK_PACKAGES_PER_BATCH = 100
def initialize(object, options = {})
super
@cell_padding = options.delete(:cell_padding)
self.pdf = get_pdf(current_language)
configure_page_size
configure_markup
@total_wp_count = query.results.work_package_count
@batches_count = @total_wp_count.fdiv(WORK_PACKAGES_PER_BATCH).ceil
@batch_files = []
@page_count = -1
end
def configure_page_size
pdf.options[:page_size] = 'EXECUTIVE'
pdf.options[:page_layout] = :landscape
def render!
(1..@batches_count).each do |batch_index|
run_batch!(batch_index)
end
def render!
write_content!
@merged_pdf_file = merge_pdfs
success(pdf.render)
delete_tmp_files
success(@merged_pdf_file)
rescue Prawn::Errors::CannotFit
error(I18n.t(:error_pdf_export_too_many_columns))
rescue StandardError => e
@ -62,12 +79,57 @@ class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exporter::Base
error(I18n.t(:error_pdf_failed_to_export, error: e.message))
end
def write_content!
private
def on_first_batch(batch_index)
return unless batch_index == 1
write_title!
write_headers!
write_work_packages!
end
def delete_tmp_files
@batch_files.each(&:delete)
end
def configure_page_size
pdf.options[:page_size] = 'EXECUTIVE'
pdf.options[:page_layout] = :landscape
end
def merge_pdfs
merged_pdf = Tempfile.new
# We use the command line tool "pdfunite" for concatenating the PDFs.
# That tool comes with the system package "poppler-utils" which we
# fortunately already have installed for text extraction purposes.
Open3.capture2e("pdfunite", *@batch_files.map(&:path), merged_pdf.path)
merged_pdf
end
def run_batch!(batch_index)
initialize_batch_page
batch_file = render_batch!(batch_index)
@page_count += pdf.page_count
batch_file.close
@batch_files << batch_file
end
def render_batch!(batch_index)
@resized_image_paths = []
on_first_batch(batch_index)
write_work_packages!(batch_index)
write_footers!
batch_file = Tempfile.new("pdf_batch_#{batch_index}")
pdf.render_file(batch_file.path)
delete_all_resized_images
batch_file
end
def project
@ -96,11 +158,13 @@ class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exporter::Base
end
def write_footers!
@page_count += 1
pdf.number_pages format_date(Date.today),
at: [pdf.bounds.left, 0],
style: :italic
pdf.number_pages "<page>/<total>",
pdf.number_pages "<page>",
start_count_at: @page_count,
at: [pdf.bounds.right - 25, 0],
style: :italic
end
@ -138,11 +202,11 @@ class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exporter::Base
end
end
def write_work_packages!
def write_work_packages!(batch_index)
pdf.font style: :normal, size: 8
previous_group = nil
work_packages.each do |work_package|
work_packages_batch(batch_index).each do |work_package|
previous_group = write_group_header!(work_package, previous_group)
write_attributes!(work_package)
@ -157,6 +221,14 @@ class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exporter::Base
end
end
def work_packages_batch(batch_index)
query
.results
.work_packages
.page(batch_index)
.per_page(WORK_PACKAGES_PER_BATCH)
end
def write_attributes!(work_package)
values = valid_export_columns.map do |column|
make_column_value work_package, column
@ -218,4 +290,11 @@ class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exporter::Base
pdf.make_cell values.map(&:formatted_value).join(', '),
padding: cell_padding
end
def initialize_batch_page
self.pdf = get_pdf(current_language)
configure_page_size
configure_markup
end
end

@ -33,12 +33,22 @@ module WorkPackages
raise export_result.message
elsif export_result.content.is_a? File
store_attachment(export, export_result.content)
elsif export_result.content.is_a? Tempfile
store_from_tempfile(export, export_result)
else
store_from_string(export, export_result)
end
end
end
def store_from_tempfile(export, export_result)
renamed_file_path = File.join(File.dirname(export_result.content.path), export_result.title)
File.rename(export_result.content.path, renamed_file_path)
file = File.open(renamed_file_path)
store_attachment(export, file)
file.close
end
def schedule_cleanup
::WorkPackages::Exports::CleanupOutdatedJob.perform_after_grace
end

@ -1262,6 +1262,8 @@ ar:
blog: "مدونة أوبِن بروجِكت"
forums: "منتدى المجتمع"
newsletter: "Security alerts / Newsletter"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -1198,6 +1198,8 @@ bg:
blog: "OpenProject блог"
forums: "Форум на Общността"
newsletter: "Security alerts / Newsletter"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -1198,6 +1198,8 @@ ca:
blog: "Blog OpenProject"
forums: "Fòrum de la comunitat"
newsletter: "Security alerts / Newsletter"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -28,10 +28,10 @@ cs:
plugins:
no_results_title_text: V současné době nejsou k dispozici žádné pluginy.
custom_styles:
color_theme: "Color theme"
color_theme: "Barevné téma"
color_theme_custom: "Vlastní"
colors:
alternative-color: "Alternative"
alternative-color: "Alternativa"
content-link-color: "Link font"
primary-color: "Primární"
primary-color-dark: "Primární (tmavé)"
@ -39,20 +39,20 @@ cs:
header-item-bg-hover-color: "Pozadí záhlaví při přejetí myší"
header-item-font-color: "Písmo záhlaví"
header-item-font-hover-color: "Písmo záhlaví při přejetí myší"
header-border-bottom-color: "Header border"
main-menu-bg-color: "Main menu background"
main-menu-bg-selected-background: "Main menu when selected"
main-menu-bg-hover-background: "Main menu on hover"
main-menu-font-color: "Main menu font"
main-menu-selected-font-color: "Main menu font when selected"
main-menu-hover-font-color: "Main menu font on hover"
main-menu-border-color: "Main menu border"
header-border-bottom-color: "Okraj záhlaví"
main-menu-bg-color: "Pozadí hlavního menu"
main-menu-bg-selected-background: "Hlavní menu při výběru"
main-menu-bg-hover-background: "Hlavní menu při přejetí myší"
main-menu-font-color: "Písmo hlavního menu"
main-menu-selected-font-color: "Písmo hlavního menu při výběru"
main-menu-hover-font-color: "Písmo hlavního menu při přejetí myší"
main-menu-border-color: "Okraj hlavního menu"
custom_colors: "Vlastní barvy"
customize: "Přizpůsobte si svou OpenProject instalaci vlastním logem. Poznámka: Logo bude veřejně přístupné."
enterprise_notice: "Jako zvláštní 'Děkujeme!' za jejich finanční příspěvky na vývoj OpenProjektu, je tato malá funkce dostupná pouze pro podporu Enterprise Edition."
manage_colors: "Upravit možnosti výběru barvy"
instructions:
alternative-color: "Strong accent color, typically used for the most important button on a screen."
alternative-color: "Silná barva zvýraznění, obvykle používaná pro nejdůležitější tlačítko na obrazovce."
content-link-color: "Barva písma většiny odkazů."
primary-color: "Hlavní barva."
primary-color-dark: "Obvykle tmavší verze hlavní barvy použité pro efekt vznášení."
@ -61,7 +61,7 @@ cs:
header-item-font-hover-color: "Barva pozadí klikacích položek záhlaví při najetí myší."
header-border-bottom-color: "Tenký řádek pod záhlavím. Ponechte toto pole prázdné, pokud nechcete žádný řádek."
main-menu-bg-color: "Barva pozadí levého menu."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
theme_warning: Změna motivu přepíše váš vlastní styl. Vzhled pak bude ztracen. Jste si jisti, že chcete pokračovat?
enterprise:
upgrade_to_ee: "Upgrade to the Enterprise Edition"
add_token: "Nahrát podpůrný token Enterprise Edition"
@ -94,13 +94,13 @@ cs:
cancelled_due_to: "Job was cancelled due to error: %{message}"
ldap_auth_sources:
technical_warning_html: |
This LDAP form requires technical knowledge of your LDAP / Active Directory setup.
Tento LDAP formulář vyžaduje technické znalosti nastavení LDAP / Active Directory.
<br/>
<a href="https://www.openproject.org/help/administration/manage-ldap-authentication/">Please visit our documentation for detailed instructions</a>.
<a href="https://www.openproject.org/help/administration/manage-ldap-authentication/">Prosím navštivte naši dokumentaci pro podrobné pokyny</a>.
attribute_texts:
name: Arbitrary name of the LDAP connection
host: LDAP host name or IP address
login_map: The attribute key in LDAP that is used to identify the unique user login. Usually, this will be `uid` or `samAccountName`.
host: LDAP název hostitele nebo IP adresa
login_map: Atribut klíč v LDAP, který se používá k identifikaci jedinečného přihlášení uživatele. Obvykle se jedná o `uid` nebo `samAccountName`.
generic_map: The attribute key in LDAP that is mapped to the OpenProject `%{attribute}` attribute
admin_map_html: "Optional: The attribute key in LDAP that <strong>if present</strong> marks the OpenProject user an admin. Leave empty when in doubt."
system_user_dn_html: |
@ -126,12 +126,12 @@ cs:
If you enable group synchronization for this LDAP connection, users will also be automatically created
in OpenProject for synchronized groups. Without it, only existing accounts in OpenProject will be added to groups.
connection_encryption: 'Šifrování připojení'
system_account: 'System account'
system_account: 'Systémový účet'
system_account_legend: |
OpenProject requires read-only access through a system account to lookup users and groups in your LDAP tree.
Please specify the bind credentials for that system user in the following section.
OpenProject vyžaduje přístup pouze pro čtení prostřednictvím systémového účtu pro vyhledávání uživatelů a skupin ve stromu LDAP.
Zadejte prosím přístupové údaje pro tohoto systémového uživatele v následující sekci.
ldap_details: 'Podrobnosti LDAP'
user_settings: 'Attribute mapping'
user_settings: 'Mapování atributů'
user_settings_legend: |
The following fields are related to how users are created in OpenProject from LDAP entries and
what LDAP attributes are used to define the attributes of an OpenProject user (attribute mapping).
@ -539,7 +539,7 @@ cs:
invalid_url: 'není platná adresa URL.'
invalid_url_scheme: 'není podporovaný protokol (povoleny: %{allowed_schemes}).'
less_than_or_equal_to: "musí být menší než nebo rovno %{count}."
not_current_user: "is not the current user."
not_current_user: "není aktuální uživatel."
not_a_date: "není platné datum."
not_a_datetime: "není platný čas."
not_a_number: "není číslo."
@ -1118,7 +1118,7 @@ cs:
enumeration_work_package_priorities: "Priority pracovního balíčku"
enumeration_reported_project_statuses: "Nahlášený stav projektu"
error_auth_source_sso_failed: "Jednotné přihlášení (SSO) pro uživatele '%{value}' selhalo"
error_can_not_archive_project: "This project cannot be archived: %{errors}"
error_can_not_archive_project: "Tento projekt nelze archivovat: %{errors}"
error_can_not_delete_entry: "Nelze odstranit položku"
error_can_not_delete_custom_field: "Nelze odstranit vlastní pole"
error_can_not_delete_type: "Tento typ obsahuje pracovní balíčky a nedá sa odstrániť."
@ -1127,7 +1127,7 @@ cs:
error_can_not_remove_role: "Tato role je používána a nelze ji odstranit."
error_can_not_reopen_work_package_on_closed_version: "Pracovní balíček v uzavřené verzi nemůže být znovu otevřen"
error_can_not_find_all_resources: "Nelze najít všechny související zdroje k tomuto požadavku."
error_can_not_unarchive_project: "This project cannot be unarchived: %{errors}"
error_can_not_unarchive_project: "Tento projekt nemůže být odarchivován: %{errors}"
error_check_user_and_role: "Vyberte uživatele a roli."
error_code: "Chyba %{code}"
error_cookie_missing: 'OpenProject cookie chybí. Ujistěte se, že jsou soubory cookie povoleny, protože aplikace nebude správně fungovat.'
@ -1187,7 +1187,7 @@ cs:
pdf_with_descriptions_and_attachments: "PDF s popisky a přílohami"
pdf_with_attachments: "PDF s přílohami"
image:
omitted: "Image not exported."
omitted: "Obrázek nebyl exportován."
extraction:
available:
pdftotext: "Pdftotext k dispozici (volitelné)"
@ -1230,6 +1230,8 @@ cs:
blog: "OpenProject blog"
forums: "Komunitní fórum"
newsletter: "Bezpečnostní upozornění / newsletter"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:
@ -1766,25 +1768,25 @@ cs:
label_workflow_plural: "Pracovní vrstvy"
label_workflow_summary: "Souhrn"
label_x_closed_work_packages_abbr:
zero: "0 closed"
zero: "0 uzavřeno"
one: "1 uzavřen"
few: "%{count} uzavřeny"
many: "%{count} uzavřeny"
other: "%{count} uzavřeny"
label_x_comments:
zero: "no comments"
zero: "žádné komentáře"
one: "1 komentář"
few: "%{count} komentářů"
many: "%{count} komentářů"
other: "%{count} komentářů"
label_x_open_work_packages_abbr:
zero: "0 open"
zero: "0 otevřených"
one: "1 otevřený"
few: "%{count} otevřených"
many: "%{count} otevřených"
other: "%{count} otevřených"
label_x_projects:
zero: "no projects"
zero: "Žádné projekty"
one: "1 projekt"
few: "%{count} projektů"
many: "%{count} projektů"
@ -1830,14 +1832,14 @@ cs:
mail_body_register_closing: "Your OpenProject team"
mail_body_register_ending: "Stay connected! Kind regards,"
mail_body_reminder: "%{count} pracovních balíčků, které máte přiřazeny, mají termín během následujících %{days} dnů:"
mail_body_group_reminder: "%{count} work package(s) that are assigned to group \"%{group}\" are due in the next %{days} days:"
mail_body_group_reminder: "%{count} pracovních balíčků, které jsou přiřazeny ke skupině \"%{group}\", má termín splatnosti během následujících %{days} dnů:"
mail_body_wiki_content_added: "Wiki stránka '%{id}' byla přidána uživatelem %{author}."
mail_body_wiki_content_updated: "Wiki stránka '%{id}' byla aktualizována uživatelem %{author}."
mail_subject_account_activation_request: "Žádost o aktivaci účtu %{value}"
mail_subject_lost_password: "Vaše heslo %{value}"
mail_subject_register: "Aktivace vašeho účtu %{value}"
mail_subject_reminder: "%{count} pracovních balíčků s termínem do dalších %{days} dnů"
mail_subject_group_reminder: "For group \"%{group}\" %{count} work package(s) due in the next %{days} days"
mail_subject_group_reminder: "Pro skupinu \"%{group}\" %{count} pracovních balíčků splatných během následujících %{days} dnů"
mail_subject_wiki_content_added: "'%{id}' wiki stránka byla přidána"
mail_subject_wiki_content_updated: "'%{id}' wiki stránka byla aktualizována"
mail_user_activation_limit_reached:

@ -1198,6 +1198,8 @@ da:
blog: "OpenProject blog"
forums: "Community forum"
newsletter: "Security alerts / Newsletter"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -33,13 +33,13 @@ de:
colors:
alternative-color: "Alternativ"
content-link-color: "Link-Schriftfarbe"
primary-color: "Primär"
primary-color-dark: "Primär (dunkel)"
primary-color: "Primärfarbe"
primary-color-dark: "Primärfarbe (dunkel)"
header-bg-color: "Hintergrund der Kopfzeile"
header-item-bg-hover-color: "Hintergrund der Kopfzeile bei Hover"
header-item-font-color: "Textfarbe der Kopfzeile"
header-item-font-hover-color: "Textfarbe der Kopfzeile bei Hover"
header-border-bottom-color: "Header border"
header-border-bottom-color: "Rahmenfarbe der Kopfzeile"
main-menu-bg-color: "Hintergrundfarbe des Hauptmenüs"
main-menu-bg-selected-background: "Hintergrundfarbe des Hauptmenüs bei Auswahl"
main-menu-bg-hover-background: "Hintergrundfarbe des Hauptmenüs bei Hover"
@ -52,7 +52,7 @@ de:
enterprise_notice: "Als ein besonderes Dankeschön für Ihre finanzielle Unterstützung in der Entwicklung von OpenProject ist diese Funktionalität nur in Verknüpfung mit einem Enterprise-Edition Abonnement verfügbar."
manage_colors: "Farbauswahloptionen bearbeiten"
instructions:
alternative-color: "Starken Akzentfarbe, wird normalerweise für die wichtigste Schaltfläche auf dem Bildschirm verwendet."
alternative-color: "Starke Akzentfarbe, wird normalerweise für die wichtigste Schaltfläche auf dem Bildschirm verwendet."
content-link-color: "Schriftfarbe der meisten Links."
primary-color: "Hauptfarbe."
primary-color-dark: "In der Regel wird eine dunklere Version der Hauptfarbe für Hover-Effekte verwendet."
@ -96,13 +96,13 @@ de:
technical_warning_html: |
Dieses LDAP-Formular erfordert technische Kenntnisse ihres LDAP-/Active Directory Setups.
<br/>
<a href="https://www.openproject.org/help/administration/manage-ldap-authentication/">Bitte besuchen Sie unsere Dokumentation für detaillierte Anweisungen</a>.
<a href="https://www.openproject.org/help/administration/manage-ldap-authentication/">Bitte rufen Sie für eine detaillierte Anleitung unsere Dokumentation auf</a>.
attribute_texts:
name: Beliebiger Name der LDAP-Verbindung
host: LDAP Hostname oder IP-Adresse
login_map: Der Attributschlüssel in LDAP, der benutzt wird, um die eindeutige Benutzeranmeldung zu identifizieren. Normalerweise wird dies `uid` oder `samAccountName` sein.
host: LDAP-Hostname oder IP-Adresse
login_map: Der Attributschlüssel in LDAP, der benutzt wird, um die eindeutige Benutzeranmeldung zu identifizieren. Normalerweise ist das `uid` oder `samAccountName`.
generic_map: Der Attributschlüssel in LDAP, der dem OpenProject `%{attribute}` Attribut zugeordnet ist
admin_map_html: "Optional: Der Attributenschlüssel in LDAP der, <strong>falls vorhanden</strong>, den OpenProject Nutzer als einen Administrator makiert. \nIm Zweifel leer lassen."
admin_map_html: "Optional: Der Attributschlüssel in LDAP der, <strong>falls vorhanden</strong>, den OpenProject-Nutzer als einen Administrator markiert. \nIm Zweifel leer lassen."
system_user_dn_html: |
Geben Sie den DN des Systembenutzers ein, der für schreibgeschützten Zugriff verwendet wird.
<br/>
@ -126,7 +126,7 @@ de:
connection_encryption: 'Verbindungsverschlüsselung'
system_account: 'Systemkonto'
system_account_legend: |
OpenProject benötigt lesenden Zugriff über ein LDAP Systemkonto, um Benutzer und Gruppen in Ihrem LDAP-Baum zu suchen.
OpenProject benötigt lesenden Zugriff über ein LDAP-Systemkonto, um Benutzer und Gruppen in Ihrem LDAP-Baum zu suchen.
Bitte geben Sie die Anmeldedaten für den Systembenutzer im folgenden Abschnitt an.
ldap_details: 'LDAP-Details'
user_settings: 'Zuordnen von Attributen'
@ -532,7 +532,7 @@ de:
invalid_url: 'ist keine gültige URL.'
invalid_url_scheme: 'ist kein unterstütztes Protokoll (erlaubt: %{allowed_schemes}).'
less_than_or_equal_to: "muss kleiner oder gleich %{count} sein."
not_current_user: "is not the current user."
not_current_user: "ist nicht der aktuelle Benutzer."
not_a_date: "ist kein gültiges Datum."
not_a_datetime: "ist kein gültiges Datum."
not_a_number: "ist keine Zahl."
@ -1193,6 +1193,8 @@ de:
blog: "OpenProject Blog"
forums: "Community Forum"
newsletter: "Sicherheitswarnungen / Newsletter"
image_conversion:
imagemagick: 'ImageMagick'
journals:
changes_retracted: "Die Änderungen wurden zurückgezogen."
links:
@ -1368,7 +1370,7 @@ de:
label_enterprise_active_users: "%{current}/%{limit} gebuchte aktive Nutzer"
label_enterprise_edition: "Enterprise-Edition"
label_environment: "Umgebung"
label_estimates_and_time: "Schätzungen & Zeit"
label_estimates_and_time: "Schätzungen & Zeiten"
label_equals: "ist"
label_everywhere: "überall"
label_example: "Beispiel"

@ -1195,6 +1195,8 @@ el:
blog: "OpenProject blog"
forums: "Φόρουμ κοινότητας"
newsletter: "Ειδοποιήσεις ασφάλεια / Ενημερωτικό δελτίο"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "Οι αλλαγές αποσύρθηκαν."
links:

@ -1195,6 +1195,8 @@ es:
blog: "Blog de OpenProject"
forums: "Foro de la comunidad"
newsletter: "Alertas de seguridad / boletín"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "Se deshicieron los cambios."
links:

@ -1198,6 +1198,8 @@ fi:
blog: "OpenProject blogi"
forums: "Keskustelupalsta"
newsletter: "Suojausvaroitukset / uutiskirje"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -1198,6 +1198,8 @@ fil:
blog: "Blog ng OpenProject"
forums: "Komunidad forum"
newsletter: "Mga alertong seguridad/ Newsletter"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -536,7 +536,7 @@ fr:
invalid_url: 'n’est pas une URL valide.'
invalid_url_scheme: 'n’est pas un protocole pris en charge (autorisés : %{allowed_schemes}).'
less_than_or_equal_to: "doit être inférieur ou égal à %{count}."
not_current_user: "is not the current user."
not_current_user: "n'est pas l'utilisateur actuel."
not_a_date: "n'est pas une date valide."
not_a_datetime: "n'est pas une heure valide."
not_a_number: "n'est pas un nombre."
@ -1197,6 +1197,8 @@ fr:
blog: "Blog OpenProject"
forums: "Forum de la communauté"
newsletter: "Alertes de sécurité / Lettre d’information"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "Les modifications ont été retirées."
links:

@ -1214,6 +1214,8 @@ hr:
blog: "OpenProject blog"
forums: "Forum Zajednice"
newsletter: "Security alerts / Newsletter"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -1195,6 +1195,8 @@ hu:
blog: "OpenProject blog"
forums: "Közösségi fórum"
newsletter: "Biztonsági figyelmeztetések / hírlevél"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -1181,6 +1181,8 @@ id:
blog: "OpenProject blog"
forums: "Community forum"
newsletter: "Peringatan keamanan / Jurnal berkala"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -1194,6 +1194,8 @@ it:
blog: "Blog di OpenProject"
forums: "Forum della Comunità"
newsletter: "Avvisi di sicurezza / Notizie"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "Le modifiche sono state annullate."
links:

@ -1177,6 +1177,8 @@ ja:
blog: "OpenProject ブログ"
forums: "コミュニティ フォーラム"
newsletter: "セキュリティアラート / ニュースレター"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -271,7 +271,7 @@ de:
standard:
learn_about_link: https://www.openproject.org/openproject-11-0-release
current_new_feature_html: >
Die Version enthält zahlreiche neue Funktionen und Verbesserungen: <br> <ul class="%{list_styling_class}"> <li><b>Top-Down-Planung</b> um alle Projektaufgaben zu definieren. Dabei sind die Anfangs- und Enddaten eines Elternelements unabhängig von den Daten der Unteraufgaben.</li> <li><b>Vielseitige agile Boards</b> ermöglichen Ihnen die Erstellung eines Projektstrukturplans oder die Verteilung von Aufgaben auf Unterprojekte.</li> <li><b>Projektvorlagen</b> zur einfachen Erstellung neuer Projekte.</li> <li>Konfiguration der Projektseite ermöglicht ein besseres <b>Projektportfolio-Management.</b></li> </ul>
Die Version enthält zahlreiche neue Funktionen und Verbesserungen: <br> <ul class="%{list_styling_class}"> <li><b>Top-Down-Planung</b> um alle Projektaufgaben zu definieren. Dabei sind die Anfangs- und Enddaten eines Elternelements unabhängig von den Daten der Unteraufgaben.</li> <li><b>Vielseitige agile Boards</b> ermöglichen Ihnen die Erstellung eines Projektstrukturplans oder die Verteilung von Aufgaben auf Unterprojekte.</li> <li><b>Projektvorlagen</b> zur einfachen Erstellung neuer Projekte.</li> <li>Die Konfiguration der Projektseite ermöglicht ein besseres <b>Projektportfolio-Management.</b></li> </ul>
bim:
learn_about_link: "https://www.openproject.org/openproject-bim-10-5\n"
current_new_feature_html: >
@ -477,7 +477,7 @@ de:
drag: 'Ziehen Sie Ihre Karten in eine Liste, um diese zu sortieren oder weisen Sie diese einer anderen Liste zu. Ein Doppelklick auf eine Karte öffnet die Detailansicht.'
wp:
toggler: "Hier sind die <b>Arbeitspakete</b>, die Ihnen eine detailliertere Sicht auf die Arbeit in Ihrem Projekt geben."
list: 'Dies ist die Liste der wichtigen <b>Arbeitspakete</b> in Ihrem Projekt, z.B. Aufgaben, Funktionen, Meilensteine, Fehler, und Vieles mehr. <br> Sie können neue Arbeitspakete direkt in der Liste anlegen und bearbeiten. Ein Doppelklick auf die Zeile öffnet die Detailansicht.'
list: 'Dies ist die Liste der wichtigen <b>Arbeitspakete</b> in Ihrem Projekt, z.B. Aufgaben, Funktionen, Meilensteine, Fehler, und Vieles mehr. <br> Sie können neue Arbeitspakete direkt in der Liste anlegen und bearbeiten. Ein Doppelklick auf eine Zeile öffnet die Detailansicht.'
full_view: 'In der <b>Arbeitspaket-Detailansicht</b> finden Sie alle wichtigen Informationen, wie Beschreibung, Status und Priorität, Aktivitäten, Abhängigkeiten oder Kommentare.'
back_button: 'Mit dem Pfeil kommen Sie zurück in die Listenansicht.'
create_button: 'Mit <b>Anlegen</b> Können Sie neue Arbeitspakete Ihrem Projekt hinzufügen.'
@ -740,7 +740,7 @@ de:
property_groups:
details: "Details"
people: "Personen"
estimatesAndTime: "Schätzungen & Zeit"
estimatesAndTime: "Schätzungen & Zeiten"
other: "Andere"
properties:
assignee: "Zugewiesen an"

@ -170,12 +170,12 @@ sv:
reset_to_defaults: 'Återställ standardinställningar'
enterprise:
trial:
confirmation: "Confirmation of email address"
confirmation: "Bekräftelse av e-postadress"
confirmation_info: >
We sent you an email on %{date} to %{email}. Please check your inbox and click the confirmation link provided to start your 14 days trial.
form:
general_consent: >
I agree with the <a target="_blank" href="%{link_terms}">terms of service</a> and the <a target="_blank" href="%{link_privacy}">privacy policy</a>.
Jag godkänner <a target="_blank" href="%{link_terms}">användarvillkoren</a> och <a target="_blank" href="%{link_privacy}">integritetspolicyn</a>.
invalid_email: "Invalid email address"
label_company: "Company"
label_first_name: "Förnamn"
@ -213,11 +213,11 @@ sv:
premium_features_text: "Agile boards, custom theme and logo, graphs, intelligent workflows with custom actions, full text search for work package attachments and multi-select custom fields."
professional_support: "Professionell hjälp"
professional_support_text: "Get reliable, high-touch support from senior support engineers with expert knowledge about running OpenProject in business-critical environments."
button_start_trial: "Start free trial"
button_book_now: "Book now"
button_start_trial: "Starta fri provperiod"
button_book_now: "Boka nu"
confidence: >
We deliver the confidence of a tested and supported enterprise-class project management software - with Open Source and an open mind.
link_quote: "Get a quote"
link_quote: "Få en offert"
text: >
The OpenProject Enterprise Edition builds on top of the Community Edition. It includes premium features and professional support mainly aimed at organizations with more than 10 users that manage business critical projects with OpenProject.
unlimited: "Unlimited"

@ -535,7 +535,7 @@ ko:
invalid_url: '은(는) 올바른 URL이 아닙니다.'
invalid_url_scheme: '은(는) 지원되는 프로토콜(허용: %{allowed_schemes})이 아닙니다.'
less_than_or_equal_to: "은(는) %{count} 보다 작거나 같아야 합니다"
not_current_user: "is not the current user."
not_current_user: "은(는) 현재 유효한 사용자가 아닙니다."
not_a_date: "은(는) 유효한 날짜가 아닙니다."
not_a_datetime: "은(는) 유효한 날짜가 아닙니다."
not_a_number: "은(는) 숫자가 아닙니다."
@ -615,7 +615,7 @@ ko:
queries/filters/base:
attributes:
values:
inclusion: "filter has invalid values."
inclusion: "필터에 잘못된 값이 있습니다."
format: "%{message}"
relation:
typed_dag:
@ -1181,6 +1181,8 @@ ko:
blog: "OpenProject 블로그"
forums: "커뮤니티 포럼"
newsletter: "보안 알림/뉴스레터"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "변경 사항이 취소되었습니다."
links:

@ -534,7 +534,7 @@ lt:
invalid_url: 'nėra tinkamas URL.'
invalid_url_scheme: 'nėra palaikomos protokolas (leidžiamas: %{allowed_schemes}).'
less_than_or_equal_to: "turi būti mažesnis arba lygus %{count}."
not_current_user: "is not the current user."
not_current_user: "nėra dabartinis vartotojas"
not_a_date: "nėra tinkama data."
not_a_datetime: "nėra tinkama data ir laikas."
not_a_number: "nėra skaičius."
@ -1225,6 +1225,8 @@ lt:
blog: "OpenProject blogas"
forums: "Bendruomenės forumas"
newsletter: "Saugos įspėjimai / Naujienos"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "Pakeitimai buvo atšaukti."
links:

@ -1198,6 +1198,8 @@ nl:
blog: "OpenProject blog"
forums: "Gemeenschapsforum"
newsletter: "Beveiligingswaarschuwingen / nieuwsbrief"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -1198,6 +1198,8 @@
blog: "OpenProject blogg"
forums: "Brukerforum"
newsletter: "Security alerts / Newsletter"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -1226,6 +1226,8 @@ pl:
blog: "Blog OpenProject"
forums: "Forum społeczności"
newsletter: "Powiadomienia bezpieczeństwa / Newsletter"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "Zmiany zostały wycofane."
links:

@ -535,7 +535,7 @@ pt:
invalid_url: 'não é um URL válido.'
invalid_url_scheme: 'não é um protocolo suportado (permitidos: %{allowed_schemes}).'
less_than_or_equal_to: "deve ser menor ou igual a %{count}."
not_current_user: "is not the current user."
not_current_user: "não é o usuário atual."
not_a_date: "não é uma data válida."
not_a_datetime: "não é uma data/hora válida."
not_a_number: "não é um número."
@ -1196,6 +1196,8 @@ pt:
blog: "Blog do OpenProject"
forums: "Fórum da Comunidade"
newsletter: "Alertas de segurança / Newsletter"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "As mudanças foram retraídas."
links:

@ -538,7 +538,7 @@ ro:
invalid_url: 'nu este o adresa URL validă.'
invalid_url_scheme: 'nu este un protocol permis (allowed: %{allowed_schemes}).'
less_than_or_equal_to: "trebuie să fie mai mic sau egal cu %{count}."
not_current_user: "is not the current user."
not_current_user: "nu este utilizatorul curent."
not_a_date: "is not a valid date."
not_a_datetime: "is not a valid date time."
not_a_number: "nu este un număr."
@ -1214,6 +1214,8 @@ ro:
blog: "Blog-ul OpenProject"
forums: "Forum comunitate"
newsletter: "Security alerts / Newsletter"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -1229,6 +1229,8 @@ ru:
blog: "Openproject блог"
forums: "Форум сообщества"
newsletter: "Оповещения системы безопасности / Новости"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "Изменения отменены."
links:

@ -1230,6 +1230,8 @@ sk:
blog: "OpenProject blog"
forums: "Komunitné fórum"
newsletter: "Bezpečnostné upozornenia / Newsletter"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -1228,6 +1228,8 @@ sl:
blog: "Blog OpenProject"
forums: "Forum skupnosti"
newsletter: "Varnostna opozorila / Glasilo"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "Spremembe so bile umaknjene."
links:

@ -63,16 +63,16 @@ sv:
main-menu-bg-color: "Bakgrundsfärg på den vänstra sidomenyn."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Upgrade to the Enterprise Edition"
upgrade_to_ee: "33 / 5000\nUppgradera till Enterprise Edition"
add_token: "Ladda upp en Enterprise Edition support-nyckel"
replace_token: "Ersätta din nuvarande support-nyckel"
order: "Beställ Enterprise Edition"
paste: "Klistra in din Enterprise Edition support-nyckel"
required_for_feature: "Denna funktion är endast tillgänglig med en aktiv Enterprise Edition support-nyckel."
enterprise_link: "För mer information, klicka här."
start_trial: 'Start free trial'
book_now: 'Book now'
get_quote: 'Get a quote'
start_trial: 'Starta fri provperiod'
book_now: 'Boka nu'
get_quote: 'Få en offert'
announcements:
show_until: Visa fram till
is_active: visas för tillfället
@ -1197,11 +1197,13 @@ sv:
blog: "OpenProject blogg"
forums: "Community forum"
newsletter: "Säkerhetsnotifieringar / Nyhetsbrev"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
changes_retracted: "Förändringarna drogs tillbaka."
links:
configuration_guide: 'Konfigurationsguide'
get_in_touch: "You have questions? Get in touch with us."
get_in_touch: "Har du frågor? Ta kontakt med oss."
instructions_after_registration: "Du kan logga in så snart ditt konto har aktiverats genom att klicka på %{signin}."
instructions_after_logout: "Du kan logga in igen genom att klicka på %{signin}."
instructions_after_error: "Du kan försöka logga in igen genom att klicka på %{signin}. Om felet kvarstår, be din systemadministratör om hjälp."
@ -2563,7 +2565,7 @@ sv:
mail_self_notified: "Jag vill bli meddelad om ändringar som jag själv gör"
status_user_and_brute_force: "%{user} och %{brute_force}"
status_change: "Statusändring"
text_change_disabled_for_provider_login: "The name is set by your login provider and can thus not be changed."
text_change_disabled_for_provider_login: "Namnet är satt av din inloggningsleverantör och kan därför inte ändras."
unlock: "Lås upp"
unlock_and_reset_failed_logins: "Lås upp och nollställ misslyckade inloggningsförsök"
version_status_closed: "stängt"

@ -1198,6 +1198,8 @@ tr:
blog: "OpenProject blog"
forums: "Topluluk forumu"
newsletter: "Güvenlik uyarıları / haber bülteni"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "Değişiklikler geri çekildi."
links:

@ -1230,6 +1230,8 @@ uk:
blog: "Openproject блог"
forums: "Форум спільноти"
newsletter: "Сигнали безпеки / Інформаційний бюлетень"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -1184,6 +1184,8 @@ vi:
blog: "OpenProject blog"
forums: "Diễn đàn cộng đồng"
newsletter: "Security alerts / Newsletter"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "Những thay đổi đã bị rút lại"
links:

@ -1177,6 +1177,8 @@ zh-CN:
blog: "OpenProject 博客"
forums: "社区论坛"
newsletter: "安全警报/通信"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "更改已撤回。"
links:

@ -1182,6 +1182,8 @@ zh-TW:
blog: "Openproject 部落格"
forums: "社群論壇"
newsletter: "安全警報 / 消息"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
links:

@ -1238,6 +1238,9 @@ en:
forums: "Community forum"
newsletter: "Security alerts / Newsletter"
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."

@ -0,0 +1,40 @@
#-- encoding: UTF-8
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) 2012-2020 the OpenProject GmbH
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See docs/COPYRIGHT.rdoc for more details.
#++
class RemoveRenamedCronJob < ActiveRecord::Migration[6.0]
def up
# The job has been renamed to JobStatus::Cron::ClearOldJobStatusJob
# the new job will be added on restarting the application but the old will still be in the database
# and will cause 'uninitialized constant' errors.
Delayed::Job
.where('handler LIKE ?', "%job_class: Cron::ClearOldJobStatusJob%")
.delete_all
end
end

@ -18,7 +18,8 @@ apt-get install -y \
tesseract-ocr \
catdoc \
postgresql-9.6 \
postgresql-client-9.6
postgresql-client-9.6 \
imagemagick
rm -rf "$PGDATA_LEGACY"

@ -42,7 +42,7 @@ bundle install
You may have a look at some existing OpenProject plugins to get inspiration. It is possible to add new routes, views, models, … and/or overwrite existing ones.
Feel free to ask for help in our [Development Forum](https://community.openproject.org/projects/openproject/boards/7).
Feel free to ask for help in our [Development Forum](https://community.openproject.com/projects/openproject/forums/7).
## Steps to release a plugin
@ -62,7 +62,7 @@ A code review should check the whole code and remove glitches like:
Usually, this should be GPLv3 and we are the copyright owner. However, some plugins might have additional authors or might originate from code with a different license. These issues have to be resolved first. Also check the years in the copyright. If you need to find all contributors of a repository including their contribution period use the following rake task:
```bash
rake copyright:authors:show['../Path/to/repository/']
```
```
2. Add a copyright notice to all the source files

@ -34,10 +34,6 @@ Please include a description on how to reproduce the issue if possible. Our secu
OpenProject administrators can enforce [authentication mechanisms and password rules]() to ensure users choose secure passwords according to current industry standards. Passwords stored by OpenProject are securely stored using salted bcrypt. Alternatively, external authentication providers and protocols (such as LDAP, SAML) can be enforced to avoid using and exposing passwords within OpenProject.
### Two-step user registration
In compliance with common requirements in works committees, ensure that new users added by project responsibles are confirmed by a superior before allowing the user to enter the system for the first time.
### User management and access control.
Administrators are provided with [fine-grained role-based access control mechanisms]() to ensure that users are only seeing and accessing the data they are allowed to on an individual project level.

@ -4,7 +4,7 @@ sidebar_navigation:
priority: 400
description: Learn how to configure account settings.
robots: index, follow
keywords: my account, account settings
keywords: my account, account settings, change language
---
# My Account
@ -16,7 +16,7 @@ Change your personal settings in My Account. Here you can adapt, e.g. the langua
| [Open My Account settings](#open-my-account-settings) | How to open your personal settings in OpenProject? |
| [Change password](#change-password) | How to change my password? |
| [Edit your user information](#edit-your-user-information) | How to change the name or email address in OpenProject? |
| [Profile settings: change your language, time zone or display of comments](#profile-settings:-change-your-language,-time-zone-or-display-of-comments) | How to change the language, time zone or display of comments in OpenProject? |
| [Profile settings: change your language, time zone or display of comments](#profile-settings) | How to change the language, time zone or display of comments in OpenProject? |
| [Two-factor authentication](#two-factor-authentication-premium-feature) | How to set up a two-factor authentication? |
| [Email notifications](#email-notifications) | How to change email notifications sent by OpenProject? |
| [Set an Avatar](#set-an-avatar) | How to set an Avatar in OpenProject and change the profile picture? |

@ -1,11 +1,10 @@
---
sidebar_navigation:
title: Sign in and registration
priority: 990
description: Sign in and registration in OpenProject.
robots: index, follow
keywords: sing in, login, registration
---
# Sign in and registration
Here you will get an overview how to sign in and register to an existing OpenProject installation.

@ -49,7 +49,8 @@ sudo passwd openproject #(enter desired password)
libncurses5-dev automake \
libtool bison libffi-dev git curl \
poppler-utils unrtf tesseract-ocr catdoc \
libxml2 libxml2-dev libxslt1-dev # nokogiri
libxml2 libxml2-dev libxslt1-dev # nokogiri \
imagemagick
```
## Install the caching server (memcached)

@ -62,3 +62,5 @@ After you are done you can leave the console by entering `exit`.
Once this is done you will see an "Okta" button in the bottom area of the login form.
Clicking on it will start the login process.
_**Note**: This is an Enterprise Edition feature. If you do not see the button you will have to activate the Enterprise Edition first._

@ -6,7 +6,7 @@ sidebar_navigation:
# Frequently asked questions - FAQ
## I lost access to my admin account, how to I reset my password?
## I lost access to my admin account, how do I reset my password?
You can reset your admin account through the Rails console.
[Please see this separate page on how to start the console](https://docs.openproject.org/installation-and-operations/operation/control/).

@ -0,0 +1,28 @@
---
title: OpenProject 11.0.4
sidebar_navigation:
title: 11.0.4
release_version: 11.0.4
release_date: 2020-12-03
---
# OpenProject 11.0.4
We released [OpenProject 11.0.4](https://community.openproject.com/versions/1458).
The release contains several bug fixes and we recommend updating to the newest version.
<!--more-->
#### Bug fixes and changes
- Fixed: Budgets Fail to Copy due to Missing Superclass Method \[[#34966](https://community.openproject.com/wp/34966)\]
- Fixed: Selected design / theme lost when switching to "Backlogs" module \[[#34968](https://community.openproject.com/wp/34968)\]
- Fixed: Initially seeded homepage grid cannot be edited \[[#35266](https://community.openproject.com/wp/35266)\]
- Fixed: [Translation][German] Administration>User&Permissions>Roles \[[#35363](https://community.openproject.com/wp/35363)\]
- Fixed: Internal error (500) on meeting history page when clicking on previous version link \[[#35433](https://community.openproject.com/wp/35433)\]
#### Contributions
A big thanks to community members for reporting bugs and helping us identifying and providing fixes.
Special thanks for reporting and finding bugs go to
Boris Lukashev, Benjamin Bädorf, Frank Schmid

@ -155,7 +155,3 @@ perform the upgrade.
[Please visit our upgrade guides for more
information](https://www.openproject.org/operations/upgrading/).
 
</div>

@ -12,6 +12,13 @@ Stay up to date and get an overview of the new features included in the releases
<!--- New release notes are generated below. Do not remove comment. -->
<!--- RELEASE MARKER -->
## 11.0.4
Release date: 2020-12-03
[Release Notes](11-0-4/)
## 11.0.3
Release date: 2020-11-16

@ -52,3 +52,10 @@ To create a new synchronized group, use the button on the top right of the page
The *entry* *identifier* field corresponds to the value of the group key, e.g. **groupA** for our first exemplary group.
Click on *Create* to finish the creation of the synchronized group. The LDAP memberships of each user will be synchronized hourly through a cron job on your packaged installation. Changes and output will be logged to */var/log/openproject/cron-hourly.log*.
If you want to trigger the synchronization *manually* you can do so by running the respective rake task directly.
In the packaged installation, for instance, this would work like this:
```
sudo openproject run bundle exec rake ldap_groups:synchronize
```

@ -4,16 +4,16 @@ sidebar_navigation:
priority: 780
description: Manage enumerations in OpenProject.
robots: index, follow
keywords: enumerations
keywords: enumerations, time tracking, priority, document categories
---
# Manage Enumerations
The **Enumerations** settings allow adapting of Activities (for time tracking), work package priorities and document categories.
<div class="glossary“>
**Enumerations** are defined as a menu item in admin settings that allows the configuration of Activities (for time tracking), project status and work package priorities.
<div class="glossary">
**Enumerations** are a menu item in admin settings that allows the configuration of Activities (for time tracking), project status and work package priorities.
</div>
To get an overview of existing enumeration values for all of these categories, navigate to the -> *Administration* -> *Enumerations*. You will see the enumerations overview, divided into respective sections.
![enumerations](image-20200122161732016.png)
@ -38,6 +38,10 @@ You will then be able to name the value, activate it and choose if it should be
![Sys-admin-enumerations](Sys-admin-enumerations.png)
**Note**: To activate the [Activities (for time tracking)](../../user-guide/projects/project-settings/activities-time-tracking) in a certain project, navigate to -> *Project settings* -> *Activities (time tracking)*.
</div>
To **change the color of work package priorities** choose the respective priority in the section Work package priorities.
<div class="alert alert-info" role="alert">
**Note**: To activate the [Activities (for time tracking)](../../user-guide/projects/project-settings/activities-time-tracking) in a certain project, navigate to -> *Project settings* -> *Time tracking activities*.
</div>

@ -14,6 +14,7 @@ Work packages can have various status depending on their types, e.g. tasks can h
The status can be set at the top of the work package details view or in the list view in the corresponding column.
![Sys-admin-work-package-status](Sys-admin-work-package-status.png)The status field can be configured under *Administration ->* *Work packages* -> *Status*. You will see the list of all the existing work package status in the system. You can add new status or change the name and order of existing status.
To learn about the options for configuring the transition from one status to another navigate to [Manage work package workflows](../work-package-workflows).
## Create a new work package status

@ -21,6 +21,9 @@ At the moment there are more than 30 languages available.
**Note**: Many languages are translated by the Community. We highly appreciate if you want to [help translating OpenProject to your language](../../../development/translate-openproject).
</div>
You can [choose your language in your user profile](../../../getting-started/my-account/#change-your-language).
## Time and date formatting
Change time and date formats in OpenProject and configure the display of journal aggregation.

@ -4,7 +4,7 @@ sidebar_navigation:
priority: 780
description: Find out how to create and manage budgets for a project in OpenProject.
robots: index, follow
keywords: budgets
keywords: budgets, project budget, costs
---
# Budgets
@ -15,14 +15,14 @@ You can add planned **unit costs** as well as **labor costs** for the project.
Then, you will assign work packages to a budgets. If you log time or costs to this work package the costs will booked to this budget and show the percentage spent for a project budget.
| Feature | Documentation for |
| Topic | Content |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| [Create a project budget](#create-a-project-budget) | How to set up a project budget in OpenProject? |
| [Add planned unit costs](#add-planned-unit-costs) | How to add planned unit costs to a budget? |
| [Add planned labor costs](#add-planned-labor-costs) | How to add planned labor costs to a budget? |
| [Assign a work package to a budget](#assign-work-package-to-a-budget) | How to assign a work package to book time and costs to a project budget? |
| [Assign a work package to a budget](#assign-a-work-package-to-a-budget) | How to assign a work package to book time and costs to a project budget? |
| [View details and update budget](#view-details-and-update-budget) | How to display the details, update, copy or delete a project budget? |
| | |
| [Frequently asked questions (FAQ)](Frequently-asked-questions-(FAQ)) | What are frequent questions regarding budgets? |
## Create a project budget

@ -10,6 +10,10 @@ keywords: projects, integration, Jira
If you have previously worked with other tools and want to switch or need an integration to OpenProject, there is a way to do so for some applications.
## GitHub
OpenProject offers a basic GitHub integration. You will find more information about the GitHub integration in our [GitHub integration guideline](../../system-admin-guide/github-integration/).
## Gitlab
The GitLab integration to OpenProject is currently being developed and you can find all information [here](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21933#note_309977508).

@ -11,7 +11,8 @@ keywords: meetings
Meetings in OpenProject allow you to manage and document your project meetings at one central place, prepare a meeting agenda together with your team and document and share meeting minutes with your meeting attendees at one central place.
<div class="glossary">**Meetings** is defined as a module that allows the organization of meetings. The module has to be activated in the project settings in order to be displayed in the side navigation. </div>
<div class="glossary">**Meetings** is defined as a module that allows the organization of meetings. The module has to be activated in the project settings in order to be displayed in the side navigation.
</div>

@ -2,18 +2,18 @@
sidebar_navigation:
title: Time tracking activities
priority: 300
description: Manage activites for time tracking.
description: Manage activities for time tracking.
robots: index, follow
keywords: activities for time tracking
---
# Manage activites for time tracking
# Manage activities for time tracking
You can configure Activities for time tracking in the System *Administration* -> *Enumerations*. You can activate or deactivate time tracking acitivites per project.
You can configure Activities for time tracking in the System *Administration* -> *Enumerations*. You can activate or deactivate time tracking activities per project.
<div class="glossary">**Time tracking** is defined as a module which allows users to log time on work packages. Once the time tracking module is activated, time can be logged via the action menu of a work package.</div>
Navigate to the -> Project settings -> *Activites (time tracking)*.
Navigate to the -> Project settings -> *Activities (time tracking)*.
Select the activites which you want to activate for time tracking in your project. Press the blue Save button to apply your changes.
Select the activities which you want to activate for time tracking in your project. Press the blue Save button to apply your changes.
![time tracking activities](image-20200211134150920.png)

@ -15,10 +15,13 @@ keywords: work packages
Work packages have a **type**, an **ID**, a **subject** and may have various additional attributes, such as **status**, **assignee**, **priority**, **due date**.
<div class="glossary">**Work package ID** is defined as a unique integer assigned to a newly created work package. Work package IDs cannot be changed and are numbered across all projects of an OpenProject instance (therefore, the numbering within a project may not be sequential). </div>
<div class="glossary">**Work package ID** is defined as a unique integer assigned to a newly created work package. Work package IDs cannot be changed and are numbered across all projects of an OpenProject instance (therefore, the numbering within a project may not be sequential).
</div>
<div class="glossary">
**Types** are the different items a work package can represent, such as task, feature, bug, phase, milestone. The work package types can be configured in the system administration. </div>
**Types** are the different items a work package can represent, such as task, feature, bug, phase, milestone. The work package types can be configured in the system administration.
</div>

@ -96,7 +96,7 @@ Tip: **keep the Ctrl. button pressed** in order to select and edit several work
To open the quick context menu, **press the RIGHT mouse button**.
You have then the possibility to:
Then you have the possibility to:
* Open details view of all selected work packages.
* Open the fullscreen view of all selected work packages.
@ -106,3 +106,10 @@ You have then the possibility to:
* Bulk delete all selected work packages.
![bulk edit right mouse click](image-20200331133245192.png)
At the bottom of the page you can decide whether email updates regarding these changes should be sent or not. It makes sense not to tick the box for large updates to prevent users from getting flooded by emails.
![bulk-edit_email-updates](image-20201119163714831.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

@ -62,9 +62,9 @@ To add a filter criteria, click the **+ Add filter:** button in the grey filter
![add-filter](add-filter.png)
You can add as many filter criteria as needed.
Also, you can filter by [custom fields](../../../system-admin-guide/) if you set this in the custom field configuration.
Also, you can filter by [custom fields](../../../system-admin-guide/custom-fields) if you set this in the custom field configuration.
If you want to search by subject of a work package, type in the **Filter by text** the expression you want to filter for.
If you want to search for specific text in the subject, description or comments of a work package, type in the **Filter by text** the expression you want to filter for.
The results will be displayed accordingly in the work package list.
@ -76,24 +76,23 @@ The results will be displayed accordingly in the work package list.
By default, the work package list will be sorted by work package ID.
<div class="glossary">
The **ID** is unique for a work package within OpenProject. It will be set automatically from the system. With the ID you can reference to one specific work package in OpenProject.
The **ID** is unique for a work package within OpenProject. It will be set automatically from the system. With the ID you can reference a specific work package in OpenProject.
</div>
To sort the work package list view, open the [work package table configuration](#work-package-table-configuration) and select the tab **Sort by**. You can sort by up to three attributes, either ascending or descending.
![1566396586476](1566396586476.png)
Click the blue **Apply** button will save your changes and display the results accordingly in the list view.
Clicking the blue **Apply** button will save your changes and display the results accordingly in the list view.
![sort-work-packages](sort-work-packages.png)
<div class="alert alert-info" role="alert">
**Note**: If you have the hierarchy mode activated, all filtered table results will be augmented with their ancestors. Hierarchies can be expanded and collapsed.
</div>
Therefore, the results may differ if you sort in a flat list or in a hierarchy mode.
The same filter applied in the hierarchy mode.
@ -106,7 +105,8 @@ You can sort the work package list manually, using the icon with the 6 dots on t
Moving a work package will change its attributes, depending on the kind of list displayed, e.g. hierarchy changes or priority.
To keep the sorting it is necessary to [save the work package view](#save-work-package-views). Please note: This has no effect on the "All open" view; you have to save your sorting with another name.
To keep the sorting it is necessary to [save the work package view](#save-work-package-views).
Please note: This has no effect on the "All open" view; you have to save your sorting with another name.
## How to switch from flat list to hierarchy mode?
@ -133,18 +133,16 @@ The following attributes can be highlighted in the list:
* Status
* Finish date
Either ![attribute-highlighting](attribute-highlighting.png)
Furthermore, you can highlight the entire row by an attribute.
![attribute-highlighting](attribute-highlighting.png)
The following attributes can be highlighted as a complete row:
Furthermore, you can highlight the entire row by an attribute. The following attributes can be highlighted as a complete row:
* Priority
* Status
![highlight-priority](1566399038768.png)
You can configure the colors for attribute highlighting in the [system administration](../../../system-admin-guide/#status-colors).
You can configure the colors for attribute highlighting in the system administration. Find out how to set it [here](../../../system-admin-guide/enumerations/#edit-or-remove-enumeration-value) for the color of the priority and [here](../../../system-admin-guide/manage-work-packages/work-package-status/#edit-re-order-or-remove-a-work-package-status) for the color of the status.
## Save work package views

@ -26,9 +26,6 @@
* See docs/COPYRIGHT.rdoc for more details. ++
*/
@import "~global_styles/openproject/variables"
@import "~global_styles/openproject/functions"
@mixin story-header
background-color: #FFFFFF
font-size: 1rem - rem-calc(5px)

@ -34,7 +34,7 @@ module OpenProject
module VERSION #:nodoc:
MAJOR = 11
MINOR = 0
PATCH = 3
PATCH = 4
TINY = PATCH # Redmine compat
class << self

@ -5,11 +5,11 @@ ro:
button_update: 'Actualizare'
avatars:
label_choose_avatar: "Choose Avatar from file"
uploading_avatar: "Uploading your avatar."
uploading_avatar: "Se încarcă avatarul tău."
text_upload_instructions: |
Upload your own custom avatar of 128 by 128 pixels. Larger files will be resized and cropped to match.
A preview of your avatar will be shown before uploading, once you selected an image.
error_image_too_large: "Image is too large."
error_image_too_large: "Imaginea este prea mare."
wrong_file_format: "Allowed formats are jpg, png, gif"
empty_file_error: "Please upload a valid image (jpg, png, gif)"

@ -84,7 +84,7 @@ de:
backlogs_product_backlog: "Produkt Backlog"
backlogs_product_backlog_is_empty: "Produkt Backlog ist leer"
backlogs_product_backlog_unsized: "Die Spitze des Produkt Backlogs hat Stories ohne Aufwandsangaben"
backlogs_sizing_inconsistent: "Story Aufwand weicht von den Schätzwerten ab"
backlogs_sizing_inconsistent: "Die Story-Aufwände weichen von den Schätzwerten ab"
backlogs_sprint_notes_missing: "Geschlossene Sprints ohne Closed sprints without Retrospective-/Besprechungsnotizen"
backlogs_sprint_unestimated: "Geschlossene oder aktive Sprints mit nicht abgeschätzten Stories"
backlogs_sprint_unsized: "Das Projekt hat Stories auf aktiven oder vor kurzem geschlossenen Sprints welche keine Aufwandsangaben enthalten"

@ -20,8 +20,8 @@ fi:
ifc_models: 'IFC models'
views:
viewer: 'Selain'
split: 'Viewer and table'
split: 'Näkymä ja tiedot'
split_cards: 'Selain ja kortit'
revit:
revit_add_in: "Revit Add-In"
revit_add_in_settings: "Revit Add-In settings"
revit_add_in: "Revit Lisäosa"
revit_add_in_settings: "Revit Lisäosa asetukset"

@ -108,7 +108,7 @@ module Pages
end
def expect_model_active(model, active = true)
expect(page).to have_field(model.id.to_s, checked: active)
expect(page).to have_field(model.id.to_s, checked: active, wait: 30)
end
def show_defaults(models = [])

@ -50,7 +50,7 @@ ko:
action_text_assignee: >
할당된 사용자에 기반한 자동화된 열이 있는 보드입니다. 작업 패키지 디스패치에 적합합니다.
action_text_version: >
Board with automated columns based on the version attribute. Ideal for planning product development.
버전 속성 컬럼이 있는 보드. 소프트웨어 개발 계획에 적합함.
action_type:
assignee: 담당자
status: 상태

@ -1,6 +1,6 @@
#English strings go here
tr:
permission_show_board_views: "Panoları görüntülemek"
permission_show_board_views: "Panoları görüntüle"
permission_manage_board_views: "Panoları yönet"
project_module_board_view: "Panolar"
boards:

@ -84,10 +84,11 @@ class BudgetsController < ApplicationController
def copy
source = Budget.find(params[:id].to_i)
@budget = Budget.new
if source
@budget.copy_from(source)
@budget = if source
Budget.new_copy(source)
else
Budget.new
end
@budget.fixed_date ||= Date.today

@ -63,25 +63,55 @@ class Budget < ApplicationRecord
Budget.replace_author_with_deleted_user user
end
def self.visible(user)
class << self
def visible(user)
includes(:project)
.references(:projects)
.merge(Project.allowed_to(user, :view_budgets))
end
# TODO: Extract into copy service
def new_copy(source)
copy = new(copy_attributes(source))
copy_budget_items(source, copy, items: :labor_budget_items)
copy_budget_items(source, copy, items: :material_budget_items)
copy
end
def replace_author_with_deleted_user(user)
substitute = DeletedUser.first
where(author_id: user.id).update_all(author_id: substitute.id)
end
protected
def copy_attributes(source)
source.attributes.slice('project_id', 'subject', 'description', 'fixed_date').merge('author' => User.current)
end
def copy_budget_items(source, sink, items:)
raise ArgumentError unless %i(labor_budget_items material_budget_items).include? items
source.send(items).each do |bi|
to_slice = if items == :material_budget_items
%w(units cost_type_id comments amount)
else
%w(hours user_id comments amount)
end
sink.send(items).build(bi.attributes.slice(*to_slice).merge('budget' => sink))
end
end
end
def initialize(attributes = nil)
super
self.author = User.current if new_record?
end
def copy_from(arg)
budget = (arg.is_a?(Budget) ? arg : self.class.find(arg))
attrs = budget.attributes.dup
super(attrs)
self.labor_budget_items = budget.labor_budget_items.map(&:dup)
self.material_budget_items = budget.material_budget_items.map(&:dup)
end
def budget
material_budget + labor_budget
end
@ -105,12 +135,6 @@ class Budget < ApplicationRecord
'budget'
end
def self.replace_author_with_deleted_user(user)
substitute = DeletedUser.first
where(author_id: user.id).update_all(author_id: substitute.id)
end
def to_s
subject
end

@ -0,0 +1,89 @@
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) 2012-2020 the OpenProject GmbH
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See docs/COPYRIGHT.rdoc for more details.
#++
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
describe 'Copying a budget', type: :feature, js: true do
let(:project) { FactoryBot.create :project, enabled_module_names: %i[budgets costs] }
let(:current_user) do
FactoryBot.create :user,
member_in_project: project,
member_with_permissions: %i(view_budgets edit_budgets view_hourly_rates view_cost_rates)
end
let(:original_author) { FactoryBot.create :user }
let(:budget_subject) { "A budget subject" }
let(:budget_description) { "A budget description" }
let!(:budget) do
FactoryBot.create :budget,
subject: budget_subject,
description: budget_description,
author: original_author,
project: project
end
let!(:cost_type) do
FactoryBot.create :cost_type, name: 'Post-war', unit: 'cap', unit_plural: 'caps'
end
let!(:cost_type_rate) { FactoryBot.create :cost_rate, cost_type: cost_type, rate: 50.0 }
let!(:default_hourly_rate) { FactoryBot.create :default_hourly_rate, user: original_author, rate: 25.0 }
let!(:material_budget_item) do
FactoryBot.create :material_budget_item,
units: 3,
cost_type: cost_type,
budget: budget
end
let!(:labor_budget_item) do
FactoryBot.create :labor_budget_item,
hours: 5,
user: original_author,
budget: budget
end
let(:budget_page) { Pages::EditBudget.new budget.id }
before do
login_as(current_user)
end
it 'copies all the items of the budget under the name of the copying user' do
budget_page.visit!
budget_page.click_copy
budget_page.expect_subject(budget_subject)
budget_page.expect_planned_costs!(type: :labor, row: 1, expected: '125.00 EUR')
budget_page.expect_planned_costs!(type: :material, row: 1, expected: '150.00 EUR')
click_button 'Create'
budget_page.expect_notification message: 'Successful creation.'
expect(page)
.to have_selector('.author', text: current_user.name)
end
end

@ -121,6 +121,11 @@ module Pages
end
end
def expect_subject(subject)
expect(page)
.to have_field("Subject", with: subject)
end
def unit_costs_at(num_row)
unit_costs_container.all('tbody td.currency')[num_row - 1]
end
@ -176,5 +181,9 @@ module Pages
def labor_rows
@labor_rows ||= 0
end
def notification_type
:rails
end
end
end

@ -39,6 +39,12 @@ module Pages
@budget_id = budget_id
end
def click_copy
within '.toolbar-items' do
click_link 'Copy'
end
end
def path
"/budgets/#{budget_id}"
end

@ -82,7 +82,7 @@ cs:
label_costlog: "Logované jednotkové náklady"
label_cost_plural: "Náklady"
label_cost_type_plural: "Typy nákladů"
label_cost_type_specific: "Cost type #%{id}: %{name}"
label_cost_type_specific: "Typ nákladu #%{id}: %{name}"
label_costs_per_page: "Náklady na stránku"
label_currency: "Měna"
label_currency_format: "Formát měny"
@ -132,7 +132,7 @@ cs:
permission_view_own_cost_entries: "Zobrazit vlastní rezervované náklady"
permission_view_own_hourly_rate: "Zobrazit vlastní hodinovou sazbu"
permission_view_own_time_entries: "Zobrazit vlastní strávený čas"
project_module_costs: "Time and costs"
project_module_costs: "Čas a náklady"
text_assign_time_and_cost_entries_to_project: "Přiřadit nahlášené hodiny a náklady projektu"
text_destroy_cost_entries_question: "%{cost_entries} byl nahlášen k pracovním balíčkům, které se chystáte odstranit. Co chcete udělat?"
text_destroy_time_and_cost_entries: "Odstranit nahlášené hodiny a náklady"

@ -44,7 +44,7 @@ class MeetingContentsController < ApplicationController
before_action :authorize
def show
if params[:id].present? && @content.version == params[:id].to_i
if params[:id].present? && @content.last_journal.version == params[:id].to_i
# Redirect links to the last version
redirect_to controller: '/meetings',
action: :show,

@ -59,7 +59,7 @@ de:
label_meeting_date_time: "Datum/Uhrzeit"
label_meeting_diff: "Differenz"
label_notify: "Zur Einsicht verschicken"
label_icalendar: "ICalendar senden"
label_icalendar: "iCalendar senden"
label_version: "Version"
label_time_zone: "Zeitzone"
label_start_date: "Anfangstermin"

@ -1,3 +1,4 @@
ar:
overviews:
label: 'نظرة عامة'
permission_manage_overview: 'Manage overview page'

@ -1,3 +1,4 @@
bg:
overviews:
label: 'Общ преглед'
permission_manage_overview: 'Manage overview page'

@ -1,3 +1,4 @@
ca:
overviews:
label: 'Visió general'
permission_manage_overview: 'Manage overview page'

@ -1,3 +1,4 @@
cs:
overviews:
label: 'Přehled'
permission_manage_overview: 'Manage overview page'

@ -1,3 +1,4 @@
da:
overviews:
label: 'Overblik'
permission_manage_overview: 'Manage overview page'

@ -1,3 +1,4 @@
de:
overviews:
label: 'Übersicht'
permission_manage_overview: 'Übersichtsseite verwalten'

@ -1,3 +1,4 @@
el:
overviews:
label: 'Επισκόπηση'
permission_manage_overview: 'Manage overview page'

@ -1,3 +1,4 @@
es:
overviews:
label: 'Resumen'
permission_manage_overview: 'Manage overview page'

@ -1,3 +1,4 @@
fi:
overviews:
label: 'Yleiskatsaus'
permission_manage_overview: 'Manage overview page'

@ -1,3 +1,4 @@
fil:
overviews:
label: 'Buod'
permission_manage_overview: 'Manage overview page'

@ -1,3 +1,4 @@
fr:
overviews:
label: 'Vue globale'
permission_manage_overview: 'Gérer la page d''aperçu'

@ -1,3 +1,4 @@
hr:
overviews:
label: 'Pregled'
permission_manage_overview: 'Manage overview page'

@ -1,3 +1,4 @@
hu:
overviews:
label: 'Áttekintés'
permission_manage_overview: 'Manage overview page'

@ -1,3 +1,4 @@
id:
overviews:
label: 'Tinjauan'
permission_manage_overview: 'Manage overview page'

@ -1,3 +1,4 @@
it:
overviews:
label: 'Panoramica'
permission_manage_overview: 'Manage overview page'

@ -1,3 +1,4 @@
ja:
overviews:
label: '概要'
permission_manage_overview: 'Manage overview page'

@ -1,3 +1,4 @@
ko:
overviews:
label: '요약'
permission_manage_overview: '개요 페이지 관리'

@ -1,3 +1,4 @@
lt:
overviews:
label: 'Peržiūra'
permission_manage_overview: 'Valdyti apžvalgos puslapį'

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save