Merge branch 'release/7.4' into dev

pull/6155/head
Jens Ulferts 7 years ago
commit 8172f7eeb6
No known key found for this signature in database
GPG Key ID: 3CAA4B1182CF5308
  1. 2
      .travis.yml
  2. 7
      app/cells/row_cell.rb
  3. 1
      app/services/authorization/enterprise_service.rb
  4. 72
      config/locales/crowdin/af.yml
  5. 24
      config/locales/crowdin/ar.yml
  6. 1
      config/locales/crowdin/bg.yml
  7. 1
      config/locales/crowdin/ca.yml
  8. 1
      config/locales/crowdin/cs.yml
  9. 1
      config/locales/crowdin/da.yml
  10. 1
      config/locales/crowdin/de.yml
  11. 29
      config/locales/crowdin/es.yml
  12. 1
      config/locales/crowdin/et.yml
  13. 1
      config/locales/crowdin/fa.yml
  14. 1
      config/locales/crowdin/fi.yml
  15. 1
      config/locales/crowdin/fr.yml
  16. 1
      config/locales/crowdin/he.yml
  17. 1
      config/locales/crowdin/hr.yml
  18. 5
      config/locales/crowdin/hu.yml
  19. 1
      config/locales/crowdin/id.yml
  20. 1
      config/locales/crowdin/it.yml
  21. 1
      config/locales/crowdin/ja.yml
  22. 46
      config/locales/crowdin/js-ar.yml
  23. 2
      config/locales/crowdin/js-hu.yml
  24. 2
      config/locales/crowdin/js-sk.yml
  25. 4
      config/locales/crowdin/js-zh.yml
  26. 1
      config/locales/crowdin/ko.yml
  27. 53
      config/locales/crowdin/lol.yml
  28. 1
      config/locales/crowdin/lt.yml
  29. 1
      config/locales/crowdin/lv.yml
  30. 1
      config/locales/crowdin/nl.yml
  31. 1
      config/locales/crowdin/no.yml
  32. 1
      config/locales/crowdin/pl.yml
  33. 5
      config/locales/crowdin/pt-BR.yml
  34. 1
      config/locales/crowdin/pt.yml
  35. 1
      config/locales/crowdin/ro.yml
  36. 1
      config/locales/crowdin/ru.yml
  37. 89
      config/locales/crowdin/sk.yml
  38. 1
      config/locales/crowdin/sv-SE.yml
  39. 1
      config/locales/crowdin/th.yml
  40. 1
      config/locales/crowdin/tr.yml
  41. 1
      config/locales/crowdin/uk.yml
  42. 1
      config/locales/crowdin/vi.yml
  43. 1
      config/locales/crowdin/zh-TW.yml
  44. 10
      config/locales/crowdin/zh.yml
  45. 5
      frontend/app/components/context-menus/types-context-menu/types-context-menu.service.html
  46. 2
      frontend/app/components/context-menus/types-context-menu/types-context-menu.service.ts
  47. 60
      lib/open_project/database.rb
  48. 34
      lib/tasks/database.rake

@ -122,5 +122,5 @@ addons:
# Setting latest here due to the switch from old selenium bindings
# to Marionette. At the date of this writing, ESR is Firefox 52 and has
# bad support for it. Thus we use latest (57.0 as of this writing)
firefox: "latest"
firefox: "57.0"
postgresql: "9.6"

@ -12,7 +12,12 @@ class RowCell < RailsCell
end
def column_value(column)
send column
value = send column
if value.html_safe?
value
else
h(value)
end
end
def row_css_id

@ -37,6 +37,7 @@ class Authorization::EnterpriseService
work_package_query_relation_columns
attribute_help_texts
two_factor_authentication
ldap_groups
custom_fields_in_projects_list).freeze
def initialize(token)

