Release OpenProject 11.0.2

pull/8872/head v11.0.2
ulferts 4 years ago
commit e11c1eec03
No known key found for this signature in database
GPG Key ID: A205708DE1284017
  1. 2
      Gemfile.lock
  2. 10
      app/contracts/model_contract.rb
  3. 77
      app/contracts/wiki_pages/base_contract.rb
  4. 37
      app/contracts/wiki_pages/copy_contract.rb
  5. 39
      app/contracts/wiki_pages/create_contract.rb
  6. 2
      app/controllers/search_controller.rb
  7. 2
      app/models/activities/wiki_content_activity_provider.rb
  8. 2
      app/models/journal.rb
  9. 2
      app/models/journal/aggregated_journal.rb
  10. 6
      app/models/project.rb
  11. 44
      app/models/wiki_content.rb
  12. 6
      app/models/wiki_page.rb
  13. 6
      app/services/concerns/contracted.rb
  14. 7
      app/services/copy/concerns/copy_attachments.rb
  15. 14
      app/services/notifications/journal_notification_service.rb
  16. 120
      app/services/notifications/journal_wiki_mail_service.rb
  17. 2
      app/services/notifications/journal_wp_mail_service.rb
  18. 74
      app/services/projects/concerns/new_project_service.rb
  19. 69
      app/services/projects/copy/wiki_dependent_service.rb
  20. 4
      app/services/projects/copy/work_packages_dependent_service.rb
  21. 1
      app/services/projects/copy_service.rb
  22. 11
      app/services/projects/create_service.rb
  23. 79
      app/services/wiki_pages/copy_service.rb
  24. 15
      app/services/wiki_pages/create_service.rb
  25. 72
      app/services/wiki_pages/set_attributes_service.rb
  26. 2
      app/services/work_packages/copy_service.rb
  27. 26
      app/workers/notify_journal_completed_job.rb
  28. 4
      config/initializers/subscribe_listeners.rb
  29. 1
      config/locales/crowdin/ar.yml
  30. 1
      config/locales/crowdin/bg.yml
  31. 1
      config/locales/crowdin/ca.yml
  32. 1
      config/locales/crowdin/cs.yml
  33. 1
      config/locales/crowdin/da.yml
  34. 3
      config/locales/crowdin/de.yml
  35. 1
      config/locales/crowdin/el.yml
  36. 1
      config/locales/crowdin/es.yml
  37. 9
      config/locales/crowdin/fi.yml
  38. 1
      config/locales/crowdin/fil.yml
  39. 1
      config/locales/crowdin/fr.yml
  40. 1
      config/locales/crowdin/hr.yml
  41. 1
      config/locales/crowdin/hu.yml
  42. 1
      config/locales/crowdin/id.yml
  43. 1
      config/locales/crowdin/it.yml
  44. 15
      config/locales/crowdin/ja.yml
  45. 6
      config/locales/crowdin/js-ja.yml
  46. 1
      config/locales/crowdin/ko.yml
  47. 1
      config/locales/crowdin/lt.yml
  48. 1
      config/locales/crowdin/nl.yml
  49. 1
      config/locales/crowdin/no.yml
  50. 1
      config/locales/crowdin/pl.yml
  51. 1
      config/locales/crowdin/pt.yml
  52. 1
      config/locales/crowdin/ro.yml
  53. 1
      config/locales/crowdin/ru.yml
  54. 1
      config/locales/crowdin/sk.yml
  55. 1
      config/locales/crowdin/sl.yml
  56. 1
      config/locales/crowdin/sv.yml
  57. 1
      config/locales/crowdin/tr.yml
  58. 1
      config/locales/crowdin/uk.yml
  59. 1
      config/locales/crowdin/vi.yml
  60. 1
      config/locales/crowdin/zh-CN.yml
  61. 1
      config/locales/crowdin/zh-TW.yml
  62. 1
      config/locales/en.yml
  63. 2
      docker-compose.yml
  64. 16
      docs/api/apiv3/client-libraries/README.md
  65. 24
      docs/cloud-edition-guide/README.md
  66. 4
      docs/cloud-edition-guide/backups/README.md
  67. 10
      docs/cloud-edition-guide/book-cloud-edition/README.md
  68. 6
      docs/cloud-edition-guide/create-trial-installation/README.md
  69. 10
      docs/cloud-edition-guide/invoices-and-billing-history/README.md
  70. 14
      docs/cloud-edition-guide/manage-subscription/README.md
  71. 10
      docs/cloud-edition-guide/sign-in/README.md
  72. 8
      docs/cloud-edition-guide/support/README.md
  73. 2
      docs/development/concepts/inline-editing/README.md
  74. 4
      docs/development/concepts/queries/README.md
  75. 26
      docs/enterprise-edition-guide/README.md
  76. 22
      docs/enterprise-edition-guide/activate-enterprise-edition/README.md
  77. 6
      docs/enterprise-edition-guide/enterprise-trial/README.md
  78. 8
      docs/enterprise-edition-guide/support/README.md
  79. 10
      docs/getting-started/README.md
  80. 10
      docs/getting-started/openproject-introduction/README.md
  81. 4
      docs/installation-and-operations/README.md
  82. 81
      docs/installation-and-operations/changing-to-bim-edition/README.md
  83. 4
      docs/installation-and-operations/installation/README.md
  84. 27
      docs/release-notes/11-0-2/README.md
  85. 7
      docs/release-notes/README.md
  86. 2
      docs/system-admin-guide/custom-fields/custom-fields-projects/README.md
  87. 2
      docs/system-admin-guide/system-settings/project-system-settings/README.md
  88. 2
      docs/user-guide/gantt-chart/README.md
  89. 2
      docs/user-guide/projects/README.md
  90. 2
      docs/user-guide/work-packages/README.md
  91. 2
      docs/user-guide/work-packages/create-work-package/README.md
  92. 4005
      frontend/npm-shrinkwrap.json
  93. 2
      frontend/package.json
  94. 3
      frontend/src/app/modules/grids/widgets/time-entries/current-user/time-entries-current-user-configuration.modal.html
  95. 1
      lib/open_project/events.rb
  96. 2
      lib/open_project/version.rb
  97. 4
      modules/bim/config/locales/crowdin/ja.yml
  98. 6
      modules/boards/config/locales/crowdin/js-ja.yml
  99. 2
      modules/costs/app/contracts/time_entries/create_contract.rb
  100. 6
      modules/costs/spec/contracts/time_entries/create_contract_spec.rb
  101. Some files were not shown because too many files have changed in this diff Show More

@ -713,7 +713,7 @@ GEM
eventmachine_httpserver eventmachine_httpserver
http_parser.rb (~> 0.6.0) http_parser.rb (~> 0.6.0)
multi_json multi_json
puma (5.0.2) puma (5.0.4)
nio4r (~> 2.0) nio4r (~> 2.0)
rack (2.2.3) rack (2.2.3)
rack-accept (0.4.5) rack-accept (0.4.5)

@ -70,11 +70,11 @@ class ModelContract < Disposable::Twin
end end
def property(name, options = {}, &block) def property(name, options = {}, &block)
if twin = options.delete(:form) if (twin = options.delete(:form))
options[:twin] = twin options[:twin] = twin
end end
if validates_options = options[:validates] if (validates_options = options[:validates])
validates name, validates_options validates name, validates_options
end end
@ -211,7 +211,7 @@ class ModelContract < Disposable::Twin
end end
def attributes_changed_by_user def attributes_changed_by_user
changed = model.changed changed = changed_attributes
if options[:changed_by_system] if options[:changed_by_system]
changed -= options[:changed_by_system] changed -= options[:changed_by_system]
@ -220,6 +220,10 @@ class ModelContract < Disposable::Twin
changed changed
end end
def changed_attributes
model.changed
end
def collect_ancestor_attribute_aliases def collect_ancestor_attribute_aliases
@ancestor_attribute_aliases ||= collect_ancestor_attributes(:attribute_aliases) @ancestor_attribute_aliases ||= collect_ancestor_attributes(:attribute_aliases)
end end

@ -0,0 +1,77 @@
#-- 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.
#++
# Validates both the wiki page as well as its associated wiki content. The two are
# considered to be one outside of this contract.
module WikiPages
class BaseContract < ::ModelContract
attribute :wiki
attribute :title
attribute :slug
attribute :parent
attribute :text
attribute :protected
validate :validate_author_is_set
validate :validate_wiki_is_set
validate :validate_content_is_set
validate :validate_user_edit_allowed
validate :validate_user_protect_permission
private
def validate_user_edit_allowed
if model.project && !user.allowed_to?(:edit_wiki_pages, model.project) ||
(model.protected_was && !user.allowed_to?(:protect_wiki_pages))
errors.add :base, :error_unauthorized
end
end
def validate_author_is_set
errors.add :author, :blank if model.content&.author.nil?
end
def validate_wiki_is_set
errors.add :wiki, :blank if model.wiki.nil?
end
def validate_content_is_set
errors.add :content, :blank if model.content.nil?
end
def validate_user_protect_permission
if model.protected_changed? && !user.allowed_to?(:protect_wiki_pages, model.project)
errors.add :protected, :error_unauthorized
end
end
def changed_attributes
model.changed + (model.content&.changed || [])
end
end
end

@ -0,0 +1,37 @@
#-- 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.
#++
module WikiPages
class CopyContract < CreateContract
# Disable check for edit_wiki_pages permission
def validate_user_edit_allowed; end
# Disable check for protect_wiki_pages permission
def validate_user_protect_permission; end
end
end

@ -0,0 +1,39 @@
#-- 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.
#++
module WikiPages
class CreateContract < BaseContract
validate :validate_user_current_user
private
def validate_user_current_user
errors.add :author, :not_current_user if model.content&.author != user
end
end
end