@ -374,10 +374,20 @@ af:
redirect_existing_links: Herlei bestaande skakels
planning_element_type_color:
hexcode: Hex kode
project_association:
description: Oorsaak
project_b: Afhanklike projek
project_type:
allows_association: Laat assosiasie toe
reported_project_statuses: Gerapporteerde projekstatusse
position: Posisie
allows_association: ''
reported_project_statuses: ''
timeline:
options: ''
reporting:
reported_project_status_comment: Status kommentaar
reporting_to_project: Gee verslag aan projek
reported_project_status: Projek status
created_at: Geskep
work_package:
begin_insertion: Begin of the insertion
begin_deletion: Begin of the deletion
@ -397,16 +407,6 @@ af:
time_entries: Log tyd
type: Soort
watcher: Dophouer
project_association:
description: ''
project_b: ''
timeline:
options: ''
reporting:
reported_project_status_comment: ''
reporting_to_project: ''
reported_project_status: ''
created_at: ''
errors:
messages:
accepted: must be accepted.
@ -429,7 +429,7 @@ af:
begindatum.
inclusion: is not set to one of the allowed values.
invalid: is invalid.
invalid_url: is not a valid URL.
invalid_url: is ’n ongeldige bronadres.
invalid_url_scheme: 'is not a supported protocol (allowed: %{allowed_schemes}).'
less_than_or_equal_to: must be less than or equal to %{count}.
not_a_date: is not a valid date.
@ -464,6 +464,10 @@ af:
attributes:
types:
in_use_by_work_packages: 'still in use by work packages: %{types}'
project_association:
identical_projects: Afhanklikheid kan nie tussen een projek en ditself geskep
word nie.
project_association_not_allowed: does not allow associations.
query:
attributes:
project:
@ -549,9 +553,6 @@ af:
member:
principal_blank: Kies asseblief ten minste een gebruiker of groep.
role_blank: Kies asseblief ten minste een rol.
project_association:
identical_projects: ''
project_association_not_allowed: ''
template:
body: 'Kontroleer asseblief die volgende velde:'
header:
@ -1114,7 +1115,7 @@ af:
label_select_main_menu_item: Kies nuwe hoofkieslysitem
label_select_project: Select a project
label_required_disk_storage: Required disk storage
label_send_invitation: Send invitation
label_send_invitation: Stuur uitnodiging
label_change_plural: Veranderinge
label_change_properties: Verander eienskappe
label_change_status: Verander status
@ -1227,6 +1228,7 @@ af:
label_greater_or_equal: ">="
label_group_by: Groepeer volgens
label_group_new: Nuwe groep
label_group: Groep
label_group_plural: Groepe
label_help: Help
label_here: hier
@ -1375,7 +1377,7 @@ af:
label_project_settings: Projek-instellings
label_projects_storage_information: "%{count} projects using %{storage} disk storage"
label_project_view_all: Bekyk alle projekte
label_project_show_details: Show project details
label_project_show_details: Toon projekdetails
label_project_hide_details: Versteek projekdetails
label_public_projects: Openbare projekte
label_query_new: New query
@ -1614,7 +1616,7 @@ af:
context.
invalid_type: No type found with name '%{type}' in project '%{project}'.
link_name: Nuwe werkspakket
link_name_type: New %{type_name}
link_name_type: Nuwe %{type_name}
mail:
actions: Actions
mail_body_account_activation_request: 'A new user (%{value}) has registered. The
@ -1770,6 +1772,7 @@ af:
permission_delete_work_packages: Delete work packages
permission_delete_messages: Delete messages
permission_delete_own_messages: Delete own messages
permission_delete_project_associations: Delete project dependencies
permission_delete_reportings: Delete reportings
permission_delete_timelines: Delete timelines
permission_delete_wiki_pages: Delete wiki pages
@ -1781,6 +1784,7 @@ af:
permission_edit_own_messages: Edit own messages
permission_edit_own_time_entries: Edit own time logs
permission_edit_project: Edit project
permission_edit_project_associations: Edit project dependencies
permission_edit_reportings: Edit reportings
permission_edit_time_entries: Edit time logs
permission_edit_timelines: Edit timelines
@ -1814,6 +1818,7 @@ af:
permission_view_work_packages: View work packages
permission_view_messages: View messages
permission_view_members: View members
permission_view_project_associations: View project dependencies
permission_view_reportings: View reportings
permission_view_time_entries: View spent time
permission_view_timelines: View timelines
@ -1847,12 +1852,12 @@ af:
query:
attribute_and_direction: "%{attribute} (%{direction})"
query_fields:
active_or_archived: Active or archived
active_or_archived: Aktief of geargiveer
assigned_to_role: Assignee's role
member_of_group: Assignee's group
assignee_or_group: Assignee or belonging group
subproject_id: Sub-projek
name_or_identifier: Name or identifier
name_or_identifier: Naam of identifiseerder
repositories:
at_identifier: at %{identifier}
atom_revision_feed: Atom revision feed
@ -2111,7 +2116,7 @@ af:
brute_force_prevention: Automated user blocking
show_hide_project_menu: Vergroot/verklein projek kieslys
status_active: active
status_archived: archived
status_archived: geargiveer
status_invited: invited
status_locked: locked
status_registered: registered
@ -2280,10 +2285,11 @@ af:
project_type: Projek soort
project_types: Project types
project_menu:
project_associations: Dependencies
reportings: Status reportings
reports: Timeline reports
timelines: Timelines
project_associations: ''
add_project_association: Add dependency
associations: Dependencies
board_could_not_be_saved: Board could not be saved
button_delete_all: Delete all
@ -2425,6 +2431,11 @@ af:
show: 'Status: %{comment}'
planning_element_update: 'Update: %{title}'
work_packages_are_displayed_in_aggregations: Work packages are displayed in aggregations
project_association_new: Add project dependency
project_association_new_for_with: Set dependency for “%{project_a}” with
project_association_with_other: Project dependency between “%{project_a}” and
“%{project_b}”
project_association_of_type: Dependency to project of type “%{type}”
project_type_could_not_be_saved: Project type could not be saved
type_could_not_be_saved: Type could not be saved
reporting_could_not_be_saved: Reporting could not be saved
@ -2432,6 +2443,10 @@ af:
really_delete_color: 'Are you sure, you want to delete the following color? Types
using this color will not be deleted.
'
really_delete_project_association_between_project_a_and_project_b: 'Are you sure,
you want to delete the dependency between “%{project_a}” and “%{project_b}”?
'
really_delete_project_type: 'Are you sure, you want to delete the following project
type? Projects using this type will not be deleted.
@ -2460,12 +2475,6 @@ af:
months: Months
quarters: Quarters
years: Years
add_project_association: ''
project_association_new: ''
project_association_new_for_with: ''
project_association_with_other: ''
project_association_of_type: ''
really_delete_project_association_between_project_a_and_project_b: ''
title_remove_and_delete_user: Remove the invited user from the project and delete
him/her.
tooltip_resend_invitation: 'Sends another invitation email with a fresh token in
@ -2587,7 +2596,7 @@ af:
multipart_body_error: Die versoekliggaam het nie die verwagte multipartdele
bevat nie.
multiple_errors: Verskeie veld beperkinge is oortree.
unable_to_create_attachment: The attachment could not be created
unable_to_create_attachment: Die aanhangsel kon nie geskep word nie
render:
context_not_parsable: Die konteks voorsien is nie 'n skakel na 'n hulpbron
nie.
@ -2604,6 +2613,3 @@ af:
writing_read_only_attributes: Jy mag nie 'n leesalleen kenmerk skryf nie.
resources:
schema: Skema
permission_delete_project_associations: ''
permission_edit_project_associations: ''
permission_view_project_associations: ''

@ -460,7 +460,7 @@ ar:
query:
attributes:
project:
error_not_found: not found
error_not_found: لم يتم العثور
public:
error_unauthorized: "- The user has no permission to create public queries."
group_by_hierarchies_exclusive: is mutually exclusive with group by '%{group_by}'.
@ -475,7 +475,7 @@ ar:
attributes:
to:
error_not_found: work package in `to` position not found or not visible
error_readonly: an existing relation's `to` link is immutable
error_readonly: الإرتباطات الحالية غير قابلة للتغيير
from:
error_not_found: work package in `from` position not found or not visible
error_readonly: علاقة الارتباط هذه غير ممكن تغييرها
@ -544,7 +544,7 @@ ar:
status:
invalid_on_create: ليس حالة صحيحة للمستخدمين الجدد.
auth_source:
error_not_found: not found
error_not_found: لم يتم العثور
member:
principal_blank: يرجى اختيار مستخدم واحد على الأقل أو مجموعة.
role_blank: من فضلك قم باختيار دور واحد على الأقل.
@ -1236,7 +1236,7 @@ ar:
label_download_plural: "%{count} تنزيلات"
label_downloads_abbr: D/L
label_duplicated_by: مكرر بواسطة
label_duplicate: duplicate
label_duplicate: مكرر
label_duplicates: التكرارات
label_edit: تعديل
label_enable_multi_select: تبديل متعدد الخيارات
@ -1247,7 +1247,7 @@ ar:
label_end_to_end: نهاية إلى نهاية
label_end_to_start: نهاية إلى بداية
label_enumeration_new: قيمة تعداد جديد
label_enumeration_value: Enumeration value
label_enumeration_value: إحصائيات
label_enumerations: تعدادات
label_enterprise: Enterprise
label_enterprise_edition: Enterprise Edition
@ -1281,6 +1281,7 @@ ar:
label_greater_or_equal: "=<"
label_group_by: تصنيف حسب
label_group_new: مجموعة جديدة
label_group: مجموعة
label_group_plural: المجموعات
label_help: مساعدة
label_here: هنا
@ -1302,7 +1303,7 @@ ar:
label_invite_user: دعوة مستخدم
label_show_hide: إظهار / إخفاء
label_show_all_registered_users: Show all registered users
label_journal: Journal
label_journal: يوميات
label_journal_diff: مقارنة التوصيف
label_language: اللغة
label_jump_to_a_project: الانتقال بسرعة إلى مشروع...
@ -1337,7 +1338,7 @@ ar:
label_member_plural: أعضاء
label_view_all_members: عرض جميع الأعضاء
label_menu_item_name: اسم عنصر من القائمة
label_message: Message
label_message: رسالة
label_message_last: الرسالة الأخيرة
label_message_new: رسالة جديدة
label_message_plural: رسائل
@ -1763,9 +1764,12 @@ ar:
notice_not_authorized: غير مسموح لك بالوصول إلى هذه الصفحة.
notice_not_authorized_archived_project: المشروع الذي تحاول الوصول إليه تمت أرشفته.
notice_password_confirmation_failed: Your password is not correct. Cannot continue.
notice_principals_found_multiple: "There are %{number} results found. \n Tab to
focus the first result."
notice_principals_found_single: "There is one result. \n Tab to focus it."
notice_principals_found_multiple: |-
وُجِد %{number} من النتائج.
إضغط كي تحدد على النتيجة الأولى.
notice_principals_found_single: |-
هنالك نتيجة واحدة.
إضغط لتحديدها.
notice_project_not_deleted: لم يتم حذف المشروع.
notice_successful_connection: اتصال ناجح.
notice_successful_create: إنشاء ناجح.

@ -1224,6 +1224,7 @@ bg:
label_greater_or_equal: ">="
label_group_by: Групиране по
label_group_new: Нова група
label_group: Група
label_group_plural: Групи
label_help: Помощ
label_here: тук

@ -1234,6 +1234,7 @@ ca:
label_greater_or_equal: ">="
label_group_by: Agrupa per
label_group_new: Nou grup
label_group: Grup
label_group_plural: Grups
label_help: Ajuda
label_here: aquí

@ -1236,6 +1236,7 @@ cs:
label_greater_or_equal: ">="
label_group_by: Group by
label_group_new: New group
label_group: Skupina
label_group_plural: Skupiny
label_help: Nápověda
label_here: here

@ -1218,6 +1218,7 @@ da:
label_greater_or_equal: ">="
label_group_by: Gruppér efter
label_group_new: Ny gruppe
label_group: Gruppe
label_group_plural: Grupper
label_help: Hjælp
label_here: her

@ -1246,6 +1246,7 @@ de:
label_greater_or_equal: ">="
label_group_by: Gruppieren nach
label_group_new: Neue Gruppe
label_group: Gruppe
label_group_plural: Gruppen
label_help: Hilfe
label_here: hier

@ -247,8 +247,8 @@ es:
login_verification:
other: Escriba el %{name} de inicio de sesión para verificar la eliminación.
Después del envío, se le pedirá que confirme la contraseña.
self: Escriba su %{name} de inicio de sesión para verificar la eliminación.
Después del envío, se le pedirá que confirme la contraseña.
self: Introducir el %{name} de inicio de sesión para verificar la eliminación.
Una vez que se envíe, se le pedirá confirmar la contraseña.
error_inactive_activation_by_mail: 'Su cuenta aún no está activada. Para activar
su cuenta, haga clic en el enlace que fue enviado por correo electrónico.
@ -493,7 +493,7 @@ es:
invalid: El campo personalizado no es válido en el contexto válido.
relation:
typed_dag:
circular_dependency: La relación crea un círculo de relaciones.
circular_dependency: La relación crea un bucle de relaciones.
attributes:
to:
error_not_found: el paquete de trabajo en posición 'a' no se ha encontrado
@ -508,8 +508,8 @@ es:
repository:
not_available: El proveedor SMC no está disponible
not_whitelisted: no está permitido por la configuración.
invalid_url: no es una dirección URL o ruta de acceso válida a un repositorio.
must_not_be_ssh: no debe ser una dirección URL para SSH.
invalid_url: no es una dirección URL o ruta válida para un repositorio.
must_not_be_ssh: no debe usarse una URL de SSH.
no_directory: no es un directorio.
work_package:
is_not_a_valid_target_for_time_entries: 'Paquete de trabajo #%{id} no es
@ -730,7 +730,7 @@ es:
failed: No se puede copiar proyecto %{source_project_name}
succeeded: Proyecto creado %{target_project_name}
errors: Error
project_custom_fields: Campos personalizados en el proyecto
project_custom_fields: Campos personalizados del proyecto
text:
failed: No se pudo copiar el proyecto "%{source_project_name}" al proyecto "%{target_project_name}".
succeeded: Proyecto copiado de "%{source_project_name}" a "%{target_project_name}".
@ -938,8 +938,8 @@ es:
enumeration_work_package_priorities: Prioridades del paquete de trabajo
enumeration_system_activity: Actividad del sistema
enumeration_reported_project_statuses: Estatus del proyecto reportado
error_auth_source_sso_failed: El inicio de sesión único (SSO) del usuario “%{value}”
produjo errores
error_auth_source_sso_failed: El intento de inicio de sesión único (SSO) para el
usuario “%{value}” falló
error_can_not_archive_project: El proyecto no se puede archivar
error_can_not_delete_entry: No se puede eliminar la entrada
error_can_not_delete_custom_field: Imposible eliminar el campo seleccionado
@ -1051,7 +1051,7 @@ es:
forums: Foros
blog: Blog de OpenProject
boards: Foro de la comunidad
newsletter: Alertas de seguridad/boletín
newsletter: Alertas de seguridad / boletín
instructions_after_registration: Podras entrar tan pronto como tu cuenta halla sido
activada haciendo clic sobre %{signin}.
instructions_after_logout: Puedes entrar nuevamente haciendo clic sobre %{signin}.
@ -1237,7 +1237,7 @@ es:
label_file_plural: Archivos
label_filter_add: Añadir filtro
label_filter_plural: Filtros
label_filters_toggle: Mostrar/Ocultar filtro
label_filters_toggle: Mostrar/Ocultar filtros
label_float: Desprender
label_folder: Carpeta
label_follows: sigue
@ -1250,6 +1250,7 @@ es:
label_greater_or_equal: ">="
label_group_by: Agrupar por
label_group_new: Nuevo grupo
label_group: Grupo
label_group_plural: Grupos
label_help: Ayuda
label_here: aqui
@ -1642,12 +1643,12 @@ es:
macros:
create_work_package_link:
errors:
no_project_context: Calling create_work_package_link macro from outside project
context.
no_project_context: Invocando la macro create_work_package_link desde el contexto
del proyecto externo.
invalid_type: No se ha encontrado ningún tipo con nombre '%{type}' en el proyecto
'%{project}'.
link_name: Nuevo paquete de trabajo
link_name_type: New %{type_name}
link_name_type: "%{type_name} nuevo"
mail:
actions: Acciones
mail_body_account_activation_request: 'Ha registrado un nuevo usuario (%{value}).
@ -2661,7 +2662,7 @@ es:
multipart_body_error: El cuerpo de la solicitud no contiene las partes multiparts
previstas.
multiple_errors: Múltiples limitaciones de campo han sido violadas.
unable_to_create_attachment: The attachment could not be created
unable_to_create_attachment: No se pudo crear el adjunto
render:
context_not_parsable: El contexto proporcionado no es un enlace a un recurso.
unsupported_context: El recurso dado no es soportado como contexto.