@ -178,7 +178,7 @@ class SearchController < ApplicationController
end end
def provision_gon def provision_gon
available_search_types = Redmine::Search.available_search_types.dup.push('all') available_search_types = search_types.dup.push('all')
gon.global_search = { gon.global_search = {
search_term: @question, search_term: @question,

@ -77,6 +77,6 @@ class Activities::WikiContentActivityProvider < Activities::BaseActivityProvider
end end
def url_helper_parameter(event) def url_helper_parameter(event)
[event['project_id'], event['wiki_title'], { version: event['version'] }] [event['project_id'], event['wiki_title'].to_url, { version: event['version'] }]
end end
end end

@ -112,7 +112,7 @@ class Journal < ApplicationRecord
private private
def destroy_data def destroy_data
data.destroy data&.destroy
end end
def predecessor def predecessor

@ -76,7 +76,7 @@ class Journal::AggregatedJournal
# Returns whether "notification-hiding" should be assumed for the given journal pair. # Returns whether "notification-hiding" should be assumed for the given journal pair.
# This leads to an aggregated journal effectively blocking notifications of an earlier journal, # This leads to an aggregated journal effectively blocking notifications of an earlier journal,
# because it "steals" the addition from its predecessor. See the specs section under # because it "steals" the addition from its predecessor. See the specs section under
# "mail suppressing aggregation" (for EnqueueWorkPackageNotificationJob) for more details # "mail suppressing aggregation" (for NotifyJournalCompletedJob) for more details
def hides_notifications?(successor, predecessor) def hides_notifications?(successor, predecessor)
return false unless successor && predecessor return false unless successor && predecessor
return false if belong_to_different_groups?(predecessor, successor) return false if belong_to_different_groups?(predecessor, successor)

@ -148,6 +148,12 @@ class Project < ApplicationRecord
project_key: 'id', project_key: 'id',
permission: nil permission: nil
# Necessary for acts_as_searchable which depends on the event_datetime method for sorting
acts_as_event title: Proc.new { |o| "#{Project.model_name.human}: #{o.name}" },
url: Proc.new { |o| { controller: 'overviews/overviews', action: 'show', project_id: o } },
author: nil,
datetime: :created_at
validates :name, validates :name,
presence: true, presence: true,
length: { maximum: 255 } length: { maximum: 255 }

@ -27,9 +27,9 @@
# See docs/COPYRIGHT.rdoc for more details. # See docs/COPYRIGHT.rdoc for more details.
#++ #++
require 'zlib'
class WikiContent < ApplicationRecord class WikiContent < ApplicationRecord
extend DeprecatedAlias
belongs_to :page, class_name: 'WikiPage', foreign_key: 'page_id' belongs_to :page, class_name: 'WikiPage', foreign_key: 'page_id'
belongs_to :author, class_name: 'User', foreign_key: 'author_id' belongs_to :author, class_name: 'User', foreign_key: 'author_id'
validates_length_of :comments, maximum: 255, allow_nil: true validates_length_of :comments, maximum: 255, allow_nil: true
@ -37,8 +37,6 @@ class WikiContent < ApplicationRecord
attr_accessor :comments attr_accessor :comments
before_save :comments_to_journal_notes before_save :comments_to_journal_notes
after_create :send_content_added_mail
after_update :send_content_updated_mail, if: :saved_change_to_text?
acts_as_journalized acts_as_journalized
@ -76,16 +74,7 @@ class WikiContent < ApplicationRecord
super value.presence || '' super value.presence || ''
end end
# Returns the mail adresses of users that should be notified deprecated_alias :versions, :journals
def recipients
notified = project.notified_users
notified.select { |user| visible?(user) }
end
# FIXME: Deprecate
def versions
journals
end
# REVIEW # REVIEW
def version def version
@ -97,31 +86,4 @@ class WikiContent < ApplicationRecord
def comments_to_journal_notes def comments_to_journal_notes
add_journal author, comments add_journal author, comments
end end
def send_content_added_mail
return unless Setting.notified_events.include?('wiki_content_added')
create_recipients.uniq.each do |user|
UserMailer.wiki_content_added(user, self, User.current).deliver_later
end
end
def send_content_updated_mail
return unless Setting.notified_events.include?('wiki_content_updated')
update_recipients.uniq.each do |user|
UserMailer.wiki_content_updated(user, self, User.current).deliver_later
end
end
def create_recipients
recipients +
page.wiki.watcher_recipients
end
def update_recipients
recipients +
page.wiki.watcher_recipients +
page.watcher_recipients
end
end end

@ -217,11 +217,7 @@ class WikiPage < ApplicationRecord
end end
def breadcrumb_title def breadcrumb_title
if item = menu_item menu_item&.title || title
item.title
else
title
end
end end
def to_param def to_param

@ -103,7 +103,11 @@ module Contracted
end end
def changed_compared_to(prior_changes) def changed_compared_to(prior_changes)
model.changed.select { |c| !prior_changes[c] || prior_changes[c].last != model.changes[c].last } changed_attributes.select { |c| !prior_changes[c] || prior_changes[c].last != model.changes[c].last }
end
def changed_attributes
model.changed
end end
end end
end end

@ -4,12 +4,13 @@ module Copy
## ##
# Tries to copy the given attachment between containers # Tries to copy the given attachment between containers
def copy_attachments(from_container_id, to_container_id, container_type) def copy_attachments(from_container, to_container_id)
Attachment.where(container_id: from_container_id).find_each do |old_attachment| Attachment.where(container: from_container).find_each do |old_attachment|
copied = old_attachment.dup copied = old_attachment.dup
old_attachment.file.copy_to(copied) old_attachment.file.copy_to(copied)
copied.container_type = container_type copied.author = user
copied.container_type = from_container.class.name
copied.container_id = to_container_id copied.container_id = to_container_id
unless copied.save unless copied.save

@ -30,18 +30,14 @@
class Notifications::JournalNotificationService class Notifications::JournalNotificationService
class << self class << self
include Notifications::JournalNotifier
def call(journal, send_mails) def call(journal, send_mails)
if journal.journable_type == 'WorkPackage' enqueue_notification(journal, send_mails) if supported?(journal)
enqueue_work_package_notification(journal, send_mails)
end
end end
private private
def enqueue_work_package_notification(journal, send_mails) def enqueue_notification(journal, send_mails)
EnqueueWorkPackageNotificationJob NotifyJournalCompletedJob
.set(wait_until: delivery_time) .set(wait_until: delivery_time)
.perform_later(journal.id, send_mails) .perform_later(journal.id, send_mails)
end end
@ -49,5 +45,9 @@ class Notifications::JournalNotificationService
def delivery_time def delivery_time
Setting.journal_aggregation_time_minutes.to_i.minutes.from_now Setting.journal_aggregation_time_minutes.to_i.minutes.from_now
end end
def supported?(journal)
%w(WorkPackage WikiContent).include?(journal.journable_type)
end
end end
end end

@ -0,0 +1,120 @@
#-- 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 Notifications::JournalWikiMailService
class << self
def call(journal, send_mails)
new(journal)
.call(send_mails)
end
end
attr_reader :journal
def initialize(journal)
@journal = journal
end
def call(send_mails)
return unless send_mail?(send_mails)
if journal.initial?
send_content_added_mail
else
send_content_updated_mail
end
end
private
def send_mail?(send_mails)
send_mails && ::UserMailer.perform_deliveries && !journal.noop?
end
def send_content_added_mail
send_content(create_recipients, :wiki_content_added)
end
def send_content_updated_mail
send_content(update_recipients, :wiki_content_updated)
end
def notification_disabled?(name)
!Setting.notified_events.include?(name)
end
# Returns the mail addresses of users that should be notified
def recipients
project
.notified_users
.select { |user| wiki_content.visible?(user) }
end
def send_content(recipients, method)
return if notification_disabled?(method.to_s)
recipients.uniq.each do |user|
UserMailer
.send(method, user, wiki_content, journal_user)
.deliver_later
end
end
def create_recipients
recipients +
wiki.watcher_recipients
end
def update_recipients
recipients +
wiki.watcher_recipients +
page.watcher_recipients
end
def wiki_content
journal.journable
end
def page
wiki_content.page
end
def wiki
page.wiki
end
def project
wiki.project
end
def journal_user
journal.user || DeletedUser.first
end
end

@ -30,8 +30,6 @@
class Notifications::JournalWpMailService class Notifications::JournalWpMailService
class << self class << self
include Notifications::JournalNotifier
def call(journal, send_mails) def call(journal, send_mails)
journal_complete_mail(journal, send_mails) journal_complete_mail(journal, send_mails)
end end

@ -0,0 +1,74 @@
#-- 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.
#++
module Projects::Concerns
module NewProjectService
private
def after_perform(attributes_call)
new_project = attributes_call.result
set_default_role(new_project) unless user.admin?
notify_project_created(new_project)
super
end
# Add default role to the newly created project
# based on the setting ('new_project_user_role_id')
# defined in the administration. Will either create a new membership
# or add a role to an already existing one.
def set_default_role(new_project)
role = Role.in_new_project
return unless role && new_project.persisted?
# Assuming the members are loaded anyway
user_member = new_project.members.detect { |m| m.principal == user }
if user_member
Members::UpdateService
.new(user: user, model: user_member, contract_class: EmptyContract)
.call(roles: user_member.roles + [role])
else
Members::CreateService
.new(user: user, contract_class: EmptyContract)
.call(roles: [role], project: new_project, principal: user)
end
end
def notify_project_created(new_project)
OpenProject::Notifications.send(
OpenProject::Events::PROJECT_CREATED,
project: new_project
)
end
end
end

@ -46,47 +46,72 @@ module Projects::Copy
target.wiki.wiki_menu_items.delete_all target.wiki.wiki_menu_items.delete_all
copy_wiki_pages(params) copy_wiki_pages(params)
copy_wiki_menu_items(params) copy_wiki_menu_items
end end
# Copies wiki pages from +project+, requires a wiki to be already set # Copies wiki pages from +project+, requires a wiki to be already set
def copy_wiki_pages(params) def copy_wiki_pages(params)
wiki_pages_map = {} wiki_pages_map = {}
source.wiki.pages.find_each do |page| # Copying top down so that the hierarchy (parent attribute)
# Skip pages without content # can be rewritten along the way.
next if page.content.nil? pages_top_down do |page|
new_parent = wiki_pages_map[page.parent]
wiki_pages_map[page] = copy_wiki_page(page, new_parent)
end
new_wiki_content = WikiContent.new(page.content.attributes.dup.except('id', 'page_id', 'updated_at')) # Copy attachments
attributes = page if should_copy?(params, :wiki_page_attachments)
.attributes.dup.except('id', 'wiki_id', 'created_on', 'parent_id') wiki_pages_map.each do |old_page, new_page|
.merge(content: new_wiki_content) next unless old_page && new_page
new_wiki_page = target.wiki.pages.create attributes copy_attachments(old_page, new_page.id)
wiki_pages_map[page] = new_wiki_page end
end
end end
# Save the wiki def copy_wiki_page(source_page, new_parent)
target.wiki.save # Skip pages without content
return if source_page.content.nil?
# Relying on ActionMailer::Base.perform_deliveries is violating cohesion
# but the value is currently not otherwise provided
service_call = WikiPages::CopyService
.new(user: user, model: source_page, contract_class: WikiPages::CopyContract)
.call(wiki: target.wiki,
parent: new_parent,
send_notifications: ActionMailer::Base.perform_deliveries)
if service_call.success?
service_call.result
else
add_error!(source_page, service_call.errors)
Rails.logger.warn do
"Project#copy_wiki_page: wiki_page ##{source_page.id} could not be copied: #{service_call.message}"
end
# Reproduce page hierarchy nil
source.project.wiki.pages.each do |page|
if page.parent_id && wiki_pages_map[page]
wiki_pages_map[page].parent = wiki_pages_map[page.parent]
wiki_pages_map[page].save
end end
end end
# Copy attachments def pages_top_down(&block)
if should_copy?(params, :wiki_page_attachments) id_by_parent = source.wiki.pages.pluck(:parent_id, :id).inject(Hash.new { [] }) { |h, (k, v)| h[k] += [v]; h }
wiki_pages_map.each do |old_page, new_page|
copy_attachments(old_page.id, new_page.id, new_page.class.name) yield_downwards(id_by_parent, nil, &block)
end end
def yield_downwards(map, current, &block)
map[current].each do |child_id|
child = source.wiki.pages.find(child_id)
yield child
yield_downwards(map, child_id, &block)
end end
end end
# Copies wiki_menu_items from +project+, requires a wiki to be already set # Copies wiki_menu_items from +project+, requires a wiki to be already set
def copy_wiki_menu_items(params) def copy_wiki_menu_items
wiki_menu_items_map = {} wiki_menu_items_map = {}
source.wiki.wiki_menu_items.each do |item| source.wiki.wiki_menu_items.each do |item|

@ -68,7 +68,7 @@ module Projects::Copy
# Attachments # Attachments
if should_copy?(params, :work_package_attachments) if should_copy?(params, :work_package_attachments)
copy_attachments(wp.id, new_wp_id, 'WorkPackage') copy_attachments(wp, new_wp_id)
end end
copy_relations(wp, new_wp_id, work_packages_map) copy_relations(wp, new_wp_id, work_packages_map)
@ -84,7 +84,7 @@ module Projects::Copy
.new(user: user, .new(user: user,
work_package: source_work_package, work_package: source_work_package,
contract_class: WorkPackages::CopyProjectContract) contract_class: WorkPackages::CopyProjectContract)
.call(overrides) .call(**overrides)
if service_call.success? if service_call.success?
service_call.result service_call.result

@ -30,6 +30,7 @@
module Projects module Projects
class CopyService < ::BaseServices::Copy class CopyService < ::BaseServices::Copy
include Projects::Concerns::NewProjectService
## ##
# In case a rollback is needed, # In case a rollback is needed,

@ -30,15 +30,6 @@
module Projects module Projects
class CreateService < ::BaseServices::Create class CreateService < ::BaseServices::Create
def after_perform(attributes_call) include Projects::Concerns::NewProjectService
attributes_call.result.add_member!(user, Role.in_new_project) unless user.admin?
OpenProject::Notifications.send(
OpenProject::Events::PROJECT_CREATED,
project: attributes_call.result
)
super
end
end end
end end

@ -0,0 +1,79 @@
#-- 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 WikiPages::CopyService
include ::Shared::ServiceContext
include Contracted
attr_accessor :user,
:model,
:contract_class
def initialize(user:, model:, contract_class: WikiPages::CreateContract)
self.user = user
self.model = model
self.contract_class = contract_class
end
def call(send_notifications: true, **attributes)
in_context(model, send_notifications) do
copy(attributes)
end
end
protected
def copy(attribute_override)
attributes = copied_attributes(attribute_override)
create(attributes)
end
def create(attributes)
WikiPages::CreateService
.new(user: user,
contract_class: contract_class)
.call(attributes.symbolize_keys)
end
# Copy the wiki page attributes together with the wiki page content attributes
def copied_attributes(override)
model
.attributes
.merge(model.content.attributes)
.slice(*writable_attributes)
.merge(override)
end
def writable_attributes
instantiate_contract(model, user)
.writable_attributes
end
end

@ -28,18 +28,5 @@
# See docs/COPYRIGHT.rdoc for more details. # See docs/COPYRIGHT.rdoc for more details.
#++ #++
module Notifications::JournalNotifier class WikiPages::CreateService < ::BaseServices::Create
private
def find_aggregated_journal_for(raw_journal)
Journal::AggregatedJournal.with_version(raw_journal)
end
def notify_journal_complete(journal, send_mails)
OpenProject::Notifications.send(
OpenProject::Events::AGGREGATED_WORK_PACKAGE_JOURNAL_READY,
journal: journal,
send_mail: send_mails
)
end
end end

@ -0,0 +1,72 @@
#-- 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.
#++
# Handles setting the attributes of a wiki page.
# The wiki page is treated as one single entity although the data layer separates
# between the page and the content.
#
# In the long run, those two should probably be unified on the data layer as well.
#
# Attributes for both the page as well as for the content are accepted.
class WikiPages::SetAttributesService < ::BaseServices::SetAttributes
private
def set_attributes(params)
content_params, page_params = split_page_and_content_params(params.with_indifferent_access)
set_page_attributes(page_params)
set_default_attributes(params) if model.new_record?
set_content_attributes(content_params)
end
def set_page_attributes(params)
model.attributes = params
end
def set_default_attributes(_params)
change_by_system do
model.build_content author: user
end
end
def set_content_attributes(params)
model.content.attributes = params
end
def split_page_and_content_params(params)
params.partition { |p, _| WikiContent.column_names.include?(p) }.map(&:to_h)
end
def changed_attributes
super + (model.content&.changed || [])
end
end

@ -68,7 +68,7 @@ class WorkPackages::CopyService
WorkPackages::CreateService WorkPackages::CreateService
.new(user: user, .new(user: user,
contract_class: contract_class) contract_class: contract_class)
.call(attributes.merge(send_notifications: send_notifications).symbolize_keys) .call(**attributes.merge(send_notifications: send_notifications).symbolize_keys)
end end
def copied_attributes(wp, override) def copied_attributes(wp, override)

@ -27,12 +27,9 @@
# See docs/COPYRIGHT.rdoc for more details. # See docs/COPYRIGHT.rdoc for more details.
#++ #++
# Enqueues class NotifyJournalCompletedJob < ApplicationJob
class EnqueueWorkPackageNotificationJob < ApplicationJob
queue_with_priority :notification queue_with_priority :notification
include Notifications::JournalNotifier
def perform(journal_id, send_mails) def perform(journal_id, send_mails)
# This is caused by a DJ job running as ActiveJob # This is caused by a DJ job running as ActiveJob
@journal_id = journal_id @journal_id = journal_id
@ -72,6 +69,16 @@ class EnqueueWorkPackageNotificationJob < ApplicationJob
notify_journal_complete(aggregated_predecessor, @send_mails) notify_journal_complete(aggregated_predecessor, @send_mails)
end end
def find_aggregated_journal_for(raw_journal)
Journal::AggregatedJournal.with_version(raw_journal)
end
def notify_journal_complete(journal, send_mails)
OpenProject::Notifications.send(notification_event_type(journal),
journal: journal,
send_mail: send_mails)
end
def raw_journal def raw_journal
@raw_journal ||= Journal.find_by(id: @journal_id) @raw_journal ||= Journal.find_by(id: @journal_id)
end end
@ -79,4 +86,15 @@ class EnqueueWorkPackageNotificationJob < ApplicationJob
def work_package def work_package
@work_package ||= raw_journal.journable @work_package ||= raw_journal.journable
end end
def notification_event_type(journal)
case journal.journable_type
when WikiContent.name
OpenProject::Events::AGGREGATED_WIKI_JOURNAL_READY
when WorkPackage.name
OpenProject::Events::AGGREGATED_WORK_PACKAGE_JOURNAL_READY
else
raise 'Unsupported journal created event type'
end
end
end end

@ -36,6 +36,10 @@ OpenProject::Notifications.subscribe(OpenProject::Events::AGGREGATED_WORK_PACKAG
Notifications::JournalWpMailService.call(payload[:journal], payload[:send_mail]) Notifications::JournalWpMailService.call(payload[:journal], payload[:send_mail])
end end
OpenProject::Notifications.subscribe(OpenProject::Events::AGGREGATED_WIKI_JOURNAL_READY) do |payload|
Notifications::JournalWikiMailService.call(payload[:journal], payload[:send_mail])
end
OpenProject::Notifications.subscribe('watcher_added') do |payload| OpenProject::Notifications.subscribe('watcher_added') do |payload|
WatcherAddedNotificationMailer.handle_watcher(payload[:watcher], payload[:watcher_setter]) WatcherAddedNotificationMailer.handle_watcher(payload[:watcher], payload[:watcher_setter])
end end

@ -541,6 +541,7 @@ ar:
invalid_url: 'is not a valid URL.' invalid_url: 'is not a valid URL.'
invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).'
less_than_or_equal_to: "يجب أن يكون أقل من أو يساوي %{count}." less_than_or_equal_to: "يجب أن يكون أقل من أو يساوي %{count}."
not_current_user: "is not the current user."
not_a_date: "is not a valid date." not_a_date: "is not a valid date."
not_a_datetime: "is not a valid date time." not_a_datetime: "is not a valid date time."
not_a_number: "ليس رقماً." not_a_number: "ليس رقماً."

@ -537,6 +537,7 @@ bg:
invalid_url: 'невалиден URL адрес.' invalid_url: 'невалиден URL адрес.'
invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).'
less_than_or_equal_to: "трябва да бъде по-малка или равна на %{count}." less_than_or_equal_to: "трябва да бъде по-малка или равна на %{count}."
not_current_user: "is not the current user."
not_a_date: "is not a valid date." not_a_date: "is not a valid date."
not_a_datetime: "is not a valid date time." not_a_datetime: "is not a valid date time."
not_a_number: "не е число." not_a_number: "не е число."

@ -537,6 +537,7 @@ ca:
invalid_url: 'is not a valid URL.' invalid_url: 'is not a valid URL.'
invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).'
less_than_or_equal_to: "ha de ser menor o igual a %{count}." less_than_or_equal_to: "ha de ser menor o igual a %{count}."
not_current_user: "is not the current user."
not_a_date: "is not a valid date." not_a_date: "is not a valid date."
not_a_datetime: "is not a valid date time." not_a_datetime: "is not a valid date time."
not_a_number: "no és un número." not_a_number: "no és un número."