@ -1220,6 +1220,7 @@ et:
label_greater_or_equal: ">="
label_group_by: Group by
label_group_new: Uus rühm
label_group: Grupp
label_group_plural: Rühmad
label_help: Abi
label_here: here

@ -1218,6 +1218,7 @@ fa:
label_greater_or_equal: ">="
label_group_by: Group by
label_group_new: New group
label_group: Group
label_group_plural: Groups
label_help: Help
label_here: here

@ -1216,6 +1216,7 @@ fi:
label_greater_or_equal: ">="
label_group_by: Ryhmittely
label_group_new: Uusi ryhmä
label_group: Ryhmä
label_group_plural: Ryhmät
label_help: Ohjeet
label_here: tässä

@ -1246,6 +1246,7 @@ fr:
label_greater_or_equal: ">="
label_group_by: Grouper par
label_group_new: Nouveau groupe
label_group: Groupe
label_group_plural: Groupes
label_help: Aide
label_here: ici

@ -1238,6 +1238,7 @@ he:
label_greater_or_equal: ">="
label_group_by: קבץ לפי
label_group_new: קבוצה חדשה
label_group: קבוצה
label_group_plural: קבוצות
label_help: עזרה
label_here: here

@ -1238,6 +1238,7 @@ hr:
label_greater_or_equal: ">="
label_group_by: Grupiraj po
label_group_new: Nova grupa
label_group: Grupa
label_group_plural: Grupe
label_help: Pomoć
label_here: ovdje

@ -606,8 +606,8 @@ hu:
description: Leírás
display_sums: Megjelenitendő összegek
due_date: Lejárati időpont
estimated_hours: Tervezett időpont
estimated_time: Tervezett időpont
estimated_hours: Becsült idő (óra)
estimated_time: Becsült idő (óra)
firstname: Keresztnév
group: Csoport
groups: Csoportok
@ -1223,6 +1223,7 @@ hu:
label_greater_or_equal: ">="
label_group_by: Csoportosítás a következők szerint
label_group_new: Új csoport
label_group: Csoport
label_group_plural: Csoportok
label_help: Segítség
label_here: itt

@ -1217,6 +1217,7 @@ id:
label_greater_or_equal: ">="
label_group_by: Grup oleh
label_group_new: Grup baru
label_group: Grup
label_group_plural: Grup
label_help: Support
label_here: disini

@ -1243,6 +1243,7 @@ it:
label_greater_or_equal: ">="
label_group_by: Raggruppa per
label_group_new: Nuovo gruppo
label_group: Gruppo
label_group_plural: Gruppi
label_help: Aiuto
label_here: qui

@ -1139,6 +1139,7 @@ ja:
label_greater_or_equal: ">="
label_group_by: グループ化
label_group_new: 新規グループ
label_group: グループ
label_group_plural: グループ
label_help: ヘルプ
label_here: こちら

@ -88,7 +88,7 @@ ar:
label_board_locked: مقفل
label_board_sticky: مثبت
label_create_work_package: إنشاء حزمة جديدة
label_created_by: Created by
label_created_by: أنشئ بواسطة
label_date: التاريخ
label_date_with_format: 'أدخل %{date_attribute} باستخدام التنسيق التالي: %{format}'
label_deactivate: تعطيل
@ -211,7 +211,7 @@ ar:
default: "-"
subject: Enter subject here
selection: من فضلك اختر
relation_description: Click to add description for this relation
relation_description: انقر لإضافة وصف لهذه العلاقة
project:
required_outside_context: You are not within a project context. Please choose
the project context first in order to select type and status
@ -254,33 +254,33 @@ ar:
blocked: محظور من قِبَل
precedes: يسبق
follows: يتبع
includes: Includes
partof: Part of
requires: Requires
required: Required by
relation_type: relation type
includes: يتضمن
partof: جزء من
requires: يتطلّب
required: مطلوب من قبل
relation_type: نوع العلاقة
relations_hierarchy:
hierarchy_headline: hierarchy
hierarchy_headline: تسلسل هرمي
relation_buttons:
change_parent: تغيير الوالد
remove_parent: Remove parent
group_by_wp_type: Group by work package type
group_by_relation_type: Group by relation type
add_parent: Add existing parent
add_new_child: Create new child
remove_parent: إزالة والد
group_by_wp_type: تجميع حسب نوع حزمة العمل
group_by_relation_type: تصنيف حسب نوع العلاقة
add_parent: إضافة والد موجود مسبقًا
add_new_child: إنشاء طفل جديد
add_existing_child: Add existing child
remove_child: Remove child
add_new_relation: Create new relation
remove_child: إزالة طفل
add_new_relation: إنشاء علاقة جديدة
update_description: Set or update description of this relation
toggle_description: Toggle relation description
update_relation: Click to change the relation type
add_follower: Add follower
add_predecessor: Add predecessor
remove: حذف علاقة
save: Save relation
abort: Abort
save: إحفظ العلاقة
abort: إلغاء
relations_autocomplete:
placeholder: Enter the related work package id
placeholder: أدخل معرّف حزمة العمل ذات الصلة
repositories:
select_tag: حدد العلامة
select_branch: اختر فرع
@ -448,14 +448,14 @@ ar:
message_successful_bulk_delete: تم حذف مجموعات العمل بنجاح.
message_successful_show_in_fullscreen: اضغط هنا لفتح مجموعة العمل هذه بعرض كامل
الشاشة.
message_view_spent_time: Show spent time for this work package
message_view_spent_time: أظهر الوقت المنقضي في رزمة العمل هذه
no_value: لا توجد قيمة
inline_create:
title: اضغط هنا لإضافة مجموعة عمل جديدة للقائمة
create:
header: New %{type}
header_no_type: New work package (Type not yet set)
header_with_parent: 'New %{type} (Child of %{parent_type} #%{id})'
header: "%{type} جديد"
header_no_type: حزمة عمل جديدة (النوع لم يحدد بعد)
header_with_parent: "%{type} جديد (طفل %{parent_type} #%{id})"
button: إنشاء
hierarchy:
show: Show hierarchy mode
@ -527,7 +527,7 @@ ar:
display_sums: عرض المبالغ
errors:
unretrievable_query: غير قادر على استرداد الاستعلام من URL
not_found: There is no such query
not_found: لا يوجد مثل هذا الإستعلام
text_no_results: No matching queries were found.
table:
summary: أسطر الجدول كتب عمل والاعمدة واصفات لكتب العمل.

@ -485,7 +485,7 @@ hu:
description: Leírás
date: Dátum
dueDate: Lejárati időpont
estimatedTime: Tervezett időpont
estimatedTime: Becsült idő (óra)
spentTime: Eltöltött idő
category: Kategória
percentageDone: Százalékosan elkészült

@ -396,7 +396,7 @@ sk:
update_message: Please update your browser.
update_ie_user: Please switch to Mozilla Firefox or Google Chrome, or upgrade
to Microsoft Edge.
learn_more: Learn more
learn_more: Zistiť viac
close_warning: Ignore this warning.
wiki_formatting:
strong: Tučné

@ -72,7 +72,7 @@ zh:
label_activity_with_comment_no: 活动条目编号 %{activityNo},有用户评论。
label_add_columns: 增添列
label_add_comment: 添加评论
label_add_comment_title: Comment and type @ to notify other people
label_add_comment_title: 写下评论并输入@ 以通知其他人
label_add_selected_columns: 添加所选的列
label_added_by: 添加人
label_added_time_by: 由 %{author} %{age} 添加
@ -215,7 +215,7 @@ zh:
work_package_belongs_to: 此工作包属于项目%{projectname}。
click_to_switch_context: 在该项目中打开此工作包。
autocompleter:
label: Project autocompletion
label: 项目自动补全
text_are_you_sure: 是否确定?
types:
attribute_groups:

@ -1183,6 +1183,7 @@ ko:
label_greater_or_equal: ">="
label_group_by: 그룹화 기준
label_group_new: 새 그룹
label_group: 그룹
label_group_plural: 그룹
label_help: 도움말
label_here: 여기

@ -329,10 +329,20 @@ lol:
redirect_existing_links: crwdns92540:0crwdne92540:0
planning_element_type_color:
hexcode: crwdns92541:0crwdne92541:0
project_association:
description: crwdns95534:0crwdne95534:0
project_b: crwdns95535:0crwdne95535:0
project_type:
allows_association: crwdns95536:0crwdne95536:0
reported_project_statuses: crwdns95537:0crwdne95537:0
position: crwdns92546:0crwdne92546:0
allows_association: ''
reported_project_statuses: ''
timeline:
options: crwdns95538:0crwdne95538:0
reporting:
reported_project_status_comment: crwdns95539:0crwdne95539:0
reporting_to_project: crwdns95540:0crwdne95540:0
reported_project_status: crwdns95541:0crwdne95541:0
created_at: crwdns95542:0crwdne95542:0
work_package:
begin_insertion: crwdns92552:0crwdne92552:0
begin_deletion: crwdns92553:0crwdne92553:0
@ -352,16 +362,6 @@ lol:
time_entries: crwdns92567:0crwdne92567:0
type: crwdns92568:0crwdne92568:0
watcher: crwdns92569:0crwdne92569:0
project_association:
description: ''
project_b: ''
timeline:
options: ''
reporting:
reported_project_status_comment: ''
reporting_to_project: ''
reported_project_status: ''
created_at: ''
errors:
messages:
accepted: crwdns92570:0crwdne92570:0
@ -416,6 +416,9 @@ lol:
attributes:
types:
in_use_by_work_packages: crwdns92607:0%{types}crwdne92607:0
project_association:
identical_projects: crwdns95543:0crwdne95543:0
project_association_not_allowed: crwdns95544:0crwdne95544:0
query:
attributes:
project:
@ -490,9 +493,6 @@ lol:
member:
principal_blank: crwdns92641:0crwdne92641:0
role_blank: crwdns92642:0crwdne92642:0
project_association:
identical_projects: ''
project_association_not_allowed: ''
template:
body: crwdns92643:0crwdne92643:0
header:
@ -1133,6 +1133,7 @@ lol:
label_greater_or_equal: crwdns93207:0crwdne93207:0
label_group_by: crwdns93208:0crwdne93208:0
label_group_new: crwdns93209:0crwdne93209:0
label_group: crwdns95522:0crwdne95522:0
label_group_plural: crwdns93210:0crwdne93210:0
label_help: crwdns93211:0crwdne93211:0
label_here: crwdns93212:0crwdne93212:0
@ -1635,6 +1636,7 @@ lol:
permission_delete_work_packages: crwdns93673:0crwdne93673:0
permission_delete_messages: crwdns93674:0crwdne93674:0
permission_delete_own_messages: crwdns93675:0crwdne93675:0
permission_delete_project_associations: crwdns95545:0crwdne95545:0
permission_delete_reportings: crwdns93677:0crwdne93677:0
permission_delete_timelines: crwdns93678:0crwdne93678:0
permission_delete_wiki_pages: crwdns93679:0crwdne93679:0
@ -1646,6 +1648,7 @@ lol:
permission_edit_own_messages: crwdns93685:0crwdne93685:0
permission_edit_own_time_entries: crwdns93686:0crwdne93686:0
permission_edit_project: crwdns93687:0crwdne93687:0
permission_edit_project_associations: crwdns95546:0crwdne95546:0
permission_edit_reportings: crwdns93689:0crwdne93689:0
permission_edit_time_entries: crwdns93690:0crwdne93690:0
permission_edit_timelines: crwdns93691:0crwdne93691:0
@ -1679,6 +1682,7 @@ lol:
permission_view_work_packages: crwdns93719:0crwdne93719:0
permission_view_messages: crwdns93720:0crwdne93720:0
permission_view_members: crwdns93721:0crwdne93721:0
permission_view_project_associations: crwdns95547:0crwdne95547:0
permission_view_reportings: crwdns93723:0crwdne93723:0
permission_view_time_entries: crwdns93724:0crwdne93724:0
permission_view_timelines: crwdns93725:0crwdne93725:0
@ -2052,10 +2056,11 @@ lol:
project_type: crwdns94051:0crwdne94051:0
project_types: crwdns94052:0crwdne94052:0
project_menu:
project_associations: crwdns95548:0crwdne95548:0
reportings: crwdns94054:0crwdne94054:0
reports: crwdns94055:0crwdne94055:0
timelines: crwdns94056:0crwdne94056:0
project_associations: ''
add_project_association: crwdns95549:0crwdne95549:0
associations: crwdns94058:0crwdne94058:0
board_could_not_be_saved: crwdns94059:0crwdne94059:0
button_delete_all: crwdns94060:0crwdne94060:0
@ -2185,12 +2190,19 @@ lol:
show: crwdns94172:0%{comment}crwdne94172:0
planning_element_update: crwdns94173:0%{title}crwdne94173:0
work_packages_are_displayed_in_aggregations: crwdns94174:0crwdne94174:0
project_association_new: crwdns95550:0crwdne95550:0
project_association_new_for_with: crwdns95551:0%{project_a}crwdne95551:0
project_association_with_other: crwdns95552:0%{project_a}crwdnd95552:0%{project_b}crwdne95552:0
project_association_of_type: crwdns95553:0%{type}crwdne95553:0
project_type_could_not_be_saved: crwdns94179:0crwdne94179:0
type_could_not_be_saved: crwdns94180:0crwdne94180:0
reporting_could_not_be_saved: crwdns94181:0crwdne94181:0
properties: crwdns94182:0crwdne94182:0
really_delete_color: 'crwdns94183:0crwdne94183:0
'
really_delete_project_association_between_project_a_and_project_b: 'crwdns95554:0%{project_a}crwdnd95554:0%{project_b}crwdne95554:0
'
really_delete_project_type: 'crwdns94185:0crwdne94185:0
@ -2216,12 +2228,6 @@ lol:
months: crwdns94199:0crwdne94199:0
quarters: crwdns94200:0crwdne94200:0
years: crwdns94201:0crwdne94201:0
add_project_association: ''
project_association_new: ''
project_association_new_for_with: ''
project_association_with_other: ''
project_association_of_type: ''
really_delete_project_association_between_project_a_and_project_b: ''
title_remove_and_delete_user: crwdns94202:0crwdne94202:0
tooltip_resend_invitation: 'crwdns94203:0crwdne94203:0
@ -2333,6 +2339,3 @@ lol:
writing_read_only_attributes: crwdns94284:0crwdne94284:0
resources:
schema: crwdns94285:0crwdne94285:0
permission_delete_project_associations: ''
permission_edit_project_associations: ''
permission_view_project_associations: ''