@ -539,6 +539,7 @@ cs:
invalid_url: 'není platná adresa URL.' invalid_url: 'není platná adresa URL.'
invalid_url_scheme: 'není podporovaný protokol (povoleny: %{allowed_schemes}).' invalid_url_scheme: 'není podporovaný protokol (povoleny: %{allowed_schemes}).'
less_than_or_equal_to: "musí být menší než nebo rovno %{count}." less_than_or_equal_to: "musí být menší než nebo rovno %{count}."
not_current_user: "is not the current user."
not_a_date: "není platné datum." not_a_date: "není platné datum."
not_a_datetime: "není platný čas." not_a_datetime: "není platný čas."
not_a_number: "není číslo." not_a_number: "není číslo."

@ -537,6 +537,7 @@ da:
invalid_url: 'is not a valid URL.' invalid_url: 'is not a valid URL.'
invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).'
less_than_or_equal_to: "skal være mindre end eller lig med %{count}." less_than_or_equal_to: "skal være mindre end eller lig med %{count}."
not_current_user: "is not the current user."
not_a_date: "is not a valid date." not_a_date: "is not a valid date."
not_a_datetime: "is not a valid date time." not_a_datetime: "is not a valid date time."
not_a_number: "er ikke et tal." not_a_number: "er ikke et tal."

@ -329,7 +329,7 @@ de:
other: "Der Account wird aus dem System entfernt. Der Nutzer wird daher nicht mehr in der Lage sein, sich mit seinem derzeitigen Nutzernamen und Passwort anzumelden. Sofern der Nutzer es wünscht, kann er sich über die von der Anwendung zur Verfügung gestellten Mechanismen einen neuen Account zulegen." other: "Der Account wird aus dem System entfernt. Der Nutzer wird daher nicht mehr in der Lage sein, sich mit seinem derzeitigen Nutzernamen und Passwort anzumelden. Sofern der Nutzer es wünscht, kann er sich über die von der Anwendung zur Verfügung gestellten Mechanismen einen neuen Account zulegen."
self: "Ihr Account wird aus dem System entfernt. Sie werden daher nicht mehr in der Lage sein, sich mit Ihrem derzeitigen Nutzernamen und Passwort anzumelden. Sofern Sie es wünschen, können Sie sich über die von der Anwendung zur Verfügung gestellten Mechanismen einen neuen Account zulegen." self: "Ihr Account wird aus dem System entfernt. Sie werden daher nicht mehr in der Lage sein, sich mit Ihrem derzeitigen Nutzernamen und Passwort anzumelden. Sofern Sie es wünschen, können Sie sich über die von der Anwendung zur Verfügung gestellten Mechanismen einen neuen Account zulegen."
login_verification: login_verification:
other: "Geben sie den %{name} ein um die löschung zu verifizieren. Zusätzlich müssen sie nach dem Absenden des Formulars ihr Password bestätigen." other: "Geben Sie den Nutzernamen %{name} ein um die Löschung zu verifizieren. Zusätzlich müssen Sie nach dem Absenden des Formulars Ihr Passwort bestätigen."
self: "Gebe deinen Login %{name} ein, um den Löschvorgang zu bestätigen. Sie müssen zusätzlich nach dem Absenden des Formulars Ihr Password bestätigen." self: "Gebe deinen Login %{name} ein, um den Löschvorgang zu bestätigen. Sie müssen zusätzlich nach dem Absenden des Formulars Ihr Password bestätigen."
error_inactive_activation_by_mail: > error_inactive_activation_by_mail: >
Ihr Konto wurde noch nicht aktiviert. Zur Aktivierung folgen Sie bitte dem Link, der Ihnen bei der Registrierung per E-Mail zugeschickt wurde. Ihr Konto wurde noch nicht aktiviert. Zur Aktivierung folgen Sie bitte dem Link, der Ihnen bei der Registrierung per E-Mail zugeschickt wurde.
@ -532,6 +532,7 @@ de:
invalid_url: 'ist keine gültige URL.' invalid_url: 'ist keine gültige URL.'
invalid_url_scheme: 'ist kein unterstütztes Protokoll (erlaubt: %{allowed_schemes}).' invalid_url_scheme: 'ist kein unterstütztes Protokoll (erlaubt: %{allowed_schemes}).'
less_than_or_equal_to: "muss kleiner oder gleich %{count} sein." less_than_or_equal_to: "muss kleiner oder gleich %{count} sein."
not_current_user: "is not the current user."
not_a_date: "ist kein gültiges Datum." not_a_date: "ist kein gültiges Datum."
not_a_datetime: "ist kein gültiges Datum." not_a_datetime: "ist kein gültiges Datum."
not_a_number: "ist keine Zahl." not_a_number: "ist keine Zahl."

@ -534,6 +534,7 @@ el:
invalid_url: 'δεν είναι μια έγκυρη διεύθυνση URL.' invalid_url: 'δεν είναι μια έγκυρη διεύθυνση URL.'
invalid_url_scheme: 'δεν είναι υποστηριζόμενο πρωτόκολλο (επιτρεπόμενα: %{allowed_schemes}).' invalid_url_scheme: 'δεν είναι υποστηριζόμενο πρωτόκολλο (επιτρεπόμενα: %{allowed_schemes}).'
less_than_or_equal_to: "πρέπει να είναι μικρότερο ή ίσο με %{count}." less_than_or_equal_to: "πρέπει να είναι μικρότερο ή ίσο με %{count}."
not_current_user: "is not the current user."
not_a_date: "δεν είναι έγκυρη ημερομηνία." not_a_date: "δεν είναι έγκυρη ημερομηνία."
not_a_datetime: "δεν είναι έγκυρη ημερομηνία και ώρα." not_a_datetime: "δεν είναι έγκυρη ημερομηνία και ώρα."
not_a_number: "δεν είναι αριθμός." not_a_number: "δεν είναι αριθμός."

@ -534,6 +534,7 @@ es:
invalid_url: 'no es una URL válida.' invalid_url: 'no es una URL válida.'
invalid_url_scheme: 'no es un protocolo admitido (permitidos: %{allowed_schemes}).' invalid_url_scheme: 'no es un protocolo admitido (permitidos: %{allowed_schemes}).'
less_than_or_equal_to: "debe ser menor o igual a %{count}." less_than_or_equal_to: "debe ser menor o igual a %{count}."
not_current_user: "is not the current user."
not_a_date: "no es una fecha válida." not_a_date: "no es una fecha válida."
not_a_datetime: "no es una fecha/hora válida." not_a_datetime: "no es una fecha/hora válida."
not_a_number: "No es un número." not_a_number: "No es un número."

@ -537,6 +537,7 @@ fi:
invalid_url: 'is not a valid URL.' invalid_url: 'is not a valid URL.'
invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).'
less_than_or_equal_to: "täytyy olla pienempi tai yhtä suuri kuin %{count}." less_than_or_equal_to: "täytyy olla pienempi tai yhtä suuri kuin %{count}."
not_current_user: "is not the current user."
not_a_date: "is not a valid date." not_a_date: "is not a valid date."
not_a_datetime: "is not a valid date time." not_a_datetime: "is not a valid date time."
not_a_number: "ei ole numero." not_a_number: "ei ole numero."
@ -1473,8 +1474,8 @@ fi:
label_message_posted: "Viesti lisätty" label_message_posted: "Viesti lisätty"
label_min_max_length: "Min - Max pituudet" label_min_max_length: "Min - Max pituudet"
label_minute_plural: "minuuttia" label_minute_plural: "minuuttia"
label_missing_api_access_key: "Missing API access key" label_missing_api_access_key: "API avain puuttuu"
label_missing_feeds_access_key: "Missing RSS access key" label_missing_feeds_access_key: "RSS avain puuttuu"
label_modification: "%{count} muutos" label_modification: "%{count} muutos"
label_modified: "muokattu" label_modified: "muokattu"
label_module_plural: "Moduulit" label_module_plural: "Moduulit"
@ -1894,11 +1895,11 @@ fi:
mb: "Mt" mb: "Mt"
tb: "Tt" tb: "Tt"
onboarding: onboarding:
heading_getting_started: "Get an overview" heading_getting_started: "Yleiskatsaus"
text_getting_started_description: "Get a quick overview of project management and team collaboration with OpenProject." text_getting_started_description: "Get a quick overview of project management and team collaboration with OpenProject."
text_show_again: "Voit käynnistää tämä videon uudelleen ohjeet-valikosta" text_show_again: "Voit käynnistää tämä videon uudelleen ohjeet-valikosta"
welcome: "Tervetuloa OpenProjectiin" welcome: "Tervetuloa OpenProjectiin"
select_language: "Please select your language" select_language: "Valitse kieli"
permission_add_work_package_notes: "Lisää kommentteja" permission_add_work_package_notes: "Lisää kommentteja"
permission_add_work_packages: "Lisää tehtävä" permission_add_work_packages: "Lisää tehtävä"
permission_add_messages: "Jätä viesti" permission_add_messages: "Jätä viesti"

@ -537,6 +537,7 @@ fil:
invalid_url: 'ay hindi balidong URL.' invalid_url: 'ay hindi balidong URL.'
invalid_url_scheme: 'ay hindi suportado ng protocol (pinahintulutan: %{allowed_schemes}).' invalid_url_scheme: 'ay hindi suportado ng protocol (pinahintulutan: %{allowed_schemes}).'
less_than_or_equal_to: "dapat ay hindi baba o katumbas sa %{count}." less_than_or_equal_to: "dapat ay hindi baba o katumbas sa %{count}."
not_current_user: "is not the current user."
not_a_date: "ay hindi balido ang petsa." not_a_date: "ay hindi balido ang petsa."
not_a_datetime: "ay hindi balido ang petsa ng oras." not_a_datetime: "ay hindi balido ang petsa ng oras."
not_a_number: "ay hindi numero." not_a_number: "ay hindi numero."

@ -536,6 +536,7 @@ fr:
invalid_url: 'n’est pas une URL valide.' invalid_url: 'n’est pas une URL valide.'
invalid_url_scheme: 'n’est pas un protocole pris en charge (autorisés : %{allowed_schemes}).' 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}." less_than_or_equal_to: "doit être inférieur ou égal à %{count}."
not_current_user: "is not the current user."
not_a_date: "n'est pas une date valide." not_a_date: "n'est pas une date valide."
not_a_datetime: "n'est pas une heure valide." not_a_datetime: "n'est pas une heure valide."
not_a_number: "n'est pas un nombre." not_a_number: "n'est pas un nombre."

@ -538,6 +538,7 @@ hr:
invalid_url: 'nije valjani URL.' invalid_url: 'nije valjani URL.'
invalid_url_scheme: 'nije podržani protokol (dozvoljeno: %{allowed_schemes}).' invalid_url_scheme: 'nije podržani protokol (dozvoljeno: %{allowed_schemes}).'
less_than_or_equal_to: "mora biti manji od ili jednak %{count}." less_than_or_equal_to: "mora biti manji od ili jednak %{count}."
not_current_user: "is not the current user."
not_a_date: "is not a valid date." not_a_date: "is not a valid date."
not_a_datetime: "is not a valid date time." not_a_datetime: "is not a valid date time."
not_a_number: "nije tip podataka number." not_a_number: "nije tip podataka number."

@ -534,6 +534,7 @@ hu:
invalid_url: 'nem érvényes URL.' invalid_url: 'nem érvényes URL.'
invalid_url_scheme: 'nem támogatott protokoll (támogatott: %{allowed_schemes}).' invalid_url_scheme: 'nem támogatott protokoll (támogatott: %{allowed_schemes}).'
less_than_or_equal_to: "kisebbnek vagy egyenlőnek kell lennie mint, %{count}." less_than_or_equal_to: "kisebbnek vagy egyenlőnek kell lennie mint, %{count}."
not_current_user: "is not the current user."
not_a_date: "nem érvényes dátum." not_a_date: "nem érvényes dátum."
not_a_datetime: "ez nem érvényes dátum." not_a_datetime: "ez nem érvényes dátum."
not_a_number: "ez nem egy szám." not_a_number: "ez nem egy szám."

@ -535,6 +535,7 @@ id:
invalid_url: 'bukanlah URL yang Valid.' invalid_url: 'bukanlah URL yang Valid.'
invalid_url_scheme: 'bukanlah sebuah protokol yang didukung (diperbolehkan: %{allowed_schemes}).' invalid_url_scheme: 'bukanlah sebuah protokol yang didukung (diperbolehkan: %{allowed_schemes}).'
less_than_or_equal_to: "harus kurang dari atau sama dengan %{count}." less_than_or_equal_to: "harus kurang dari atau sama dengan %{count}."
not_current_user: "is not the current user."
not_a_date: "bukan tanggal yang valid." not_a_date: "bukan tanggal yang valid."
not_a_datetime: "bukan tanggal waktu yang valid." not_a_datetime: "bukan tanggal waktu yang valid."
not_a_number: "harus diisi angka." not_a_number: "harus diisi angka."

@ -533,6 +533,7 @@ it:
invalid_url: 'non è un URL valido.' invalid_url: 'non è un URL valido.'
invalid_url_scheme: 'non è un protocollo supportato (ammessi: %{allowed_schemes}).' invalid_url_scheme: 'non è un protocollo supportato (ammessi: %{allowed_schemes}).'
less_than_or_equal_to: "deve essere inferiore o uguale a %{count}." less_than_or_equal_to: "deve essere inferiore o uguale a %{count}."
not_current_user: "is not the current user."
not_a_date: "non è una data valida." not_a_date: "non è una data valida."
not_a_datetime: "non è un'orario valido." not_a_datetime: "non è un'orario valido."
not_a_number: "non è un numero." not_a_number: "non è un numero."

@ -531,6 +531,7 @@ ja:
invalid_url: 'は有効な URL ではありません。' invalid_url: 'は有効な URL ではありません。'
invalid_url_scheme: 'はサポートされたプロトコルではありません (可能: %{allowed_schemes})。' invalid_url_scheme: 'はサポートされたプロトコルではありません (可能: %{allowed_schemes})。'
less_than_or_equal_to: "は%{count}以下の値にしてください。" less_than_or_equal_to: "は%{count}以下の値にしてください。"
not_current_user: "is not the current user."
not_a_date: "は有効な日付ではありません。" not_a_date: "は有効な日付ではありません。"
not_a_datetime: "は有効な日時ではありません。" not_a_datetime: "は有効な日時ではありません。"
not_a_number: "は数値にしてください。" not_a_number: "は数値にしてください。"
@ -2562,11 +2563,11 @@ ja:
protocol_mismatch: protocol_mismatch:
title: 'プロトコル設定が一致しません' title: 'プロトコル設定が一致しません'
text_html: > text_html: >
Your application is running with its protocol setting set to <code>%{set_protocol}</code>, but the request is an <code>%{actual_protocol}</code> request. This will result in errors! Go to <a href="%{setting_path}">System settings</a> and change the "Protocol" setting to correct this. アプリケーションはプロトコル設定を<code>%{set_protocol}</code>に設定していますが、リクエストは<code>%{actual_protocol}</code>です。<a href="%{setting_path}">システム設定</a>でプロトコル設定を変更してください。
hostname_mismatch: hostname_mismatch:
title: 'Hostname setting mismatch' title: 'ホスト名の設定が一致しません'
text_html: > text_html: >
Your application is running with its host name setting set to <code>%{set_hostname}</code>, but the request is a <code>%{actual_hostname}</code> hostname. This will result in errors! Go to <a href="%{setting_path}">System settings</a> and change the "Host name" setting to correct this. アプリケーションはホスト名を<code>%{set_hostname}</code>に設定していますが、リクエストは<code>%{actual_hostname}</code>です。<a href="%{setting_path}">システム設定</a>でホスト名の設定を変更してください。
menu_item: "メニュー項目" menu_item: "メニュー項目"
menu_item_setting: "可視性" menu_item_setting: "可視性"
wiki_menu_item_for: "Wikiページ\"%{title}\"のメニュー項目" wiki_menu_item_for: "Wikiページ\"%{title}\"のメニュー項目"
@ -2621,8 +2622,8 @@ ja:
invalid_user_assigned_to_work_package: "選択されたユーザーは、この作業項目の'%{property}' にすることはできません。" invalid_user_assigned_to_work_package: "選択されたユーザーは、この作業項目の'%{property}' にすることはできません。"
start_date: "開始日は、親ワークパッケージに設定できません。" start_date: "開始日は、親ワークパッケージに設定できません。"
eprops: eprops:
invalid_gzip: "is invalid gzip: %{message}" invalid_gzip: "無効なgzipです: %{message}"
invalid_json: "is invalid json: %{message}" invalid_json: "無効なjsonです: %{message}"
resources: resources:
schema: 'スキーマ' schema: 'スキーマ'
doorkeeper: doorkeeper:
@ -2672,7 +2673,7 @@ ja:
redirect_uri_html: > redirect_uri_html: >
許可されたURLで承認されたユーザーにリダイレクトできます。 1行に1エントリ。<br/>デスクトップアプリケーションを登録する場合は、次のURLを使用してください。 許可されたURLで承認されたユーザーにリダイレクトできます。 1行に1エントリ。<br/>デスクトップアプリケーションを登録する場合は、次のURLを使用してください。
confidential: "クライアントシークレットを機密にできる場所でアプリケーションが使用されるかどうかを確認します。 ネイティブモバイルアプリとシングルページアプリは機密とはみなされません。" confidential: "クライアントシークレットを機密にできる場所でアプリケーションが使用されるかどうかを確認します。 ネイティブモバイルアプリとシングルページアプリは機密とはみなされません。"
scopes: "Check the scopes you want the application to grant access to. If no scope is checked, api_v3 is assumed." scopes: "アプリケーションにアクセスを許可するスコープをチェックします。チェックされていない場合、api_v3になる。"
client_credential_user_id: "クライアントがこのアプリケーションを使用するときに偽装するためのオプションのユーザーIDです。 パブリックアクセスのみを許可するには空のままにします" client_credential_user_id: "クライアントがこのアプリケーションを使用するときに偽装するためのオプションのユーザーIDです。 パブリックアクセスのみを許可するには空のままにします"
register_intro: "OpenProject用のOAuth APIクライアントアプリケーションを開発している場合は、このフォームを使用してすべてのユーザーが使用できるように登録できます。" register_intro: "OpenProject用のOAuth APIクライアントアプリケーションを開発している場合は、このフォームを使用してすべてのユーザーが使用できるように登録できます。"
default_scopes: "" default_scopes: ""
@ -2688,7 +2689,7 @@ ja:
このアプリケーションはあなたのOpenProjectアカウントへのアクセスを要求します。 <br/> <strong>次の権限が要求されています:</strong> このアプリケーションはあなたのOpenProjectアカウントへのアクセスを要求します。 <br/> <strong>次の権限が要求されています:</strong>
scopes: scopes:
api_v3: "Full API v3アクセス" api_v3: "Full API v3アクセス"
api_v3_text: "Application will receive full read & write access to the OpenProject API v3 to perform actions on your behalf." api_v3_text: "アプリケーションはアクションを実行するためのOpenProject API v3へのフルアクセスが許可されます。"
grants: grants:
created_date: "に承認済み" created_date: "に承認済み"
scopes: "権限" scopes: "権限"

@ -269,7 +269,7 @@ ja:
blocks: blocks:
new_features: new_features:
text_new_features: "新しい機能と製品の更新について表示する" text_new_features: "新しい機能と製品の更新について表示する"
learn_about: "Learn more about the new features" learn_about: "新機能の詳細はこちら"
standard: standard:
learn_about_link: https://www.openproject.org/openproject-11-0-release learn_about_link: https://www.openproject.org/openproject-11-0-release
current_new_feature_html: > current_new_feature_html: >
@ -379,7 +379,7 @@ ja:
label_project_plural: "プロジェクト" label_project_plural: "プロジェクト"
label_visibility_settings: "表示の設定" label_visibility_settings: "表示の設定"
label_quote_comment: "このコメントを引用" label_quote_comment: "このコメントを引用"
label_recent: "Recent" label_recent: "最新"
label_reset: "リセット" label_reset: "リセット"
label_remove_column: "列を削除" label_remove_column: "列を削除"
label_remove_columns: "選択した列を削除" label_remove_columns: "選択した列を削除"
@ -522,7 +522,7 @@ ja:
more_information: "詳細情報" more_information: "詳細情報"
nevermind: "無視" nevermind: "無視"
edit: edit:
form_configuration: "Form Configuration" form_configuration: "フォーム設定"
projects: "プロジェクト" projects: "プロジェクト"
settings: "設定" settings: "設定"
time_entry: time_entry:

@ -535,6 +535,7 @@ ko:
invalid_url: '은(는) 올바른 URL이 아닙니다.' invalid_url: '은(는) 올바른 URL이 아닙니다.'
invalid_url_scheme: '은(는) 지원되는 프로토콜(허용: %{allowed_schemes})이 아닙니다.' invalid_url_scheme: '은(는) 지원되는 프로토콜(허용: %{allowed_schemes})이 아닙니다.'
less_than_or_equal_to: "은(는) %{count} 보다 작거나 같아야 합니다" less_than_or_equal_to: "은(는) %{count} 보다 작거나 같아야 합니다"
not_current_user: "is not the current user."
not_a_date: "은(는) 유효한 날짜가 아닙니다." not_a_date: "은(는) 유효한 날짜가 아닙니다."
not_a_datetime: "은(는) 유효한 날짜가 아닙니다." not_a_datetime: "은(는) 유효한 날짜가 아닙니다."
not_a_number: "은(는) 숫자가 아닙니다." not_a_number: "은(는) 숫자가 아닙니다."

@ -534,6 +534,7 @@ lt:
invalid_url: 'nėra tinkamas URL.' invalid_url: 'nėra tinkamas URL.'
invalid_url_scheme: 'nėra palaikomos protokolas (leidžiamas: %{allowed_schemes}).' invalid_url_scheme: 'nėra palaikomos protokolas (leidžiamas: %{allowed_schemes}).'
less_than_or_equal_to: "turi būti mažesnis arba lygus %{count}." less_than_or_equal_to: "turi būti mažesnis arba lygus %{count}."
not_current_user: "is not the current user."
not_a_date: "nėra tinkama data." not_a_date: "nėra tinkama data."
not_a_datetime: "nėra tinkama data ir laikas." not_a_datetime: "nėra tinkama data ir laikas."
not_a_number: "nėra skaičius." not_a_number: "nėra skaičius."

@ -537,6 +537,7 @@ nl:
invalid_url: 'is geen geldige URL.' invalid_url: 'is geen geldige URL.'
invalid_url_scheme: 'is geen ondersteunde protocol (toegestaan: %{allowed_schemes}).' invalid_url_scheme: 'is geen ondersteunde protocol (toegestaan: %{allowed_schemes}).'
less_than_or_equal_to: "moet kleiner zijn dan of gelijk aan %{count}." less_than_or_equal_to: "moet kleiner zijn dan of gelijk aan %{count}."
not_current_user: "is not the current user."
not_a_date: "is geen geldige datum." not_a_date: "is geen geldige datum."
not_a_datetime: "is geen geldige datum tijd." not_a_datetime: "is geen geldige datum tijd."
not_a_number: "is geen getal." not_a_number: "is geen getal."

@ -537,6 +537,7 @@
invalid_url: 'is not a valid URL.' invalid_url: 'is not a valid URL.'
invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).'
less_than_or_equal_to: "must be less than or equal to %{count}." less_than_or_equal_to: "must be less than or equal to %{count}."
not_current_user: "is not the current user."
not_a_date: "is not a valid date." not_a_date: "is not a valid date."
not_a_datetime: "is not a valid date time." not_a_datetime: "is not a valid date time."
not_a_number: "is not a number." not_a_number: "is not a number."

@ -535,6 +535,7 @@ pl:
invalid_url: 'nie jest poprawnym adresem URL.' invalid_url: 'nie jest poprawnym adresem URL.'
invalid_url_scheme: 'nie jest obsługiwanym protokołem (dozwolone: %{allowed_schemes}).' invalid_url_scheme: 'nie jest obsługiwanym protokołem (dozwolone: %{allowed_schemes}).'
less_than_or_equal_to: "musi być mniejsze niż lub równe %{count}." less_than_or_equal_to: "musi być mniejsze niż lub równe %{count}."
not_current_user: "is not the current user."
not_a_date: "nie jest poprawną datą." not_a_date: "nie jest poprawną datą."
not_a_datetime: "nie jest poprawną datą i czasem." not_a_datetime: "nie jest poprawną datą i czasem."
not_a_number: "nie jest liczbą." not_a_number: "nie jest liczbą."

@ -535,6 +535,7 @@ pt:
invalid_url: 'não é um URL válido.' invalid_url: 'não é um URL válido.'
invalid_url_scheme: 'não é um protocolo suportado (permitidos: %{allowed_schemes}).' invalid_url_scheme: 'não é um protocolo suportado (permitidos: %{allowed_schemes}).'
less_than_or_equal_to: "deve ser menor ou igual a %{count}." less_than_or_equal_to: "deve ser menor ou igual a %{count}."
not_current_user: "is not the current user."
not_a_date: "não é uma data válida." not_a_date: "não é uma data válida."
not_a_datetime: "não é uma data/hora válida." not_a_datetime: "não é uma data/hora válida."
not_a_number: "não é um número." not_a_number: "não é um número."

@ -538,6 +538,7 @@ ro:
invalid_url: 'nu este o adresa URL validă.' invalid_url: 'nu este o adresa URL validă.'
invalid_url_scheme: 'nu este un protocol permis (allowed: %{allowed_schemes}).' 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}." less_than_or_equal_to: "trebuie să fie mai mic sau egal cu %{count}."
not_current_user: "is not the current user."
not_a_date: "is not a valid date." not_a_date: "is not a valid date."
not_a_datetime: "is not a valid date time." not_a_datetime: "is not a valid date time."
not_a_number: "nu este un număr." not_a_number: "nu este un număr."

@ -538,6 +538,7 @@ ru:
invalid_url: 'не является допустимым URL-адресом.' invalid_url: 'не является допустимым URL-адресом.'
invalid_url_scheme: 'не является поддерживаемым протоколом (разрешены следующие: %{allowed_schemes}).' invalid_url_scheme: 'не является поддерживаемым протоколом (разрешены следующие: %{allowed_schemes}).'
less_than_or_equal_to: "должно быть меньше или равно %{count}." less_than_or_equal_to: "должно быть меньше или равно %{count}."
not_current_user: "is not the current user."
not_a_date: "не является допустимой датой." not_a_date: "не является допустимой датой."
not_a_datetime: "дата и время не являются допустимыми." not_a_datetime: "дата и время не являются допустимыми."
not_a_number: "не является числом." not_a_number: "не является числом."

@ -539,6 +539,7 @@ sk:
invalid_url: 'nie je platnou URL adresou.' invalid_url: 'nie je platnou URL adresou.'
invalid_url_scheme: 'nie je podporovaný protokol (povolené: %{allowed_schemes}).' invalid_url_scheme: 'nie je podporovaný protokol (povolené: %{allowed_schemes}).'
less_than_or_equal_to: "musí byť menšie alebo rovné ako %{count}." less_than_or_equal_to: "musí byť menšie alebo rovné ako %{count}."
not_current_user: "is not the current user."
not_a_date: "nie je platný dátum." not_a_date: "nie je platný dátum."
not_a_datetime: "nie je platný dátum a čas." not_a_datetime: "nie je platný dátum a čas."
not_a_number: "nie je číslo." not_a_number: "nie je číslo."

@ -537,6 +537,7 @@ sl:
invalid_url: 'ni veljaven URL. ' invalid_url: 'ni veljaven URL. '
invalid_url_scheme: 'ni podprt protokol (dovoljeno:%{allowed_schemes}).' invalid_url_scheme: 'ni podprt protokol (dovoljeno:%{allowed_schemes}).'
less_than_or_equal_to: "mora biti manjše ali enako %{count}. " less_than_or_equal_to: "mora biti manjše ali enako %{count}. "
not_current_user: "is not the current user."
not_a_date: "ni veljaven datum" not_a_date: "ni veljaven datum"
not_a_datetime: "ni veljaven datum." not_a_datetime: "ni veljaven datum."
not_a_number: "ni število." not_a_number: "ni število."