@ -1234,6 +1234,7 @@ lt:
label_greater_or_equal: ">="
label_group_by: Grupuoti pagal
label_group_new: Nauja grupė
label_group: Grupė
label_group_plural: Grupės
label_help: Pagalba
label_here: čia

@ -1230,6 +1230,7 @@ lv:
label_greater_or_equal: ">="
label_group_by: Group by
label_group_new: New group
label_group: Group
label_group_plural: Groups
label_help: Palīdzība
label_here: here

@ -1233,6 +1233,7 @@ nl:
label_greater_or_equal: ">="
label_group_by: Groeperen op
label_group_new: Nieuwe groep
label_group: Groep
label_group_plural: Groepen
label_help: Help
label_here: hier

@ -1218,6 +1218,7 @@
label_greater_or_equal: ">="
label_group_by: Grupper etter
label_group_new: Ny gruppe
label_group: Gruppe
label_group_plural: Grupper
label_help: Hjelp
label_here: her

@ -1235,6 +1235,7 @@ pl:
label_greater_or_equal: "≥"
label_group_by: Grupuj według
label_group_new: Nowa Grupa
label_group: Grupa
label_group_plural: Grupy
label_help: Pomoc
label_here: tutaj

@ -1226,6 +1226,7 @@ pt-BR:
label_greater_or_equal: ">="
label_group_by: Agrupar por
label_group_new: Novo grupo
label_group: Grupo
label_group_plural: Grupos
label_help: Ajuda
label_here: aqui
@ -1614,8 +1615,8 @@ pt-BR:
macros:
create_work_package_link:
errors:
no_project_context: Calling create_work_package_link macro from outside project
context.
no_project_context: Chamando macro create_work_package_link fora do contexto
do projeto.
invalid_type: Nenhum tipo com o nome '%{type}' encontrado no projeto '%{project}'.
link_name: Novo pacote de trabalho
link_name_type: Novo %{type_name}

@ -1241,6 +1241,7 @@ pt:
label_greater_or_equal: ">="
label_group_by: Agrupar por
label_group_new: Novo Grupo
label_group: Grupo
label_group_plural: Groupos
label_help: Ajuda
label_here: aqui

@ -1243,6 +1243,7 @@ ro:
label_greater_or_equal: ">="
label_group_by: Grupare după
label_group_new: Grupare nouă
label_group: Grup
label_group_plural: Grupuri
label_help: Asistenţă
label_here: aici

@ -1240,6 +1240,7 @@ ru:
label_greater_or_equal: ">="
label_group_by: Группировать по
label_group_new: Новая группа
label_group: Группа
label_group_plural: Группы
label_help: Справка
label_here: здесь