@ -536,6 +536,7 @@ sv:
invalid_url: 'är inte ett giltigt URL.' invalid_url: 'är inte ett giltigt URL.'
invalid_url_scheme: 'är inte ett tillåtet protokoll (tillåtna: %{allowed_schemes}).' invalid_url_scheme: 'är inte ett tillåtet protokoll (tillåtna: %{allowed_schemes}).'
less_than_or_equal_to: "måste vara mindre än eller lika med %{count}." less_than_or_equal_to: "måste vara mindre än eller lika med %{count}."
not_current_user: "is not the current user."
not_a_date: "är inte är ett giltigt datum." not_a_date: "är inte är ett giltigt datum."
not_a_datetime: "är inte en giltig datumtid." not_a_datetime: "är inte en giltig datumtid."
not_a_number: "är inte ett nummer." not_a_number: "är inte ett nummer."

@ -537,6 +537,7 @@ tr:
invalid_url: 'geçerli bir adres değil.' invalid_url: 'geçerli bir adres değil.'
invalid_url_scheme: 'bu protokol desteklenmiyor (izin: %{allowed_schemes}).' invalid_url_scheme: 'bu protokol desteklenmiyor (izin: %{allowed_schemes}).'
less_than_or_equal_to: "%{count} 'ten küçük veya bu değere eşit olmalıdır." less_than_or_equal_to: "%{count} 'ten küçük veya bu değere eşit olmalıdır."
not_current_user: "is not the current user."
not_a_date: "geçerli bir tarih değil." not_a_date: "geçerli bir tarih değil."
not_a_datetime: "geçerli bir zaman değil." not_a_datetime: "geçerli bir zaman değil."
not_a_number: "bir sayı değil." not_a_number: "bir sayı değil."

@ -539,6 +539,7 @@ uk:
invalid_url: 'не є дійсною URL-адресою.' invalid_url: 'не є дійсною URL-адресою.'
invalid_url_scheme: 'не є підтримуваним протоколом (дозволено: %{allowed_schemes}).' invalid_url_scheme: 'не є підтримуваним протоколом (дозволено: %{allowed_schemes}).'
less_than_or_equal_to: "має бути меншим або рівним %{count}" less_than_or_equal_to: "має бути меншим або рівним %{count}"
not_current_user: "is not the current user."
not_a_date: "не є дійсною датою." not_a_date: "не є дійсною датою."
not_a_datetime: "не є дійсним датою." not_a_datetime: "не є дійсним датою."
not_a_number: "не є числом" not_a_number: "не є числом"

@ -538,6 +538,7 @@ vi:
invalid_url: 'is not a valid URL.' invalid_url: 'is not a valid URL.'
invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).'
less_than_or_equal_to: "must be less than or equal to %{count}." less_than_or_equal_to: "must be less than or equal to %{count}."
not_current_user: "is not the current user."
not_a_date: "is not a valid date." not_a_date: "is not a valid date."
not_a_datetime: "is not a valid date time." not_a_datetime: "is not a valid date time."
not_a_number: "is not a number." not_a_number: "is not a number."

@ -531,6 +531,7 @@ zh-CN:
invalid_url: '不是有效的 URL。' invalid_url: '不是有效的 URL。'
invalid_url_scheme: '不是受支持的协议(允许:%{allowed_schemes})。' invalid_url_scheme: '不是受支持的协议(允许:%{allowed_schemes})。'
less_than_or_equal_to: "必须小于或等于 %{count}。" less_than_or_equal_to: "必须小于或等于 %{count}。"
not_current_user: "is not the current user."
not_a_date: "不是有效的日期。" not_a_date: "不是有效的日期。"
not_a_datetime: "不是有效的日期时间。" not_a_datetime: "不是有效的日期时间。"
not_a_number: "不是一个数字。" not_a_number: "不是一个数字。"

@ -536,6 +536,7 @@ zh-TW:
invalid_url: '不是有效的 URL。' invalid_url: '不是有效的 URL。'
invalid_url_scheme: '不是受支援的協定 (允許的協定: %{allowed_schemes})。' invalid_url_scheme: '不是受支援的協定 (允許的協定: %{allowed_schemes})。'
less_than_or_equal_to: "必須少於或者等於 %{count}。" less_than_or_equal_to: "必須少於或者等於 %{count}。"
not_current_user: "is not the current user."
not_a_date: "不是有效的日期。" not_a_date: "不是有效的日期。"
not_a_datetime: "不是有效的日期時間。" not_a_datetime: "不是有效的日期時間。"
not_a_number: "不是數字" not_a_number: "不是數字"

@ -588,6 +588,7 @@ en:
invalid_url: 'is not a valid URL.' invalid_url: 'is not a valid URL.'
invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).' invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).'
less_than_or_equal_to: "must be less than or equal to %{count}." less_than_or_equal_to: "must be less than or equal to %{count}."
not_current_user: "is not the current user."
not_a_date: "is not a valid date." not_a_date: "is not a valid date."
not_a_datetime: "is not a valid date time." not_a_datetime: "is not a valid date time."
not_a_number: "is not a number." not_a_number: "is not a number."

@ -11,7 +11,7 @@ volumes:
x-op-restart-policy: &restart_policy x-op-restart-policy: &restart_policy
restart: unless-stopped restart: unless-stopped
x-op-image: &image x-op-image: &image
image: openproject/community:${TAG:-10} image: openproject/community:${TAG:-11}
x-op-app: &app x-op-app: &app
<<: *image <<: *image
<<: *restart_policy <<: *restart_policy