@ -1246,6 +1246,7 @@ sk:
label_greater_or_equal: ">="
label_group_by: Zoskupiť podľa
label_group_new: Nová skupina
label_group: Skupina
label_group_plural: Skupiny
label_help: Nápoveda
label_here: tu
@ -1502,39 +1503,40 @@ sk:
label_user: Užívateľ(ka)
label_user_activity: Aktivita používateľa %{value}
label_user_anonymous: Anonymný
label_user_mail_option_all: For any event on all my projects
label_user_mail_option_all: Pre všetky udalosti všetkých mojich projektov
label_user_mail_option_none: Žiadne udalosti
label_user_mail_option_only_assigned: Len pre veci, na ktoré som priradený
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
label_user_mail_option_only_owner: Only for things I am the owner of
label_user_mail_option_only_my_events: Len pre veci, ktoré sledujem, alebo v ktorých
som zapojený
label_user_mail_option_only_owner: Len pre veci, ktorých som vlastníkom
label_user_mail_option_selected: For any event on the selected projects only
label_user_new: New user
label_user_plural: Users
label_user_search: Search for user
label_user_new: Nový uživateľ
label_user_plural: Užívatelia
label_user_search: Hľadať používateľa
label_version_new: Nová verzia
label_version_plural: Verzie
label_version_sharing_descendants: With subprojects
label_version_sharing_hierarchy: With project hierarchy
label_version_sharing_none: Not shared
label_version_sharing_system: With all projects
label_version_sharing_tree: With project tree
label_version_sharing_descendants: S podprojektmi
label_version_sharing_hierarchy: S hierarchiou projektu
label_version_sharing_none: Nezdieľané
label_version_sharing_system: So všetkými projektmi
label_version_sharing_tree: S projektovým stromom
label_video: Video
label_view_all_revisions: Zobraziť všetky revízie
label_view_diff: View differences
label_view_diff: Zobraziť rozdiely
label_view_revisions: Zobraziť revízie
label_watched_work_packages: Watched work packages
label_week: Week
label_wiki_content_added: Wiki page added
label_wiki_content_updated: Wiki page updated
label_watched_work_packages: Pozorované pracovné balíčky
label_week: Týždeň
label_wiki_content_added: Wikistránka bola pridaná
label_wiki_content_updated: Wikistránka bola aktualizovaná
label_wiki_toc: Obsah
label_wiki_dont_show_menu_item: Do not show this wikipage in project navigation
label_wiki_edit: Wiki edit
label_wiki_edit_plural: Wiki edits
label_wiki_dont_show_menu_item: Nezobrazovať túto wikistránku v navigácií projektu
label_wiki_edit: Wiki úprava
label_wiki_edit_plural: Wiki úpravy
label_wiki_page_attachments: Prílohy wiki stránky
label_wiki_page_id: Wiki page ID
label_wiki_navigation: Wiki navigation
label_wiki_navigation: Wiki navigácia
label_wiki_page: Wiki stránka
label_wiki_page_plural: Wiki pages
label_wiki_page_plural: Wikistránky
label_wiki_show_index_page_link: Show submenu item 'Table of Contents'
label_wiki_show_menu_item: Show as menu item in project navigation
label_wiki_show_new_page_link: Show submenu item 'Create new child page'
@ -1566,7 +1568,7 @@ sk:
label_work_package_view_all_watched: Zobraziť všetky sledované pracovné balíčky
label_work_package_watchers: Pozorovatelia
label_workflow: Pracovný postup
label_workflow_plural: Workflows
label_workflow_plural: Pracovné postupy
label_workflow_summary: Zhrnutie
label_x_closed_work_packages_abbr:
one: 1 uzatvorený
@ -1629,10 +1631,10 @@ sk:
label_visible_elements: Viditeľné prvky
auth_source:
using_abstract_auth_source: Can't use an abstract authentication source.
ldap_error: 'LDAP-Error: %{error_message}'
ldap_auth_failed: Could not authenticate at the LDAP-Server.
ldap_error: 'LDAP-Chyba: %{error_message}'
ldap_auth_failed: Nemožno overiť v LDAP-Serveri.
macro_execution_error: Error executing the macro %{macro_name}
macro_unavailable: Macro %{macro_name} cannot be displayed.
macro_unavailable: Makro %{macro_name} sa nedá zobraziť.
macros:
create_work_package_link:
errors:
@ -1643,34 +1645,33 @@ sk:
link_name_type: New %{type_name}
mail:
actions: Akcie
mail_body_account_activation_request: 'A new user (%{value}) has registered. The
account is pending your approval:'
mail_body_account_information: Your account information
mail_body_account_information_external: You can use your %{value} account to log
in.
mail_body_lost_password: 'To change your password, click on the following link:'
mail_body_register: 'To activate your account, click on the following link:'
mail_body_account_activation_request: 'Bol zaregistrovaný nový používateľ (%{value}).
Účet čaká na vaše schválenie:'
mail_body_account_information: Informácie o vašom účte
mail_body_account_information_external: Môžete sa prihlásiť pomocou vášho účtu %{value}.
mail_body_lost_password: 'Na zmenu hesla kliknite na nasledujúci odkaz:'
mail_body_register: 'Ak si želáte aktivovať váš účet, kliknite na nasledujúci odkaz:'
mail_body_reminder: "%{count} pracovné balíčky (balíček), ktoré sú priradené vám
a finišujú v najbližších %{days} dňoch:"
mail_body_wiki_content_added: The '%{id}' wiki page has been added by %{author}.
mail_body_wiki_content_updated: The '%{id}' wiki page has been updated by %{author}.
mail_subject_account_activation_request: "%{value} account activation request"
mail_subject_lost_password: Your %{value} password
mail_subject_register: Your %{value} account activation
mail_body_wiki_content_added: Používateľ %{author} pridal wikistránku '%{id}'.
mail_body_wiki_content_updated: Používateľ %{author} aktualizoval wikistránku '%{id}'.
mail_subject_account_activation_request: Požiadavka na aktiváciu účtu %{value}
mail_subject_lost_password: Vaše heslo %{value}
mail_subject_register: Aktivácia vášho účtu %{value}
mail_subject_reminder: "%{count} pracovných balíčkov, ktoré finišujú v najbližších
%{days} dňoch"
mail_subject_wiki_content_added: "'%{id}' wiki page has been added"
mail_subject_wiki_content_updated: "'%{id}' wiki page has been updated"
more_actions: More functions
mail_subject_wiki_content_added: Bola pridaná wikistránka '%{id}'
mail_subject_wiki_content_updated: Wikistránka '%{id}' bola aktualizovaná
more_actions: Ďalšie funkcie
noscript_description: Musíte aktivovať JavaScript, aby ste mohli používať OpenProject!
noscript_heading: JavaScript disabled
noscript_learn_more: Learn more
noscript_heading: JavaScript vypnutý
noscript_learn_more: Zistiť viac
notice_accessibility_mode: Režim prístupov môžete sprístupniť vo vašich [account
settings](url).
notice_account_activated: Your account has been activated. You can now log in.
notice_account_activated: Váš účet bol aktivovaný. Teraz se môžete prihlásiť.
notice_account_already_activated: The account has already been activated.
notice_account_invalid_token: Invalid activation token
notice_account_invalid_credentials: Invalid user or password
notice_account_invalid_credentials: Nesprávne meno alebo heslo
notice_account_invalid_credentials_or_blocked: Invalid user or password or the account
is blocked due to multiple failed login attempts. If so, it will be unblocked
automatically in a short time.

@ -1218,6 +1218,7 @@ sv-SE:
label_greater_or_equal: ">="
label_group_by: Gruppera efter
label_group_new: Ny grupp
label_group: Grupp
label_group_plural: Grupper
label_help: Hjälp
label_here: här

@ -1205,6 +1205,7 @@ th:
label_greater_or_equal: ">="
label_group_by: Group by
label_group_new: กลมใหม
label_group: กล
label_group_plural: กล
label_help: ใช
label_here:

@ -1218,6 +1218,7 @@ tr:
label_greater_or_equal: ">="
label_group_by: Grupla
label_group_new: Yeni grup
label_group: Grup
label_group_plural: Gruplar
label_help: Yardım
label_here: buraya

@ -1237,6 +1237,7 @@ uk:
label_greater_or_equal: ">="
label_group_by: Group by
label_group_new: New group
label_group: Group
label_group_plural: Groups
label_help: Help
label_here: here

@ -1220,6 +1220,7 @@ vi:
label_greater_or_equal: ">="
label_group_by: Nhóm theo
label_group_new: Nhóm mới
label_group: Nhóm
label_group_plural: Các Nhóm
label_help: Trợ giúp
label_here: đây

@ -1158,6 +1158,7 @@ zh-TW:
label_greater_or_equal: ">="
label_group_by: 分組依據
label_group_new: 新增群組
label_group: 群組
label_group_plural: 群組
label_help: 説明
label_here: 這裡

@ -1137,6 +1137,7 @@ zh:
label_greater_or_equal: ">="
label_group_by: 分组按照
label_group_new: 新的组
label_group:
label_group_plural:
label_help: 帮助
label_here: 这里
@ -1513,11 +1514,10 @@ zh:
macros:
create_work_package_link:
errors:
no_project_context: Calling create_work_package_link macro from outside project
context.
invalid_type: No type found with name '%{type}' in project '%{project}'.
no_project_context: 从外部项目上下文调用 create_work_package_link 宏。
invalid_type: 在项目 "%{project}" 中找不到名称为 "%{type}" 的类型。
link_name: 新工作包
link_name_type: New %{type_name}
link_name_type: %{type_name}
mail:
actions: 操作
mail_body_account_activation_request: 一个新的用户 (%{value}) 注册。该帐户正在等待您的批准:
@ -2335,7 +2335,7 @@ zh:
missing_or_malformed_parameter: 查询参数“%{parameter}”缺失或不正确。
multipart_body_error: 请求正文中不包含所需要的多段部分。
multiple_errors: 违反了多个字段的约束。
unable_to_create_attachment: The attachment could not be created
unable_to_create_attachment: 无法创建附件
render:
context_not_parsable: 所提供的上下文环境并不是指向资源的链接。
unsupported_context: 所提供的资源不被上下文环境所支持。

@ -2,7 +2,10 @@
id="types-context-menu">
<ul class="dropdown-menu" ng-class="{'-empty': $ctrl.types.length === 0 }">
<li ng-repeat="type in $ctrl.types">
<a class="menu-item" ui-sref="{{$ctrl.stateName}}({type: type.id})" href>
<a class="menu-item" ui-sref="{{$ctrl.stateName}}({type: type.id})" href ng-if="!$ctrl.isMobile">
{{ type.name }}
</a>
<a class="menu-item" ui-sref="work-packages.new({type: type.id})" href ng-if="$ctrl.isMobile">
{{ type.name }}
</a>
</li>

@ -34,6 +34,7 @@ import {StateService} from '@uirouter/angularjs';
class TypesContextMenuController {
public types:CollectionResource[] = [];
public isMobile:Boolean;
constructor(protected $state:StateService,
protected $timeout:ng.ITimeoutService,
@ -41,6 +42,7 @@ class TypesContextMenuController {
protected wpCreate:WorkPackageCreateService) {
const project = $scope.projectIdentifier;
$scope.$ctrl = this;
this.isMobile = document.documentElement.classList.contains('-browser-mobile');
wpCreate.getEmptyForm(project).then((form:any) => {
this.types = form.schema.type.allowedValues;

@ -34,6 +34,8 @@ module OpenProject
# syntax differences.
module Database
class InsufficientVersionError < StandardError; end
# This method returns a hash which maps the identifier of the supported
# adapter to a regex matching the adapter_name.
def self.supported_adapters
@ -43,6 +45,53 @@ module OpenProject
})
end
##
# Get the database system requirements
def self.required_versions
{
postgresql: {
numeric: 90500, # PG_VERSION_NUM
string: '9.5.0',
enforced: true
},
mysql: {
string: '5.6.0',
enforced: false
}
}
end
##
# Check the database version compatibility.
# Raises an +InsufficientVersionError+ when the version is incompatible
def self.check_version!
required = required_versions[name]
current = version
return if version_matches?
message = "Database server version mismatch: Required version is #{required[:string]}, " \
"but current version is #{current}"
if required[:enforced]
raise InsufficientVersionError.new message
else
warn "#{message}. Version is not enforced for this database however, so continuing with this version."
end
end
##
# Return +true+ if the required version is matched by the current connection.
def self.version_matches?
required = required_versions[name]
case name
when :mysql
Gem::Version.new(version) >= Gem::Version.new(required[:string])
when :postgresql
numeric_version >= required[:numeric]
end
end
# Get the raw name of the currently used database adapter.
# This string is set by the used adapter gem.
def self.adapter_name(connection)
@ -75,11 +124,20 @@ module OpenProject
def self.version(raw = false)
case name
when :mysql
version = ActiveRecord::Base.connection.select_value('SELECT VERSION()')
ActiveRecord::Base.connection.select_value('SELECT VERSION()')
when :postgresql
version = ActiveRecord::Base.connection.select_value('SELECT version()')
raw ? version : version.match(/\APostgreSQL (\S+)/i)[1]
end
end
def self.numeric_version
case name
when :mysql
raise ArgumentError, "Can't get numeric version of MySQL"
when :postgresql
ActiveRecord::Base.connection.select_value('SHOW server_version_num;').to_i
end
end
end
end

@ -37,3 +37,37 @@ namespace 'db:sessions' do
ActiveRecord::Base.connection.execute "DELETE FROM #{sessions_table} WHERE updated_at < '#{expiration_time}'"
end
end
namespace 'openproject' do
namespace 'db' do
desc 'Expire old sessions from the sessions table'
task ensure_database_compatibility: [:environment, 'db:load_config'] do
override = ActiveModel::Type::Boolean.new.cast ENV['OPENPROJECT_SKIP_DATABASE_VERSION_CHECK']
if override
warn "Skipping database version check as 'OPENPROJECT_SKIP_DATABASE_VERSION_CHECK' is set. " \
"Incompatibilites and errors may occur."
next
end
##
# Ensure database server version is compatible
override_msg = "If you're sure you want to skip the check, set 'OPENPROJECT_SKIP_DATABASE_VERSION_CHECK' to override"
begin
OpenProject::Database::check_version!
rescue OpenProject::Database::InsufficientVersionError => e
warn "#{e.message}. #{override_msg}"
Kernel.exit(1)
rescue ActiveRecord::ActiveRecordError => e
warn "Failed to perform postgres version check: #{e} - #{e.message}. #{override_msg}"
raise e
end
end
end
end
Rake::Task["db:migrate"].enhance do
Rake::Task["openproject:db:ensure_database_compatibility"].invoke
end

Loading…
Cancel
Save