@ -0,0 +1,16 @@
# API v3 client libraries
We encourage developers from the community to develop client libraries for the OpenProject API in as many languages as possible and publish them for access by the public. That way, the grunt work of establishing the connectivity between a client and OpenProject can be reused and ideally, that work can be shouldered by many, freeing everybody to focus more on their specific features.
While we cannot endorse or vet the libraries listed below we encourage their creation and acknowledge the value they add to OpenProject.
If you need help developing a client library you can [contact us](mailto:support@openproject.com). If you want to have a client library listed in the list below you can again [contact us](mailto:support@openproject.com) or simply issue a PR with [changes to the source file](https://github.com/opf/openproject/blob/dev/docs/api/apiv3/client-libraries/README.md).
## JavaScript / TypeScript
* [op-client](https://www.npmjs.com/package/op-client): "Client library for OpenProject server. Works both on Node.js and browser."
## Excel
* [OpenProjectExcel](https://github.com/opf/OpenProjectExcel): Synchronization between Excel-sheets and OpenProject.

@ -6,9 +6,9 @@ description: OpenProject Cloud Edition guide.
robots: index, follow robots: index, follow
keywords: Cloud Edition keywords: Cloud Edition
--- ---
# Cloud Edition guide # Enterprise cloud edition guide
Welcome to the OpenProject **Cloud edition guide**. Welcome to the OpenProject **Enterprise cloud edition guide**.
![image-20200113133750107](image-20200113133750107.png) ![image-20200113133750107](image-20200113133750107.png)
@ -20,16 +20,16 @@ Welcome to the OpenProject **Cloud edition guide**.
| Popular Topics | Description | | Popular Topics | Description |
| ------------------------------------------------------------ | :----------------------------------------------------------- | | ------------------------------------------------------------ | :----------------------------------------------------------- |
| [Create a free trial](./create-trial-installation) | Learn more how to create a free trial for the cloud instance. | | [Create a free trial](./create-trial-installation) | Learn more how to create a free trial for the Enterprise cloud instance. |
| [Sign in](./sign-in/) | Sing in to your OpenProject Cloud Edition. | | [Sign in](./sign-in/) | Sing in to your OpenProject Enterprise cloud edition. |
| [View payment history or download invoices](./invoices-and-billing-history) | How to see your payment history and download invoices? | | [View payment history or download invoices](./invoices-and-billing-history) | How to see your payment history and download invoices? |
| [Upgrade, downgrade or cancel subscription](./manage-subscription/#update-existing-subscriptions) | How to upgrade your plan, downgrade or cancel your subscription for the Cloud Edition? | | [Upgrade, downgrade or cancel subscription](./manage-subscription/#update-existing-subscriptions) | How to upgrade your plan, downgrade or cancel your subscription for the Enterprise cloud edition? |
| [Manage your subscription](./manage-subscription) | How to change billing address, add or edit Credit Card details? | | [Manage your subscription](./manage-subscription) | How to change billing address, add or edit credit card details? |
| [Backups](./backups) | How do backups work in the cloud? | | [Backups](./backups) | How do backups work in the cloud? |
The OpenProject Cloud Edition contains all OpenProject Community features plus the additional OpenProject premium features, as well as professional support. The OpenProject Enterprise cloud edition contains all OpenProject Community features plus the additional OpenProject premium features, as well as professional support.
For the Cloud Edition the OpenProject experts will take care of the installation as well as maintenance of your OpenProject installation, so you will be able to concentrate on your core business. We will perform regular backups of your Cloud Edition. You will have the latest OpenProject release installed. Hence, you do not have to take care of updates or installation of security patches yourself. For the Enterprise cloud edition the OpenProject experts will take care of the installation as well as maintenance of your OpenProject installation, so you will be able to concentrate on your core business. We will perform regular backups of your Enterprise cloud edition. You will have the latest OpenProject release installed. Hence, you do not have to take care of updates or installation of security patches yourself.
You will get a detailed feature comparison [here](https://www.openproject.org/pricing/#features). You will get a detailed feature comparison [here](https://www.openproject.org/pricing/#features).
@ -38,9 +38,9 @@ You will get a detailed feature comparison [here](https://www.openproject.org/pr
## Frequently asked questions - FAQ ## Frequently asked questions - FAQ
### Can I import my OpenProject community instance into my cloud environment? ### Can I import my OpenProject community instance into my Enterprise cloud environment?
Yes, we provide an upload possibility of your data to move from a Community installation to the Cloud Edition. Yes, we provide an upload possibility of your data to move from a Community installation to the Enterprise cloud edition.
To import your community instance into our cloud environment, please send us the following files: To import your community instance into our cloud environment, please send us the following files:
1. the database SQL dump of your local installation 1. the database SQL dump of your local installation
2. the attachments of your local installation For a package-based installation, you can create both as root user on your environment as follows openproject run backup 2. the attachments of your local installation For a package-based installation, you can create both as root user on your environment as follows openproject run backup
@ -50,9 +50,9 @@ Before uploading the attachments securely to us using the [following form](https
The form generates a direct upload to our secure S3 environment from which the import takes place. The form generates a direct upload to our secure S3 environment from which the import takes place.
### Where geographically is the OpenProject cloud data stored? ### Where geographically is the OpenProject Enterprise cloud data stored?
The OpenProject Cloud Environment is hosted on a logically isolated virtual cloud at Amazon Web Services with all services being located in Ireland. AWS is a GDPR compliant cloud infrastructure provider with extensive security and compliance programs as well as unparalleled access control mechanisms to ensure data privacy. Employed facilities are compliant with the ISO 27001 and 27018 standards. OpenProject Cloud Environment is continuously backing up user data with data at rest being fully encrypted with AES-256. Each individual's instance is logically separated and data is persisted in a unique database schema, reducing the risk of intersection or data leaks between instances. You can find more information [here](https://www.openproject.org/gdpr-compliance/). The OpenProject Enterprise cloud environment is hosted on a logically isolated virtual cloud at Amazon Web Services with all services being located in Ireland. AWS is a GDPR compliant cloud infrastructure provider with extensive security and compliance programs as well as unparalleled access control mechanisms to ensure data privacy. Employed facilities are compliant with the ISO 27001 and 27018 standards. OpenProject Enterprise cloud environment is continuously backing up user data with data at rest being fully encrypted with AES-256. Each individual's instance is logically separated and data is persisted in a unique database schema, reducing the risk of intersection or data leaks between instances. You can find more information [here](https://www.openproject.org/gdpr-compliance/).
### Does OpenProject comply with GDPR? ### Does OpenProject comply with GDPR?

@ -9,7 +9,7 @@ keywords: backups
# Backups # Backups
Your cloud data is backed up continuously and retained for 30 days. Your Enterprise cloud data is backed up continuously and retained for 30 days.
Within those 30 days we can restore your data to any point in time with a precision of 5 minutes, in case you need us to. Within those 30 days we can restore your data to any point in time with a precision of 5 minutes, in case you need us to.
## Download ## Download
@ -18,4 +18,4 @@ For the time being you cannot download backups yourself.
You will have to [get in touch](mailto:support@openproject.com) with us. You will have to [get in touch](mailto:support@openproject.com) with us.
We can then provide a current or past backup (database + attachments) to you. We can then provide a current or past backup (database + attachments) to you.
This way you can also get your data if you decide to stop using the Cloud Edition. This way you can also get your data if you decide to stop using the Enterprise cloud edition.

@ -6,11 +6,11 @@ description: Book the OpenProject Cloud Edition.
robots: index, follow robots: index, follow
keywords: Book Cloud Edition keywords: Book Cloud Edition
--- ---
# Book the Cloud Edition # Book the Enterprise cloud edition
After you have tested the OpenProject Could Edition and want to continue working with OpenProject, you can subscribe to one of our plans. After you have tested the OpenProject Enterprise cloud edition and want to continue working with OpenProject, you can subscribe to one of our plans.
Please refer to our website for the Cloud Edition [pricing](https://www.openproject.org/pricing/). Please refer to our website for the Enterprise cloud edition [pricing](https://www.openproject.org/pricing/).
You can subscribe to a monthly or yearly plan. The subscription can be **paid via Credit Card or Bank transfer** (only for yearly subscription). You can subscribe to a monthly or yearly plan. The subscription can be **paid via Credit Card or Bank transfer** (only for yearly subscription).
@ -57,7 +57,7 @@ Here, you can edit the account or billing information if needed.
Subscribe to our regular newsletter in order to keep up to date with latest product developments. Subscribe to our regular newsletter in order to keep up to date with latest product developments.
Click the blue **Pay button and subscribe** to the OpenProject Cloud Edition. Click the blue **Pay button and subscribe** to the OpenProject Enterprise cloud edition.
A payment receipt will be sent via email. A payment receipt will be sent via email.
@ -88,4 +88,4 @@ An invoice will be sent via email to the Billing email.
### Is there an advantage of the annual over the monthly OpenProject plan? ### Is there an advantage of the annual over the monthly OpenProject plan?
We offer two months of the Cloud Edition for free if you choose an annual plan. We offer two months of the Enterprise cloud edition for free if you choose an annual plan. If you decide for the two year plan, you get five months for free and if you commit to a five year plan, you get 15 months for free.

@ -9,7 +9,7 @@ keywords: trial installation
# Create an OpenProject trial installation # Create an OpenProject trial installation
You can easily set up a **14 days free trial** for the OpenProject Cloud Edition. You can easily set up a **14 days free trial** for the OpenProject Enterprise cloud edition.
Here you can test all OpenProject functionalities thoroughly. After 14 days the trial will expire automatically, there is no further action nor cancellation required from your side. So, you have all freedom to test OpenProject unconcernedly. Here you can test all OpenProject functionalities thoroughly. After 14 days the trial will expire automatically, there is no further action nor cancellation required from your side. So, you have all freedom to test OpenProject unconcernedly.
@ -41,9 +41,9 @@ Your OpenProject instance will be created and you will be directed to your OpenP
## Frequently asked questions (FAQ) ## Frequently asked questions (FAQ)
### My OpenProject cloud trial expired – can I still access my data? ### My OpenProject Enterprise cloud trial expired – can I still access my data?
Due to data privacy reasons we automatically delete OpenProject trial environments a couple of weeks after they have expired. Due to data privacy reasons we automatically delete OpenProject trial environments a couple of weeks after they have expired.
If your OpenProject Trial is not accessible through the known URL, it has likely been deleted. If your OpenProject trial is not accessible through the known URL, it has likely been deleted.
You can easily [create a new OpenProject trial environment](https://start.openproject.com/). Simply enter your organization name (you can use the same name as before) and click on "Start Free Trial". You can easily [create a new OpenProject trial environment](https://start.openproject.com/). Simply enter your organization name (you can use the same name as before) and click on "Start Free Trial".
In order to avoid that your data is getting deleted, please select a plan during your trial duration or shortly after your OpenProject trial environment has expired. In order to avoid that your data is getting deleted, please select a plan during your trial duration or shortly after your OpenProject trial environment has expired.

@ -7,9 +7,9 @@ robots: index, follow
keywords: invoices, payment history keywords: invoices, payment history
--- ---
# Invoices for the OpenProject Cloud Edition # Invoices for the OpenProject Enterprise cloud edition
You will **receive an invoice for your OpenProject Cloud Edition via email** to the email address which you used during the booking process. You will **receive an invoice for your OpenProject Enterprise cloud edition via email** to the email address which you used during the booking process.
The invoice lists the subscription (billing) period as well as the next billing date. The invoice lists the subscription (billing) period as well as the next billing date.
@ -24,7 +24,7 @@ For invoices via bank transfer, the money needs to be paid via bank transfer to
## Payment history and download invoices ## Payment history and download invoices
If you want to see the billing history or download older invoices of your Cloud Edition, navigate to -> *Administration* -> *Billing* within your system's Administration. If you want to see the billing history or download older invoices of your Enterprise cloud edition, navigate to -> *Administration* -> *Billing* within your system's Administration.
Click the green **Manage button** at the top right. Click the green **Manage button** at the top right.
@ -34,7 +34,7 @@ In the overlay window, click on the link **Billing History**.
![Cloud-billing-history](Cloud-billing-history.png) ![Cloud-billing-history](Cloud-billing-history.png)
Here, you will get an overview about all your past payments for the Cloud Edition. Here, you will get an overview about all your past payments for the Enterprise cloud edition.
With the **Download link** you can download the inovices. With the **Download link** you can download the inovices.
@ -44,7 +44,7 @@ The **Load more link** will open more positions on the list.
## Frequently asked questions (FAQ) ## Frequently asked questions (FAQ)
### Can we pay the OpenProject cloud edition by transfer? ### Can we pay the OpenProject Enterprise cloud edition by transfer?
Yes, for customers in the EU it is possible to pay by bank transfer (as well as by credit card). Yes, for customers in the EU it is possible to pay by bank transfer (as well as by credit card).
To do this, you can sign into your OpenProject environment and select the "Buy now" button from the top menu. You are then directed to the payment page, where you can select the number of users you want to work with and your country. Then you can check the option to pay by invoice and fill out the billing information. You will then receive an invoice from us. To do this, you can sign into your OpenProject environment and select the "Buy now" button from the top menu. You are then directed to the payment page, where you can select the number of users you want to work with and your country. Then you can check the option to pay by invoice and fill out the billing information. You will then receive an invoice from us.

@ -7,7 +7,7 @@ robots: index, follow
keywords: manage subscription keywords: manage subscription
--- ---
# Manage your OpenProject Cloud subscription # Manage your OpenProject Enterprise cloud subscription
If you want to make changes to your subscription (Up- or downgrade, cancel), navigate to -> *Administration* -> *Billing* within your system's Administration. If you want to make changes to your subscription (Up- or downgrade, cancel), navigate to -> *Administration* -> *Billing* within your system's Administration.
@ -54,7 +54,7 @@ Click the blue **Update your subscription now button** to save the changes.
To cancel your subscription, open the [Manage subscription](#manage-your-openproject-cloud-subscription) form and click to [update the subscription](#update-existing-subscriptions) you want to cancel. To cancel your subscription, open the [Manage subscription](#manage-your-openproject-cloud-subscription) form and click to [update the subscription](#update-existing-subscriptions) you want to cancel.
Click on the **Cancel Subscription link** if you want to terminate your OpenProject Cloud Edition subscription. Click on the **Cancel Subscription link** if you want to terminate your OpenProject Enterprise cloud edition subscription.
![Cloud-cancel-subscription](Cloud-cancel-subscription.png) ![Cloud-cancel-subscription](Cloud-cancel-subscription.png)
@ -64,18 +64,18 @@ Click on the **Cancel Subscription link** if you want to terminate your OpenProj
## Frequently asked questions (FAQ) ## Frequently asked questions (FAQ)
### How can I increase the number of users in the OpenProject Cloud Edition? ### How can I increase the number of users in the OpenProject Enterprise cloud edition?
Please note that the minimum number of users is 5. You can then increase the number of users in steps of 5. Just write an email to sales@openproject.com. Please note that the minimum number of users is 5. You can then increase the number of users in steps of 5. Just write an email to sales@openproject.com.
### Is it possible to change the number of users in the OpenProject Cloud Edition? ### Is it possible to change the number of users in the OpenProject Enterprise cloud edition?
You can always increase the number of users. The number of users can be increased in steps of 5 (e.g. you could start with 5 users and then increase the number of users to 10 users). You can purchase the Enterprise Edition from [here](https://www.openproject.org/enterprise-edition/). Simply click on the button "Book now" and follow the steps. A reduction in the number of users would take effect after the current service period. You can always increase the number of users. The number of users can be increased in steps of 5 (e.g. you could start with 5 users and then increase the number of users to 10 users). You can purchase the Enterprise on-premises edition from [here](https://www.openproject.org/enterprise-edition/). Simply click on the button "Book now" and follow the steps. A reduction in the number of users would take effect after the current service period.
### Do you have OpenProject guest accounts? ### Do you have OpenProject guest accounts?
Currently, all users working in the OpenProject Enterprise Edition need a license in order to access OpenProject. Regarding payments we only count the active (not blocked) users. Currently, all users working in the OpenProject Enterprise editions need a license in order to access OpenProject. Regarding payments we only count the active (not blocked) users.
### Can I run OpenProject as a single user? ### Can I run OpenProject as a single user?
Our minimum plan for the Cloud Edition and Enterprise Edition is five users. Our pricing scheme covers three subscription options: Community ($0), Cloud (€4.95/member/month or approximately $5.60/member/month), and Enterprise (€5.95/member/month or approximately $6.73/member/month). We recommend to start the [community version](https://www.openproject.org/download-and-installation/) free of charge if the 5 user minimum is an issue. Our minimum plan for the Enterprise cloud edition and Enterprise on-premises edition is five users. Our pricing scheme covers three subscription options: Community ($0), Enterprise cloud (€4.95/member/month or approximately $5.60/member/month), and Enterprise on-premises (€5.95/member/month or approximately $6.73/member/month). We recommend to start the [Community version](https://www.openproject.org/download-and-installation/) free of charge if the 5 user minimum is an issue.

@ -7,15 +7,15 @@ robots: index, follow
keywords: sing in keywords: sing in
--- ---
# Sign in to the OpenProject Cloud Edition # Sign in to the OpenProject Enterprise cloud edition
Login to your OpenProject Cloud Edition via the website or by entering directly the URL of your OpenProject instance. Login to your OpenProject Enterprise cloud edition via the website or by entering directly the URL of your OpenProject instance.
If you do not have an OpenProject Cloud Edition, you can [set up your own OpenProject installation](../create-trial-installation). If you do not have an OpenProject Enterprise cloud edition, you can [set up your own OpenProject installation](../create-trial-installation).
## Sign in via the OpenProject website ## Sign in via the OpenProject website
In order to sign in to your OpenProject Cloud Edition via our website, navigate to https://www.openproject.org/ and click the **Sign in button** at the top of the page. In order to sign in to your OpenProject Enterprise cloud edition via our website, navigate to https://www.openproject.org/ and click the **Sign in button** at the top of the page.
![Sign-in-website](Sign-in-website.png) ![Sign-in-website](Sign-in-website.png)
@ -29,7 +29,7 @@ Click the green **Sign in button** and you will be logged into your OpenProject
## Forgot organization name of OpenProject Cloud Edition ## Forgot organization name of OpenProject Cloud Edition
If you forgot the URL or the organization name of your OpenProject Cloud Edition and need to find your organization, you can click the **Find your organization** link on the Sign in page of the website. If you forgot the URL or the organization name of your OpenProject Enterprise cloud edition and need to find your organization, you can click the **Find your organization** link on the Sign in page of the website.
![Sign-in-find-organization](Sign-in-find-organization.png) ![Sign-in-find-organization](Sign-in-find-organization.png)

@ -6,17 +6,17 @@ description: Cloud Edition Support.
robots: index, follow robots: index, follow
keywords: Cloud Edition support keywords: Cloud Edition support
--- ---
# Cloud Edition Support # Enterprise cloud edition support
As an OpenProject Cloud Edition customer, you will have Professional support included. Get reliable, high-touch support from senior support engineers. As an OpenProject Enterprise cloud edition customer, you will have professional support included. Get reliable, high-touch support from senior support engineers.
## Support ticket ## Support ticket
You can create a support ticket on https://community.openproject.com/projects/openproject/. You first need to register on the OpenProject Community Edition to create a support ticket. You can create a support ticket on https://community.openproject.com/projects/openproject/. You first need to register on the OpenProject Community edition to create a support ticket.
## E-mail support ## E-mail support
Please write us an email to support@openproject.com to get help with your OpenProject Cloud Edition. Please write us an email to support@openproject.com to get help with your OpenProject Enterprise cloud edition.
## Contact us ## Contact us

@ -28,7 +28,7 @@ Inline editing is a core functionality of work packages and other attributes.
In order to understand Inline Editing, you will need the following concepts: In order to understand Inline Editing, you will need the following concepts:
- [HAL resources](TODO:hal-resource) - [HAL resources](../hal-resources)
- [Schemas](../resource-schemas) - [Schemas](../resource-schemas)

@ -64,7 +64,7 @@ Queries are regular APIv3 grape endpoints that can be accessed through the `/api
The default query `/api/v3/queries/default` and `/api/v3/:project_id/queries/default` contains a default set of configuration (back-end and front-end) global and for the given project, respectively. They can only be modified administrators through some global settings. The default query `/api/v3/queries/default` and `/api/v3/:project_id/queries/default` contains a default set of configuration (back-end and front-end) global and for the given project, respectively. They can only be modified administrators through some global settings.
A number of parameters can be passed to the Query through parameters as elaborated on in [the respective APIv3 documentation](https://docs.openproject.org/api/queries/#queries-query). A number of parameters can be passed to the Query through parameters as elaborated on in [the respective APIv3 documentation](https://docs.openproject.org/api/endpoints/queries/#queries-query).
Clients can define a query once, save it and use it later on to load the same set of filters, columns, and so on. When retrieved from the database (a query id is passed), the query has been previously stored. Saved properties may be overridden through URL parameters, which override the existing saved query. Clients can define a query once, save it and use it later on to load the same set of filters, columns, and so on. When retrieved from the database (a query id is passed), the query has been previously stored. Saved properties may be overridden through URL parameters, which override the existing saved query.
@ -72,7 +72,7 @@ Clients can define a query once, save it and use it later on to load the same se
### Query collections responses ### Query collections responses
Since queries can be saved and should be listed to the user such as in the work package sidebar, they can also be requested as a collection of resources through `/api/v3/queries`. This endpoint can also be filtered. For more details on that, see the [respective APIv3 section](https://docs.openproject.org/api/queries/#queries-queries). Since queries can be saved and should be listed to the user such as in the work package sidebar, they can also be requested as a collection of resources through `/api/v3/queries`. This endpoint can also be filtered. For more details on that, see the [respective APIv3 section](https://docs.openproject.org/api/endpoints/queries/#queries-queries).
This response will end up representing the available queries on the `work packages` module sidebar as shown below. This response will end up representing the available queries on the `work packages` module sidebar as shown below.

@ -1,21 +1,21 @@
# Enterprise Edition guide # Enterprise on-premises edition guide
Welcome to the OpenProject **Enterprise Edition guide**. Welcome to the OpenProject **Enterprise on-premises edition guide**.
Here you find support for the [OpenProject Enterprise Edition](https://www.openproject.org/enterprise-edition/). The Enterprise Edition extends the Community Edition and provides **premium features**, additional **security feature**s as well as **professional support**. Here you find support for the [OpenProject Enterprise on-premises edition](https://www.openproject.org/enterprise-edition/). The Enterprise on-premises edition extends the Community edition and provides **premium features**, additional **security feature**s as well as **professional support**.
The Enterprise Edition builds on top of the free Community Edition. An upgrade is possible at any time. Please see a detailed [feature comparison](https://www.openproject.org/pricing/#features) between the different versions of OpenProject. The Enterprise on-premises edition builds on top of the free Community edition. An upgrade is possible at any time. Please see a detailed [feature comparison](https://www.openproject.org/pricing/#features) between the different versions of OpenProject.
<div class="alert alert-info" role="alert"> <div class="alert alert-info" role="alert">
**Note**: This guide only describes the administrational part of the OpenProject Enterprise Edition. The feature descriptions for the premium features are included at the respective parts in the OpenProject [user guide](../user-guide/#readme). **Note**: This guide only describes the administrational part of the OpenProject Enterprise on-premises edition. The feature descriptions for the premium features are included at the respective parts in the OpenProject [user guide](../user-guide/#readme).
</div> </div>
## Overview ## Overview
| Popular Topics | Description | | Popular Topics | Description |
| ------------------------------------------------------------ | :----------------------------------------------------------- | | ------------------------------------------------------------ | :----------------------------------------------------------- |
| [Enterprise Edition trial](enterprise-trial/) | Can I test the Enterprise Edition for free? | | [Enterprise on-premises edition trial](enterprise-trial/) | Can I test the Enterprise on-premises edition for free? |
| [Activate the Enterprise Edition](activate-enterprise-edition/) | How can I upgrade my Community Edition to an Enterprise Edition? | | [Activate the Enterprise on-premises edition](activate-enterprise-edition/) | How can I upgrade my Community edition to an Enterprise on-premises edition? |
| [Installation support](support) | How can I get installation support? | | [Installation support](support) | How can I get installation support? |
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/YRF_bavXBts" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/YRF_bavXBts" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
@ -25,19 +25,19 @@ The Enterprise Edition builds on top of the free Community Edition. An upgrade i
## Frequently asked questions - FAQ ## Frequently asked questions - FAQ
### How can I upgrade to the OpenProject Enterprise Edition? ### How can I upgrade to the OpenProject Enterprise on-premises edition?
The Enterprise Edition is an upgrade of the self-hosted Community Edition. When you are already using the Community Edition, you can purchase an Enterprise Edition license to upgrade your OpenProject environment to the Enterprise Edition. To do this, follow these steps: The Enterprise on-premises edition is an upgrade of the self-hosted Community edition. When you are already using the Community edition, you can purchase an Enterprise on-premises edition license to upgrade your OpenProject environment to the Enterprise on-premises edition. To do this, follow these steps:
1. Navigate to https://www.openproject.org/enterprise-edition/. 1. Navigate to https://www.openproject.org/enterprise-edition/.
2. Click on the "Book now" button. 2. Click on the "Book now" button.
3. Follow the steps to purchase the Enterprise Edition license.You will then receive an Enterprise Edition license key by email which you can use to upgrade your Community Edition to the Enterprise Edition.If you prefer to test the Enterprise Edition before purchasing, you can request a 14 day trial license from https://www.openproject.org/enterprise-edition/. Simply click on "Get free trial license" to receive a 14 day trial license. After 14 days it will automatically downgraded to the community edition. 3. Follow the steps to purchase the Enterprise on-premises edition license. You will then receive an Enterprise on-premises edition license key by email which you can use to upgrade your Community edition to the Enterprise on-premises edition.If you prefer to test the Enterprise on-premises edition before purchasing, you can request a 14 day trial license from https://www.openproject.org/enterprise-edition/. Simply click on "Get free trial license" to receive a 14 day trial license. After 14 days it will automatically downgraded to the community edition.
### Is it possible to buy and upgrade to enterprise version on a community edition already installed? ### Is it possible to buy and upgrade to Enterprise on-premises version on a Community edition already installed?
Yes, you can upgrade your existing OpenProject Community Edition to the Enterprise Edition. You can then continue to use the same data as before but also use the premium features. When you purchase the Enterprise Edition, you receive an Enterprise Edition license. You can use this license to upgrade your Community Edition. Yes, you can upgrade your existing OpenProject Community edition to the Enterprise on-premises edition. You can then continue to use the same data as before but also use the premium features. When you purchase the Enterprise on-premises edition, you receive an Enterprise on-premises edition license. You can use this license to upgrade your Community edition.
To upgrade your Community installation, navigate to your system -> Administration -> Enterprise Edition. Here, you can simply click the green Start free trial button. You can then trial the Enterprise Edition 14 days for free before booking. If you like the premium features and want to continue, you can easily book the Enterprise version via the Enterprise Edition menu in the Administration. Find more information [here](https://www.openproject.org/enterprise-edition-upgrade-test-free/). To upgrade your Community installation, navigate to your system -> Administration -> Enterprise Edition. Here, you can simply click the green Start free trial button. You can then trial the Enterprise on-premises edition 14 days for free before booking. If you like the premium features and want to continue, you can easily book the Enterprise on-premises version via the Enterprise Edition menu in the Administration. Find more information [here](https://www.openproject.org/enterprise-edition-upgrade-test-free/).
### Do you have a reseller program for OpenProject? ### Do you have a reseller program for OpenProject?

@ -6,11 +6,11 @@ description: Activate the OpenProject Enterprise Edition.
robots: index, follow robots: index, follow
keywords: Activate Enterprise Edition keywords: Activate Enterprise Edition
--- ---
# Activate the Enterprise Edition # Activate the Enterprise on-premises edition
The OpenProject Enterprise Edition builds on top of the Community Edition. The OpenProject Enterprise on-premises edition builds on top of the Community edition.
In order to upgrade your OpenProject Community Edition to the Enterprise Edition, sign into your OpenProject environment with an administrator account. In order to upgrade your OpenProject Community edition to the Enterprise on-premises edition, sign into your OpenProject environment with an administrator account.
**Click on your user avatar in the upper right corner** (1) and select **Administration** from the dropdown menu (2). **Click on your user avatar in the upper right corner** (1) and select **Administration** from the dropdown menu (2).
@ -20,24 +20,24 @@ Next, select **Enterprise Edition** from the menu items (3).
![Enterprise-select-menu](Enterprise-select-menu.png) ![Enterprise-select-menu](Enterprise-select-menu.png)
Do you already have an Enterprise token? Do you already have an Enterprise on-premises token?
Yes, then you can proceed entering your token as described below. Yes, then you can proceed entering your token as described below.
No, then you need to [order your Enterprise token](#order-the-enterprise-edition) or [request a trial token](../enterprise-trial) first. No, then you need to [order your Enterprise on-premises token](#order-the-enterprise-edition) or [request a trial token](../enterprise-trial) first.
In the Enterprise Edition section, copy and paste the full content of your Enterprise support token into the input field and press the blue **Save** button. In the Enterprise on-premises edition section, copy and paste the full content of your Enterprise on-premises support token into the input field and press the blue **Save** button.
Your Enterprise Edition is now active. Your Enterprise on-premises edition is now active.
![Insert Enterprise token](image-20200121132724767.png) ![Insert Enterprise on-premises token](image-20200121132724767.png)
## Order the Enterprise Edition ## Order the Enterprise on-premises edition
If you want to **order the Enterprise Edition** click on the **+ Order Enterprise Edition** button shown on the page. You can also [request a trial token](../enterprise-trial) to test the premium features included in the Enterprise Edition. If you want to **order the Enterprise on-premises edition** click on the **+ Order Enterprise Edition** button shown on the page. You can also [request a trial token](../enterprise-trial) to test the premium features included in the Enterprise on-premises edition.
![image-20200120132950106](image-20200120132950106.png) ![image-20200120132950106](image-20200120132950106.png)
Once you purchased an Enterprise Edition token or received a trial token you can [activate it by pasting the token in the designated area of the Enterprise Edition section](#activate-the-enterprise-edition). Once you purchased an Enterprise on-premises edition token or received a trial token you can [activate it by pasting the token in the designated area of the Enterprise Edition section](#activate-the-enterprise-edition).

@ -6,15 +6,15 @@ description: Create an OpenProject Enterprise Edition trial installation.
robots: index, follow robots: index, follow
keywords: Enterprise Edition trial keywords: Enterprise Edition trial
--- ---
# Create an Enterprise Edition trial # Create an Enterprise on-premises edition trial
You can **test the OpenProject Enterprise Edition 14 days for free**. It will extend your current Community Edition with the premium features so you can thoroughly test those premium functionalities. You can **test the OpenProject Enterprise on-premises edition 14 days for free**. It will extend your current Community edition with the premium features so you can thoroughly test those premium functionalities.
Please go to https://www.openproject.org/enterprise-edition/ and press the green **Get free trial license** button. Please go to https://www.openproject.org/enterprise-edition/ and press the green **Get free trial license** button.
![create-enterprise-edition-trial](1567610649991.png) ![create-enterprise-edition-trial](1567610649991.png)
A window will appear which explains that you will receive a 14 days free trial license with that you can temporarily upgrade your Community Edition. A window will appear which explains that you will receive a 14 days free trial license with that you can temporarily upgrade your Community edition.
There is no need to cancel the trial license. The license will run out automatically and will bring you back to the Community version. There is no need to cancel the trial license. The license will run out automatically and will bring you back to the Community version.

@ -6,9 +6,9 @@ description: OpenProject Enterprise Edition support.
robots: index, follow robots: index, follow
keywords: enterprise edition support keywords: enterprise edition support
--- ---
# Enterprise Edition support # Enterprise on-premises edition support
If you have the OpenProject Enterprise Edition you are eligible to get reliable, high-touch support from senior support engineers with expert knowledge about running OpenProject in business-critical environments. If you have the OpenProject Enterprise on-premises edition you are eligible to get reliable, high-touch support from senior support engineers with expert knowledge about running OpenProject in business-critical environments.
Our support engineers are highly-trained to diagnose and resolve issues in your environment. We find solutions for the most complex technical challenges you might be faced with. Our support engineers are highly-trained to diagnose and resolve issues in your environment. We find solutions for the most complex technical challenges you might be faced with.
@ -19,11 +19,11 @@ Our support engineers are highly-trained to diagnose and resolve issues in your
## Support ticket ## Support ticket
You can create a support ticket on https://community.openproject.com/projects/openproject/. You first need to register on the OpenProject Community Edition to create a support ticket. You can create a support ticket on https://community.openproject.com/projects/openproject/. You first need to register on the OpenProject Community edition to create a support ticket.
## E-mail support ## E-mail support
Please write us an email to support@openproject.com to get help with your OpenProject Enterprise Edition. Please write us an email to support@openproject.com to get help with your OpenProject Enterprise on-premises edition.
## Contact us ## Contact us

@ -51,14 +51,14 @@ Watch a **comprehensive OpenProject product introduction** video to learn how to
### Is OpenProject free of charge? ### Is OpenProject free of charge?
We offer three different versions of OpenProject. Please get an overview of the different OpenProject Editions [here](https://www.openproject.org/pricing/). The (on-premise) OpenProject Community Edition is completely free. The Cloud and Enterprise Edition offer premium features, hosting and support and thus we are charging for it. Nevertheless, we offer free 14 days trials for the Enterprise and Cloud versions so that you can get to know their benefits. If you prefer to use the free OpenProject Community Edition, you can follow these [installation instructions](https://www.openproject.org/download-and-installation/), please note that you need a Linux server to install the Community Edition. It is always possible to upgrade from the Community to the Cloud and Enterprise Edition – check out the premium features [here](https://www.openproject.org/enterprise-edition/). We offer three different versions of OpenProject. Please get an overview of the different OpenProject Editions [here](https://www.openproject.org/pricing/). The (on-premise) OpenProject Community edition is completely free. The Enterprise cloud and Enterprise on-premises edition offer premium features, hosting and support and thus we are charging for it. Nevertheless, we offer free 14 days trials for the Enterprise versions so that you can get to know their benefits. If you prefer to use the free OpenProject Community edition, you can follow these [installation instructions](https://www.openproject.org/download-and-installation/), please note that you need a Linux server to install the Community edition. It is always possible to upgrade from the Community to the Enterprise cloud and Enterprise on-premises edition – check out the premium features [here](https://www.openproject.org/enterprise-edition/).
### How do I get access to the OpenProject premium features? ### How do I get access to the OpenProject premium features?
We offer the premium functions of OpenProject (incl. boards) for two different OpenProject variants: We offer the premium functions of OpenProject (incl. boards) for two different OpenProject variants:
* For the OpenProject Cloud Edition (hosted by us), * For the OpenProject Enterprise cloud edition (hosted by us),
* For the self-hosted (on-premise) OpenProject Enterprise Edition * For the self-hosted (on-premises) OpenProject Enterprise on-premises edition
If you want to run OpenProject on your own server the OpenProject Enterprise Edition is the right option. If you want to run OpenProject on your own server the OpenProject Enterprise on-premises edition is the right option.
Have you already installed the [OpenProject Community Edition](https://www.openproject.org/download-and-installation/)? If yes, you can request a trial license for the OpenProject Enterprise Edition by clicking on the button ["Free trial license"](https://www.openproject.org/de/enterprise-edition/) and test the Enterprise Edition for 14 days for free. Have you already installed the [OpenProject Community edition](https://www.openproject.org/download-and-installation/)? If yes, you can request a trial license for the OpenProject Enterprise on-premises edition by clicking on the button ["Free trial license"](https://www.openproject.org/de/enterprise-edition/) and test the Enterprise on-premises edition for 14 days for free.

@ -113,14 +113,14 @@ Document project achievements, lessons learned, best practices and easily summar
## OpenProject products ## OpenProject products
### What is the differences between the Community, Cloud and Enterprise Edition? ### What is the difference between the Community, Enterprise cloud and Enterprise on-premises edition?
OpenProject can be used in three different Editions, either on-premise or as software-as-a-service. OpenProject can be used in three different editions, either on-premises or as software-as-a-service.
![openproject versions](1569586019132.png) ![openproject versions](1569586019132.png)
* [Community Edition](https://www.openproject.org/download-and-installation/): self-installed on-premise. * [Community edition](https://www.openproject.org/download-and-installation/): self-installed on-premise.
* [Cloud Edition](https://www.openproject.org/hosting/): we host it, incl. premium features and support. * [Enterprise cloud edition](https://www.openproject.org/hosting/): we host it, incl. premium features and support.
* [Enterprise Edition](https://www.openproject.org/enterprise-edition/): self-hosted version, incl. premium features and support. * [Enterprise on-premises edition](https://www.openproject.org/enterprise-edition/): self-hosted version, incl. premium features and support.
To compare the features side by side, please visit our [Feature Comparison](https://www.openproject.org/pricing/#features) page. To compare the features side by side, please visit our [Feature Comparison](https://www.openproject.org/pricing/#features) page.

@ -1,6 +1,6 @@
# Installation and Operations Guides # Installation and Operations Guides
This section concerns the installation and operation of OpenProject (Community and Enterprise editions). This section concerns the installation and operation of OpenProject (Community and Enterprise on-premises editions).
## Overview ## Overview
@ -20,4 +20,4 @@ A [manual installation](installation/manual) option is also documented, but due
### Are there extra fees to pay, in terms of installing the OpenProject software? ### Are there extra fees to pay, in terms of installing the OpenProject software?
The Community and [Enterprise Edition](https://www.openproject.org/enterprise-edition/) are on premise solutions and thus need installation from your side while the [Cloud Edition](https://www.openproject.org/hosting/) is hosted by us. The Community Edition is for free and we ask you to do the installation yourself. Of course we support you with a clear and easy [installation guide](https://www.openproject.org/download-and-installation/). If you would like us to install the Enterprise Edition for you, we are charging a fee of €150 for this once-off service. You can add the installation support during your Enterprise Edition booking process. The Community and [Enterprise on-premises edition](https://www.openproject.org/enterprise-edition/) are on-premises solutions and thus need installation from your side while the [Enterprise cloud edition](https://www.openproject.org/hosting/) is hosted by us. The Community edition is for free and we ask you to do the installation yourself. Of course we support you with a clear and easy [installation guide](https://www.openproject.org/download-and-installation/). If you would like us to install the Enterprise on-premises edition for you, we are charging a fee of €150 for this once-off service. You can add the installation support during your Enterprise on-premises edition booking process.

@ -0,0 +1,81 @@
---
sidebar_navigation:
title: Changing to BIM Edition
priority: 100
---
# Changing to BIM Edition
An existing OpenProject on-premises (self hosted) installation can easily be switched to the BIM Edition.
The BIM Edition extends the capabilities of a normal OpenProject installation with special features
for the construction industry.
Switching to the BIM Edition will not affect your existing data. Your team will be able to continue
working just as before. By switching to the BIM edition additional features will become available
when you activate the "BCF" module a project's settings.
## Instructions
### Backup and upgrade
First, backup your data and update your installation to the latest OpenProject version as described in [Upgrading](../operation/upgrading).
### Switching to BIM Edition
Now that your OpenProject instance is up to date, you can _reconfigure_ it
to be a BIM Edition.
On the command line of your server run the following command. It will open a wizard that
guides you through through the most important installation settings of your instance.
On the first screen it will ask you to select the edition. Please select _bim_ and click _next_.
You can keep the screens that follow just as they are. You don't need to change any setting.
Your current settings will be preselected for you. You can simply click "next" in every step
until the end of the wizard. Finally, this will also
trigger the installation of the necessary libraries and tools for 3D model conversion.
`sudo openproject reconfigure`
Congratulations, you've successfully switched to the BIM Edition. However, for the best
experience you might consider also the next configuration.
You can check that all tools for the IFC model conversion were installed by going to
_-> Administration -> Information_ and check that _IFC conversion pipeline available_
has a check icon (✓) to the right.
### Activating the BCF module per default for every new project (optional)
You can enable the BCF module per default for all new projects in the future.
Go to _-> Administration -> System settings -> Projects_ and within the section
_Settings for new projects_ activate the checkbox for _BCF_.
### Add typical work package types and statuses for BCF management (optional)
For BCF management process you might want to add special work package types to your
installation.
In freshly created OpenProject BIM instances those types are already present. However,
as you have just switched from a normal OpenProject installation you will need to create
those work package types by hand. Please find detailed instructions on how to add work
package types in [Manage Work Package Types](../../system-admin-guide/manage-work-packages/work-package-types/).
You might consider adding the following typical work package types:
- Issue (color `indigo-7`)
- Clash (color `red-8`)
- Remark (color `GREEN (DARK)`)
- Request (color `cyan-7`)
We recommend that each type has the following status options:
- New (color `blue-6`)
- In progress (color `orange-6`)
- Resolved (color `'green-3`)
- Closed (color `'gray-3`)
### Activating the "OpenProject BIM" theme (optional)
OpenProject installations with a valid Enterprise Edition token can switch to the BIM
theme.
Go to _-> Administration -> Design_ and from the _Themes_ drop down menu chose _OpenProject BIM_.

@ -18,7 +18,7 @@ OpenProject can be setup in three different ways:
## Frequently asked questions (FAQ) ## Frequently asked questions (FAQ)
### Do you have a step-by-step guide to installing OpenProject Enterprise under Active Directory? ### Do you have a step-by-step guide to installing OpenProject Enterprise on-premises under Active Directory?
We have a guide on [how to use OpenProject with your Active Directory](https://www.openproject.org/help/administration/manage-ldap-authentication/). We have a guide on [how to use OpenProject with your Active Directory](https://www.openproject.org/help/administration/manage-ldap-authentication/).
In addition, with the Enterprise Edition it is also possible to [link LDAP groups with groups in OpenProject](https://www.openproject.org/help/administration/manage-ldap-authentication/synchronize-ldap-groups/). In addition, with the Enterprise on-premises edition it is also possible to [link LDAP groups with groups in OpenProject](https://www.openproject.org/help/administration/manage-ldap-authentication/synchronize-ldap-groups/).

@ -0,0 +1,27 @@
---
title: OpenProject 11.0.2
sidebar_navigation:
title: 11.0.2
release_version: 11.0.2
release_date: 2020-11-06
---
# OpenProject 11.0.2
We released [OpenProject 11.0.2](https://community.openproject.com/versions/1454).
The release contains several bug fixes and we recommend updating to the newest version.
<!--more-->
#### Bug fixes and changes
- Fixed: Typos / missing words in German translation when deleting user \[[#35072](https://community.openproject.com/wp/35072)\]
- Fixed: Default docker-compose.yml is has tag 10 \[[#35093](https://community.openproject.com/wp/35093)\]
- Fixed: Copied wiki attachments have original author while it should be the copying user \[[#35126](https://community.openproject.com/wp/35126)\]
- Fixed: Slashes in wiki page titles break "Activity" view \[[#35132](https://community.openproject.com/wp/35132)\]
#### 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
Le Samuel Alviola

@ -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. --> <!--- New release notes are generated below. Do not remove comment. -->
<!--- RELEASE MARKER --> <!--- RELEASE MARKER -->
## 11.0.2
Release date: 2020-11-06
[Release Notes](11-0-2/)
## 11.0.1 ## 11.0.1
Release date: 2020-10-28 Release date: 2020-10-28

@ -41,7 +41,7 @@ To do this navigate to a project and select *Project settings* from the side men
If you selected *Visible* in the custom fields settings, the custom field for projects is also available in the [View all projects](../../user-guide/projects/#view-all-projects) overview. If you selected *Visible* in the custom fields settings, the custom field for projects is also available in the [View all projects](../../../user-guide/projects/#view-all-projects) overview.
Navigate to this project list by selecting *View all projects* from the project selection menu on the top left side. Navigate to this project list by selecting *View all projects* from the project selection menu on the top left side.

@ -19,7 +19,7 @@ To adapt the system project settings, go to System settings on the tab **Project
### Settings for the Project Overview List ### Settings for the Project Overview List
5. Choose **which columns should be visible** in the Project Overview List by default. 5. Choose **which columns should be visible** in the Project Overview List by default.
6. Define the **settings for the Gantt chart view** displayed when clicking on "Open as Gantt view" in the Projects Overview List. You can choose filters, columns, sortings and more to configure the view. For more information on how the configuration works please refer to the instructions for the [work package table configuration](../../user-guide/work-packages/work-package-table-configuration/) in the User Guide. 6. Define the **settings for the Gantt chart view** displayed when clicking on "Open as Gantt view" in the Projects Overview List. You can choose filters, columns, sortings and more to configure the view. For more information on how the configuration works please refer to the instructions for the [work package table configuration](../../../user-guide/work-packages/work-package-table-configuration/) in the User Guide.
7. Do not forget to **save** your changes. 7. Do not forget to **save** your changes.
![image-20201005103659097](image-20201005103659097.png) ![image-20201005103659097](image-20201005103659097.png)

@ -69,7 +69,7 @@ Select the item to which you want to create a dependency. The precede and follow
*OpenProject does not yet include a baseline feature to compare scheduled versions. However, we are aware of the need for it and documented it. Please check here https://community.openproject.com/projects/openproject/work_packages/26448/activity for an update.* *OpenProject does not yet include a baseline feature to compare scheduled versions. However, we are aware of the need for it and documented it. Please check here https://community.openproject.com/projects/openproject/work_packages/26448/activity for an update.*
To find out about **how work packages behave**, when you move their predecessor or follower or change the date of a child work package please read our guide for the [Automatic and manual scheduling mode](/scheduling). To find out about **how work packages behave**, when you move their predecessor or follower or change the date of a child work package please read our guide for the [Automatic and manual scheduling mode](scheduling).
## Understanding the colours and lines in the Gantt chart ## Understanding the colours and lines in the Gantt chart
- A **blue line** connects two work packages, they are predecessor and follower. - A **blue line** connects two work packages, they are predecessor and follower.

@ -216,7 +216,7 @@ To change the order of the displayed [custom fields](../../system-admin-guide/cu
To **display the work packages** of all your projects **in a Gantt chart** click on the **Open as Gantt view** icon on the upper right. This is a shortcut to get to the report described in the chapter below quickly. The Gantt chart view can be configured in the [System Settings](../../system-admin-guide/settings/project-system-settings) in the Administration. To **display the work packages** of all your projects **in a Gantt chart** click on the **Open as Gantt view** icon on the upper right. This is a shortcut to get to the report described in the chapter below quickly. The Gantt chart view can be configured in the [System Settings](../../system-admin-guide/system-settings/project-system-settings) in the Administration.
![image-20201007161248903](image-20201007161248903.png) ![image-20201007161248903](image-20201007161248903.png)

@ -27,7 +27,7 @@ Work packages can be displayed in a projects timeline, e.g. as a milestone or a
| Topic | Content | | Topic | Content |
| ------------------------------------------------------------ | :----------------------------------------------------------- | | ------------------------------------------------------------ | :----------------------------------------------------------- |
| [Work packages views](work-package-views) | What is the difference between the work packages views: list view, split screen view, details view? | | [Work packages views](work-package-views) | What is the difference between the work packages views: list view, split screen view, details view? |
| [Create a work package](/create-work-package) | How to create a new work package in OpenProject? | | [Create a work package](create-work-package) | How to create a new work package in OpenProject? |
| [Edit work package](edit-work-package) | How to edit a work package in OpenProject? | | [Edit work package](edit-work-package) | How to edit a work package in OpenProject? |
| [Copy, move, delete](copy-move-delete) | How to copy, move, delete a work package? | | [Copy, move, delete](copy-move-delete) | How to copy, move, delete a work package? |
| [Work package table configuration](work-package-table-configuration) | How to configure the work package table (columns, filters, group by, etc.)? | | [Work package table configuration](work-package-table-configuration) | How to configure the work package table (columns, filters, group by, etc.)? |

@ -55,7 +55,7 @@ Click the green **Save** button.
To find out **how to create a child Work package** please click [here](../work-package-relations-hierachies/#adding-a-child-work-package). To find out **how to create a child Work package** please click [here](../work-package-relations-hierarchies/#adding-a-child-work-package).

File diff suppressed because it is too large Load Diff

@ -30,7 +30,7 @@
"tslint": "~6.1.0" "tslint": "~6.1.0"
}, },
"dependencies": { "dependencies": {
"@angular-devkit/build-angular": "^0.1000.4", "@angular-devkit/build-angular": "^0.1002.0",
"@angular/animations": "10.0.6", "@angular/animations": "10.0.6",
"@angular/cdk": "^10.1.1", "@angular/cdk": "^10.1.1",
"@angular/cli": "^10.0.4", "@angular/cli": "^10.0.4",

@ -10,9 +10,8 @@
[attr.title]="text.closePopup"> [attr.title]="text.closePopup">
</i> </i>
</a> </a>
</div>
<h3 [textContent]="text.displayedDays"></h3> <h3 [textContent]="text.displayedDays"></h3>
</div>
<div class="form--field -trailing-label" *ngFor="let day of text.weekdays; let index = index"> <div class="form--field -trailing-label" *ngFor="let day of text.weekdays; let index = index">
<label class="form--label" [textContent]="day" [htmlFor]="'day_' + index"></label> <label class="form--label" [textContent]="day" [htmlFor]="'day_' + index"></label>

@ -38,6 +38,7 @@ module OpenProject
# @see OpenProject::Notifications # @see OpenProject::Notifications
module Events module Events
AGGREGATED_WORK_PACKAGE_JOURNAL_READY = "aggregated_work_package_journal_ready".freeze AGGREGATED_WORK_PACKAGE_JOURNAL_READY = "aggregated_work_package_journal_ready".freeze
AGGREGATED_WIKI_JOURNAL_READY = "aggregated_wiki_journal_ready".freeze
NEW_TIME_ENTRY_CREATED = "new_time_entry_created".freeze NEW_TIME_ENTRY_CREATED = "new_time_entry_created".freeze
PROJECT_CREATED = "project_created".freeze PROJECT_CREATED = "project_created".freeze

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

@ -66,7 +66,7 @@ ja:
project_module_bim: "BCF" project_module_bim: "BCF"
permission_view_linked_issues: "BCF チケットを表示" permission_view_linked_issues: "BCF チケットを表示"
permission_manage_bcf: "BCF チケットのインポートと管理" permission_manage_bcf: "BCF チケットのインポートと管理"
permission_delete_bcf: "Delete BCF issues" permission_delete_bcf: "BCFチケットの削除"
oauth: oauth:
scopes: scopes:
bcf_v2_1: "BCF v2.1 API へのフルアクセス" bcf_v2_1: "BCF v2.1 API へのフルアクセス"
@ -100,7 +100,7 @@ ja:
snapshot_data_blank: "snapshot_data を提供する必要があります。" snapshot_data_blank: "snapshot_data を提供する必要があります。"
unsupported_key: "サポートされていない json プロパティが含まれています。" unsupported_key: "サポートされていない json プロパティが含まれています。"
bim/bcf/issue: bim/bcf/issue:
uuid_already_taken: "Can't import this BCF issue as there already is another with the same GUID. Could it be that this BCF issue had already been imported into a different project?" uuid_already_taken: "同じGUIDを持つ別のチケットが存在するため、BCFチケットをインポートできません。このBCFチケットは既に他のプロジェクトにインポートされていませんか?"
ifc_models: ifc_models:
label_ifc_models: 'IFCモデル' label_ifc_models: 'IFCモデル'
label_new_ifc_model: '新しいIFCモデル' label_new_ifc_model: '新しいIFCモデル'

@ -74,11 +74,11 @@ ja:
subtasks: Select work package to add as a new list subtasks: Select work package to add as a new list
warning: warning:
status: | status: |
There is currently no status available. <br> 利用可能な状態ではありません。<br>
Either there are none or they have all already been added to the board. または、既にボードに追加されています。
assignee: There isn't any member matched with your filter value. <br> assignee: There isn't any member matched with your filter value. <br>
no_member: This project currently does not have any members that can be added. <br> no_member: This project currently does not have any members that can be added. <br>
add_members: <a href="%{link}">Add a new member to this project</a> to select users again. add_members: <a href="%{link}">プロジェクトに新規メンバーを追加し</a> 、再度ユーザーを選択してください。
configuration_modal: configuration_modal:
title: 'このボードの設定' title: 'このボードの設定'
display_settings: display_settings:

@ -42,7 +42,7 @@ module TimeEntries
end end
def validate_user_current_user def validate_user_current_user
errors.add :user_id, :invalid if model.user != user errors.add :user_id, :not_current_user if model.user != user
end end
end end
end end

@ -62,7 +62,7 @@ describe TimeEntries::CreateContract do
let(:time_entry_user) { other_user } let(:time_entry_user) { other_user }
it 'is invalid' do it 'is invalid' do
expect_valid(false, user_id: %i(invalid)) expect_valid(false, user_id: %i(not_current_user))
end end
end end
@ -71,7 +71,7 @@ describe TimeEntries::CreateContract do
let(:changed_by_system) { %w() } let(:changed_by_system) { %w() }
it 'is invalid' do it 'is invalid' do
expect_valid(false, user_id: %i(invalid error_readonly)) expect_valid(false, user_id: %i(not_current_user error_readonly))
end end
end end
@ -79,7 +79,7 @@ describe TimeEntries::CreateContract do
let(:time_entry_user) { nil } let(:time_entry_user) { nil }
it 'is invalid' do it 'is invalid' do
expect_valid(false, user_id: %i(blank invalid)) expect_valid(false, user_id: %i(blank not_current_user))
end end
end end
end end

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

Loading…
Cancel
Save