commit
9706e2be11
@ -0,0 +1,7 @@ |
||||
# Used by travis to bundle this plugin with the OpenProject core. |
||||
# The tested plugin will be moved to the path `./plugins/this` |
||||
# whereas OpenProject will be checked out to `.`. |
||||
|
||||
gem 'openproject-documents', path: 'plugins/this' |
||||
|
||||
# If the plugin has any dependencies declare them here: |
@ -0,0 +1,100 @@ |
||||
OpenProject Documents Plugin |
||||
=========================== |
||||
|
||||
This plugin adds features to connect and categorize documents with your project. |
||||
|
||||
Under `Modules >> Administration >> Enumerations` you can find the section `Document categories` |
||||
where you can define several document categories that projects can use to categorize their documents. |
||||
|
||||
Documents can be enabled for every project individually. Simply activate the `Documents` module in the project settings. |
||||
|
||||
When you go to any of your projects you can see the entry `Documents` in the main menu. There you can |
||||
attach new documents to the project by following the `New document` link located in the top right corner of the page. |
||||
|
||||
The form allows you to select one of the categories you defined earlier, choose a title and define a description. |
||||
You can attach files from your local hard disk to the document entry which will make them available to anybody |
||||
who has access to the document. |
||||
|
||||
Requirements |
||||
------------ |
||||
|
||||
The OpenProject Documents plug-in requires the [OpenProject Core](https://github.com/opf/openproject/) in version greater or equal to *3.0.0*. |
||||
|
||||
|
||||
Installation |
||||
------------ |
||||
|
||||
For OpenProject Documents you need to add the following line to the `Gemfile.plugins` of OpenProject (if you use a different OpenProject version than OpenProject 5, adapt `:branch => "stable/5"` to your OpenProject version): |
||||
|
||||
`gem "openproject-documents", git: "https://github.com/opf/openproject-documents.git", :branch => "stable/5"` |
||||
|
||||
Afterwards, run: |
||||
|
||||
`bundle install` |
||||
|
||||
This plugin contains migrations. To migrate the database, run: |
||||
|
||||
`rake db:migrate` |
||||
|
||||
|
||||
Tests |
||||
----- |
||||
|
||||
Assuming you have to following directory structure: |
||||
|
||||
``` |
||||
. |
||||
├── openproject |
||||
├── openproject-documents |
||||
``` |
||||
|
||||
Replace the openproject-document ``Gemfile.plugins`` entry with the following: |
||||
|
||||
``` |
||||
gem "openproject-documents", path: "../openproject-documents" |
||||
``` |
||||
|
||||
You run the specs with the following commands: |
||||
|
||||
``` |
||||
cd openproject |
||||
rake db:test:load # this needs to be done only once |
||||
rspec ../openproject-documents |
||||
``` |
||||
|
||||
Deinstallation |
||||
-------------- |
||||
|
||||
Remove the line |
||||
|
||||
`gem "openproject-documents", git: "https://github.com/opf/openproject-documents.git", :branch => "stable/5"` |
||||
|
||||
from the file `Gemfile.plugins` and run: |
||||
|
||||
`bundle install` |
||||
|
||||
Please not that this leaves plugin data in the database. Currently, we do not support full uninstall of the plugin. |
||||
|
||||
|
||||
Bug Reporting |
||||
------------- |
||||
|
||||
If you find any bugs, you can create a bug ticket at |
||||
|
||||
https://www.openproject.org/projects/documents |
||||
|
||||
|
||||
Development |
||||
----------- |
||||
|
||||
To contribute, you can create pull request on the official repository at |
||||
`https://github.com/opf/openproject-documents` |
||||
|
||||
Licence |
||||
------- |
||||
|
||||
Copyright (C) 2009-2015 the OpenProject Foundation (OPF) |
||||
Copyright (C) 2006-2013 Jean-Philippe Lang |
||||
Copyright (C) 2010-2013 the ChiliProject Team |
||||
|
||||
This plugin is licensed under the GNU GPL v3. See doc/COPYRIGHT.md and doc/GPL.txt for details. |
@ -0,0 +1,34 @@ |
||||
/*-- copyright |
||||
* OpenProject Documents Plugin |
||||
* |
||||
* Former OpenProject Core functionality extracted into a plugin. |
||||
* |
||||
* Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
* |
||||
* 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
*/ |
||||
|
||||
dt.document:before |
||||
@include icon-mixin-notes |
||||
|
@ -0,0 +1,48 @@ |
||||
/*-- copyright |
||||
* OpenProject Documents Plugin |
||||
* |
||||
* Former OpenProject Core functionality extracted into a plugin. |
||||
* |
||||
* Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
* |
||||
* 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
*/ |
||||
|
||||
.sidebar--document-sort label:last-of-type |
||||
margin-bottom: 2rem |
||||
|
||||
.document-category--inner-section |
||||
padding-top: 20px |
||||
|
||||
.document-category-elements |
||||
display: inline |
||||
|
||||
.document-category-elements--header |
||||
margin-bottom: 0.25rem |
||||
|
||||
.document-category-elements--date |
||||
margin-bottom: 0.75rem |
||||
|
||||
.document-category-elements .wiki |
||||
margin-bottom: 2rem |
@ -0,0 +1,124 @@ |
||||
#-- encoding: UTF-8 |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
class DocumentsController < ApplicationController |
||||
default_search_scope :documents |
||||
model_object Document |
||||
before_action :find_project_by_project_id, only: [:index, :new, :create] |
||||
before_action :find_model_object, except: [:index, :new, :create] |
||||
before_action :find_project_from_association, except: [:index, :new, :create] |
||||
before_action :authorize |
||||
|
||||
def index |
||||
@sort_by = %w(category date title author).include?(params[:sort_by]) ? params[:sort_by] : 'category' |
||||
documents = @project.documents |
||||
case @sort_by |
||||
when 'date' |
||||
@grouped = documents.group_by {|d| d.updated_on.to_date } |
||||
when 'title' |
||||
@grouped = documents.group_by {|d| d.title.first.upcase} |
||||
when 'author' |
||||
@grouped = documents.with_attachments.group_by {|d| d.attachments.last.author} |
||||
else |
||||
@grouped = documents.includes(:category).group_by(&:category) |
||||
end |
||||
render layout: false if request.xhr? |
||||
end |
||||
|
||||
def show |
||||
@attachments = @document.attachments.order('created_at DESC') |
||||
end |
||||
|
||||
def new |
||||
@document = @project.documents.build |
||||
@document.attributes = document_params |
||||
end |
||||
|
||||
def create |
||||
@document = @project.documents.build |
||||
@document.attributes = document_params |
||||
@document.attach_files(permitted_params.attachments.to_h) |
||||
|
||||
if @document.save |
||||
render_attachment_warning_if_needed(@document) |
||||
flash[:notice] = l(:notice_successful_create) |
||||
redirect_to project_documents_path(@project) |
||||
else |
||||
render action: 'new' |
||||
end |
||||
end |
||||
|
||||
def edit |
||||
@categories = DocumentCategory.all |
||||
end |
||||
|
||||
def update |
||||
@document.attributes = document_params |
||||
@document.attach_files(permitted_params.attachments.to_h) |
||||
|
||||
if @document.save |
||||
render_attachment_warning_if_needed(@document) |
||||
flash[:notice] = l(:notice_successful_update) |
||||
redirect_to action: 'show', id: @document |
||||
else |
||||
render action: 'edit' |
||||
end |
||||
end |
||||
|
||||
def destroy |
||||
@document.destroy |
||||
redirect_to controller: '/documents', action: 'index', project_id: @project |
||||
end |
||||
|
||||
def add_attachment |
||||
@document.attach_files(permitted_params.attachments.to_h) |
||||
attachments = @document.attachments.select(&:new_record?) |
||||
|
||||
@document.save |
||||
render_attachment_warning_if_needed(@document) |
||||
|
||||
saved_attachments = attachments.select(&:persisted?) |
||||
if saved_attachments.present? && Setting.notified_events.include?('document_added') |
||||
users = saved_attachments.first.container.recipients |
||||
users.each do |user| |
||||
UserMailer.attachments_added(user, saved_attachments).deliver |
||||
end |
||||
end |
||||
redirect_to action: 'show', id: @document |
||||
end |
||||
|
||||
private |
||||
|
||||
def document_params |
||||
params.fetch(:document, {}).permit('category_id', 'title', 'description') |
||||
end |
||||
end |
@ -0,0 +1,55 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
class DocumentsMailer < UserMailer |
||||
|
||||
def document_added(user, document) |
||||
@document = document |
||||
|
||||
open_project_headers 'Project' => @document.project.identifier, |
||||
'Type' => 'Document' |
||||
|
||||
with_locale_for(user) do |
||||
subject = "[#{@document.project.name}] #{t(:label_document_new)}: #{@document.title}" |
||||
mail to: user.mail, subject: subject |
||||
end |
||||
end |
||||
|
||||
def attachments_added(user, attachments) |
||||
container = attachments.first.container |
||||
|
||||
@added_to = "#{Document.model_name.human}: #{container.title}" |
||||
@added_to_url = url_for(controller: '/documents', action: 'show', id: container.id) |
||||
|
||||
super |
||||
end |
||||
|
||||
end |
@ -0,0 +1,64 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
class Activity::DocumentActivityProvider < Activity::BaseActivityProvider |
||||
acts_as_activity_provider type: 'documents', |
||||
permission: :view_documents |
||||
|
||||
def event_query_projection(activity) |
||||
[ |
||||
activity_journal_projection_statement(:title, 'document_title', activity), |
||||
activity_journal_projection_statement(:project_id, 'project_id', activity) |
||||
] |
||||
end |
||||
|
||||
def event_title(event, _activity) |
||||
"#{Document.model_name.human}: #{event['document_title']}" |
||||
end |
||||
|
||||
def event_type(_event, _activity) |
||||
'document' |
||||
end |
||||
|
||||
def event_path(event, _activity) |
||||
url_helpers.document_url(url_helper_parameter(event)) |
||||
end |
||||
|
||||
def event_url(event, _activity) |
||||
url_helpers.document_url(url_helper_parameter(event)) |
||||
end |
||||
|
||||
private |
||||
|
||||
def url_helper_parameter(event) |
||||
event['journable_id'] |
||||
end |
||||
end |
@ -0,0 +1,97 @@ |
||||
#-- encoding: UTF-8 |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
class Document < ActiveRecord::Base |
||||
belongs_to :project |
||||
belongs_to :category, class_name: "DocumentCategory", foreign_key: "category_id" |
||||
acts_as_attachable delete_permission: :manage_documents, |
||||
add_permission: :manage_documents |
||||
|
||||
acts_as_journalized |
||||
acts_as_event title: Proc.new { |o| "#{Document.model_name.human}: #{o.title}" }, |
||||
url: Proc.new { |o| { controller: '/documents', action: 'show', id: o.id } }, |
||||
datetime: :created_on, |
||||
author: ( Proc.new do |o| |
||||
o.attachments.find(:first, order: "#{Attachment.table_name}.created_at ASC").try(:author) |
||||
end) |
||||
|
||||
acts_as_searchable columns: ['title', "#{table_name}.description"], |
||||
include: :project, |
||||
references: :projects |
||||
|
||||
validates_presence_of :project, :title, :category |
||||
validates_length_of :title, maximum: 60 |
||||
|
||||
scope :visible, lambda { |
||||
includes(:project) |
||||
.references(:projects) |
||||
.merge(Project.allowed_to(User.current, :view_documents)) |
||||
} |
||||
|
||||
scope :with_attachments, lambda { |
||||
includes(:attachments) |
||||
.where('attachments.container_id is not NULL') |
||||
.references(:attachments) |
||||
} |
||||
|
||||
after_initialize :set_default_category |
||||
after_create :notify_document_created |
||||
|
||||
def visible?(user=User.current) |
||||
!user.nil? && user.allowed_to?(:view_documents, project) |
||||
end |
||||
|
||||
def set_default_category |
||||
self.category ||= DocumentCategory.default if new_record? |
||||
end |
||||
|
||||
def updated_on |
||||
unless @updated_on |
||||
# attachments has a default order that conflicts with `created_on DESC` |
||||
# #reorder removes that default order but rather than #unscoped keeps the |
||||
# scoping by this document |
||||
a = attachments.reorder('created_at DESC').first |
||||
@updated_on = (a && a.created_at) || created_on |
||||
end |
||||
@updated_on |
||||
end |
||||
|
||||
private |
||||
|
||||
def notify_document_created |
||||
return unless Setting.notified_events.include?('document_added') |
||||
|
||||
recipients.each do |user| |
||||
DocumentsMailer.document_added(user, self).deliver_now |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,49 @@ |
||||
#-- encoding: UTF-8 |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
class DocumentCategory < Enumeration |
||||
has_many :documents, foreign_key: 'category_id' |
||||
|
||||
OptionName = :enumeration_doc_categories |
||||
|
||||
def option_name |
||||
OptionName |
||||
end |
||||
|
||||
def objects_count |
||||
documents.count |
||||
end |
||||
|
||||
def transfer_relations(to) |
||||
documents.update_all("category_id = #{to.id}") |
||||
end |
||||
end |
@ -0,0 +1,37 @@ |
||||
#-- encoding: UTF-8 |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
class DocumentCategoryCustomField < CustomField |
||||
def type_name |
||||
:enumeration_doc_categories |
||||
end |
||||
end |
@ -0,0 +1,35 @@ |
||||
#-- encoding: UTF-8 |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
class Journal::DocumentJournal < Journal::BaseJournal |
||||
self.table_name = "document_journals" |
||||
end |
@ -0,0 +1,50 @@ |
||||
#-- encoding: UTF-8 |
||||
#-- copyright |
||||
# OpenProject is a project management system. |
||||
# Copyright (C) 2012-2015 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
module BasicData |
||||
module Documents |
||||
class EnumerationsSeeder < Seeder |
||||
def seed_data! |
||||
category_names.each do |name| |
||||
DocumentCategory.create name: name |
||||
end |
||||
end |
||||
|
||||
def category_names |
||||
category_i18n_keys.map { |key| I18n.t key } |
||||
end |
||||
|
||||
def category_i18n_keys |
||||
['documentation', 'specification', 'other'].map do |name| |
||||
['enumeration', 'document_category', name].join('.') |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,24 @@ |
||||
module BasicData |
||||
module Documents |
||||
module RoleSeeder |
||||
def member |
||||
super.tap do |member| |
||||
member[:permissions].concat %i( |
||||
view_documents |
||||
manage_documents |
||||
) |
||||
end |
||||
end |
||||
|
||||
def reader |
||||
super.tap do |reader| |
||||
reader[:permissions].concat %i( |
||||
view_documents |
||||
) |
||||
end |
||||
end |
||||
end |
||||
|
||||
BasicData::RoleSeeder.prepend BasicData::Documents::RoleSeeder |
||||
end |
||||
end |
@ -0,0 +1,38 @@ |
||||
<%#-- copyright |
||||
OpenProject Documents Plugin |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
|
||||
++#%> |
||||
|
||||
<h4 class="document-category-elements--header"><%= link_to h(document.title), :controller => '/documents', :action => 'show', :id => document %></h4> |
||||
<p class="document-category-elements--date"><em><%= format_time(document.updated_on) %></em></p> |
||||
|
||||
<div class="wiki"> |
||||
<%= format_text(truncate_lines(document.description)) %> |
||||
</div> |
@ -0,0 +1,53 @@ |
||||
<%#-- copyright |
||||
OpenProject Documents Plugin |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
|
||||
++#%> |
||||
|
||||
<%= error_messages_for 'document' %> |
||||
<% resource = ::API::V3::Documents::DocumentRepresenter.new(f.object, |
||||
current_user: current_user, |
||||
embed_links: true) %> |
||||
|
||||
<div class="form--field"> |
||||
<%= f.select :category_id, |
||||
DocumentCategory.all.map { |c| [c.name, c.id] }, |
||||
required: true, |
||||
container_class: '-slim' %> |
||||
</div> |
||||
<div class="form--field"> |
||||
<%= f.text_field :title, required: true, container_class: '-wide' %> |
||||
</div> |
||||
<div class="form--field"> |
||||
<%= f.text_area :description, |
||||
container_class: '-xxwide', |
||||
with_text_formatting: true, |
||||
resource: resource, |
||||
preview_context: preview_context(f.object.project) %> |
||||
</div> |
@ -0,0 +1,38 @@ |
||||
<%#-- copyright |
||||
OpenProject Documents Plugin |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
|
||||
++#%> |
||||
|
||||
<%= toolbar title: Document.model_name.human %> |
||||
|
||||
<%= labelled_tabular_form_for @document, url: document_path(@document), method: 'PATCH' do |f| -%> |
||||
<%= render partial: "documents/form", locals: { f: f } %> |
||||
<%= styled_button_tag l(:button_save), class: "-highlight -with-icon icon-checkmark" %> |
||||
<% end %> |
@ -0,0 +1,98 @@ |
||||
<%#-- copyright |
||||
OpenProject Documents Plugin |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
|
||||
++#%> |
||||
|
||||
<%= stylesheet_link_tag 'documents/documents.css' %> |
||||
|
||||
<%= toolbar title: l(:label_document_plural) do %> |
||||
<% if authorize_for(:documents, :new) %> |
||||
<li class="toolbar-item"> |
||||
<%= link_to({:controller => '/documents', :action => 'new', :project_id => @project}, |
||||
{ class: 'button -alt-highlight', |
||||
aria: {label: t(:label_document_new)}, |
||||
title: t(:label_document_new)}) do %> |
||||
<%= op_icon('button--icon icon-add') %> |
||||
<span class="button--text"><%= t('activerecord.models.document') %></span> |
||||
<% end %> |
||||
</li> |
||||
<% end %> |
||||
<% end %> |
||||
|
||||
<% if @grouped.empty? %> |
||||
<%= no_results_box %> |
||||
<% end %> |
||||
|
||||
<% @grouped.keys.sort.each do |group| %> |
||||
<collapsible-section initially-expanded="true" |
||||
section-title="<%= group %>"> |
||||
<div class="document-category--inner-section"> |
||||
<div class="form--field document-category-elements"> |
||||
<%= render :partial => 'documents/document', :collection => @grouped[group] %> |
||||
</div> |
||||
</div> |
||||
</collapsible-section> |
||||
<% end %> |
||||
|
||||
<% content_for :sidebar do %> |
||||
<%= form_tag({}, :method => :get, class: 'sidebar--document-sort') do %> |
||||
<fieldset class="form--fieldset"> |
||||
<legend class="form--fieldset-legend"><%= l(:label_sort_by, '') %></legend> |
||||
<p> |
||||
<%= radio_button_tag 'sort_by', 'category', (@sort_by == 'category'), class: 'submit-this-form' %> |
||||
<label for="sort_by_category"> |
||||
<%= Document.human_attribute_name(:category) %> |
||||
</label><br /> |
||||
<%= radio_button_tag 'sort_by', 'date', (@sort_by == 'date'), class: 'submit-this-form' %> |
||||
<label for="sort_by_date"> |
||||
<%= l(:label_date) %> |
||||
</label><br /> |
||||
<%= radio_button_tag 'sort_by', 'title', (@sort_by == 'title'), class: 'submit-this-form' %> |
||||
<label for="sort_by_title"> |
||||
<%= Document.human_attribute_name(:title) %> |
||||
</label><br /> |
||||
<%= radio_button_tag 'sort_by', 'author', (@sort_by == 'author'), class: 'submit-this-form' %> |
||||
<label for="sort_by_author"> |
||||
<%= Document.human_attribute_name(:author) %> |
||||
</label> |
||||
</p> |
||||
</fieldset> |
||||
<% end %> |
||||
<% end %> |
||||
|
||||
<%= nonced_javascript_tag do %> |
||||
jQuery(function($) { |
||||
$('.submit-this-form').click(function() { |
||||
$(this).closest('form').submit(); |
||||
}); |
||||
}); |
||||
<% end %> |
||||
|
||||
<% html_title(l(:label_document_plural)) -%> |
@ -0,0 +1,39 @@ |
||||
<%#-- copyright |
||||
OpenProject Documents Plugin |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
|
||||
++#%> |
||||
<%= toolbar title: l(:label_document_new) %> |
||||
|
||||
<%= labelled_tabular_form_for @document, url: project_documents_path(@project), html: { multipart: true } do |f| -%> |
||||
<%= render :partial => 'documents/form', locals: { f: f } %> |
||||
<%= styled_button_tag l(:button_create), class: "-highlight -with-icon icon-checkmark" %> |
||||
<% end %> |
||||
|
||||
|
@ -0,0 +1,60 @@ |
||||
<%#-- copyright |
||||
OpenProject Documents Plugin |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
|
||||
++#%> |
||||
|
||||
<% html_title h(@document.title) -%> |
||||
<%= toolbar title: @document.title, |
||||
subtitle: "#{@document.category.name} - #{format_date @document.created_on}" do %> |
||||
<% if authorize_for(:documents, :edit) %> |
||||
<li class="toolbar-item"> |
||||
<%= link_to({controller: '/documents', action: 'edit', id: @document}, class: 'button', accesskey: accesskey(:edit)) do %> |
||||
<%= op_icon('button--icon icon-edit') %> <%= l(:button_edit) %> |
||||
<% end %> |
||||
</li> |
||||
<% end %> |
||||
<% if authorize_for(:documents, :destroy) %> |
||||
<li class="toolbar-item"> |
||||
<%= link_to({controller: '/documents', action: 'destroy', id: @document}, class: 'button', data: { confirm: l(:text_are_you_sure) }, method: :delete) do %> |
||||
<%= op_icon('button--icon icon-delete') %> <%= l(:button_delete) %> |
||||
<% end %> |
||||
</li> |
||||
<% end %> |
||||
<% end %> |
||||
|
||||
<div class="wiki"> |
||||
<%= format_text @document.description, attachments: @document.attachments %> |
||||
</div> |
||||
|
||||
<% resource = ::API::V3::Documents::DocumentRepresenter.new(@document, |
||||
current_user: current_user, |
||||
embed_links: true) %> |
||||
<%= list_attachments(resource) %> |
||||
|
@ -0,0 +1,35 @@ |
||||
<%#-- copyright |
||||
OpenProject Documents Plugin |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
|
||||
++#%> |
||||
|
||||
<p><%= link_to(@document.title, project_documents_url(@document)) %> (<%= @document.category.name %>)</p> |
||||
|
||||
<%= format_text @document.description %> |
@ -0,0 +1,36 @@ |
||||
<%#-- copyright |
||||
OpenProject Documents Plugin |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
|
||||
++#%> |
||||
|
||||
<%= @document.title %> (<%= @document.category.name %>) |
||||
<%= project_documents_url(@document) %> |
||||
|
||||
<%= @document.description %> |
@ -0,0 +1,296 @@ |
||||
<%#-- copyright |
||||
OpenProject Documents Plugin |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
|
||||
++#%> |
||||
|
||||
<% content_for :styles do %> |
||||
body { font:80% Verdana,Tahoma,Arial,sans-serif; } |
||||
h1, h2, h3, h4 { font-family: Trebuchet MS,Georgia,"Times New Roman",serif; } |
||||
pre, code { font-size:120%; } |
||||
pre code { font-size:100%; } |
||||
pre { |
||||
margin: 1em 1em 1em 1.6em; |
||||
padding: 2px; |
||||
background-color: #fafafa; |
||||
border: 1px solid #dadada; |
||||
width:95%; |
||||
overflow-x: auto; |
||||
} |
||||
a.new { color: #b73535; } |
||||
|
||||
.CodeRay .c { color:#666; } |
||||
|
||||
.CodeRay .cl { color:#B06; font-weight:bold } |
||||
.CodeRay .dl { color:black } |
||||
.CodeRay .fu { color:#06B; font-weight:bold } |
||||
|
||||
.CodeRay .il { background: #eee } |
||||
.CodeRay .il .idl { font-weight: bold; color: #888 } |
||||
|
||||
.CodeRay .iv { color:#33B } |
||||
.CodeRay .r { color:#080; font-weight:bold } |
||||
|
||||
.CodeRay .s { background-color:#fff0f0 } |
||||
.CodeRay .s .dl { color:#710 } |
||||
<% end %> |
||||
|
||||
<% html_title "Wiki Formatting" %> |
||||
<h1><a name="1" class="wiki-page"></a>Wiki Formatting</h1> |
||||
|
||||
<h2><a name="2" class="wiki-page"></a>Links</h2> |
||||
|
||||
<h3><a name="3" class="wiki-page"></a>OpenProject links</h3> |
||||
|
||||
<p>OpenProject allows hyperlinking between issues, changesets and wiki pages from anywhere wiki formatting is used.</p> |
||||
<ul> |
||||
<li><strong>#124</strong> displays a link to an issue: <del><a href="#" class="issue" title="bulk edit doesn't change the category or fixed version properties (Closed)">#124</a></del> (link is striked-through if the issue is closed)</li> |
||||
<li><strong>##124</strong> displays a link to an issue with context information: <a href="/issues/12" class="issue status-1 priority-2 overdue created-by-me" title="Issue subject (New)">#12 New: Issue subject</a> 2012-05-14 - 2012-05-23 (User Name - assigned to)</li> |
||||
<li><strong>###124</strong> displays a link to an issue with context information and an excerpt (first 3 lines) of the description</li> |
||||
<li><strong>r758</strong> displays a link to a changeset: <a href="#" class="changeset" title="Search engine now only searches objects the user is allowed to view.">r758</a></li> |
||||
<li><strong>commit:c6f4d0fd</strong> displays a link to a changeset with a non-numeric hash: <a href="#" class="changeset">c6f4d0fd</a></li> |
||||
<li><strong>sandbox:r758</strong> displays a link to a changeset of another project: <a href="#" class="changeset" title="Search engine now only searches objects the user is allowed to view.">sandbox:r758</a></li> |
||||
<li><strong>sandbox:c6f4d0fd</strong> displays a link to a changeset with a non-numeric hash: <a href="#" class="changeset">sandbox:c6f4d0fd</a></li> |
||||
</ul> |
||||
|
||||
<p>Wiki links:</p> |
||||
|
||||
<ul> |
||||
<li><strong>[[Guide]]</strong> displays a link to the page named 'Guide': <a href="#" class="wiki-page">Guide</a></li> |
||||
<li><strong>[[Guide#further-reading]]</strong> takes you to the anchor "further-reading". Headings get automatically assigned anchors so that you can refer to them: <a href="#" class="wiki-page">Guide</a></li> |
||||
<li><strong>[[Guide|User manual]]</strong> displays a link to the same page but with a different text: <a href="#" class="wiki-page">User manual</a></li> |
||||
</ul> |
||||
|
||||
<p>You can also link to pages of an other project wiki:</p> |
||||
|
||||
<ul> |
||||
<li><strong>[[sandbox:some page]]</strong> displays a link to the page named 'Some page' of the Sandbox wiki</li> |
||||
<li><strong>[[sandbox:]]</strong> displays a link to the Sandbox wiki main page</li> |
||||
</ul> |
||||
|
||||
<p>Wiki links are displayed in red if the page doesn't exist yet, eg: <a href="#" class="wiki-page new">Nonexistent page</a>.</p> |
||||
|
||||
<p>Links to other resources:</p> |
||||
|
||||
<ul> |
||||
<li>Documents: |
||||
<ul> |
||||
<li><strong>document#17</strong> (link to document with id 17)</li> |
||||
<li><strong>document:Greetings</strong> (link to the document with title "Greetings")</li> |
||||
<li><strong>document:"Some document"</strong> (double quotes can be used when document title contains spaces)</li> |
||||
<li><strong>sandbox:document:"Some document"</strong> (link to a document with title "Some document" in other project "sandbox")</li> |
||||
</ul></li> |
||||
</ul> |
||||
|
||||
<ul> |
||||
<li>Versions: |
||||
<ul> |
||||
<li><strong>version#3</strong> (link to version with id 3)</li> |
||||
<li><strong>version:1.0.0</strong> (link to version named "1.0.0")</li> |
||||
<li><strong>version:"1.0 beta 2"</strong></li> |
||||
<li><strong>sandbox:version:1.0.0</strong> (link to version "1.0.0" in the project "sandbox")</li> |
||||
</ul></li> |
||||
</ul> |
||||
|
||||
<ul> |
||||
<li>Attachments: |
||||
<ul> |
||||
<li><strong>attachment:file.zip</strong> (link to the attachment of the current object named file.zip)</li> |
||||
<li>For now, attachments of the current object can be referenced only (if you're on an issue, it's possible to reference attachments of this issue only)</li> |
||||
</ul></li> |
||||
</ul> |
||||
|
||||
<ul> |
||||
<li>Repository files: |
||||
<ul> |
||||
<li><strong>source:some/file</strong> (link to the file located at /some/file in the project's repository)</li> |
||||
<li><strong>source:some/file@52</strong> (link to the file's revision 52)</li> |
||||
<li><strong>source:some/file#L120</strong> (link to line 120 of the file)</li> |
||||
<li><strong>source:some/file@52#L120</strong> (link to line 120 of the file's revision 52)</li> |
||||
<li><strong>source:"some file@52#L120"</strong> (use double quotes when the URL contains spaces</li> |
||||
<li><strong>export:some/file</strong> (force the download of the file)</li> |
||||
<li><strong>sandbox:source:some/file</strong> (link to the file located at /some/file in the repository of the project "sandbox")</li> |
||||
<li><strong>sandbox:export:some/file</strong> (force the download of the file)</li> |
||||
</ul></li> |
||||
</ul> |
||||
|
||||
<ul> |
||||
<li>Forum messages: |
||||
<ul> |
||||
<li><strong>message#1218</strong> (link to message with id 1218)</li> |
||||
</ul></li> |
||||
</ul> |
||||
|
||||
<ul> |
||||
<li>Projects: |
||||
<ul> |
||||
<li><strong>project#3</strong> (link to project with id 3)</li> |
||||
<li><strong>project:someproject</strong> (link to project named "someproject")</li> |
||||
</ul></li> |
||||
</ul> |
||||
|
||||
|
||||
<p>Escaping:</p> |
||||
|
||||
<ul> |
||||
<li>You can prevent OpenProject links from being parsed by preceding them with an exclamation mark: !</li> |
||||
</ul> |
||||
|
||||
|
||||
<h3><a name="4" class="wiki-page"></a>External links</h3> |
||||
|
||||
<p>HTTP URLs and email addresses are automatically turned into clickable links:</p> |
||||
|
||||
<pre> |
||||
https://www.openproject.org, someone@foo.bar |
||||
</pre> |
||||
|
||||
<p>displays: <a class="external" href="https://www.openproject.org">https://www.openproject.org</a>, <a href="mailto:someone@foo.bar" class="email">someone@foo.bar</a></p> |
||||
|
||||
<p>If you want to display a specific text instead of the URL, you can use the standard textile syntax:</p> |
||||
|
||||
<pre> |
||||
"OpenProject web site":https://www.openproject.org |
||||
</pre> |
||||
|
||||
<p>displays: <a href="https://www.openproject.org" class="external">OpenProject web site</a></p> |
||||
|
||||
|
||||
<h2><a name="5" class="wiki-page"></a>Text formatting</h2> |
||||
|
||||
|
||||
<p>For things such as headlines, bold, tables, lists, OpenProject supports Textile syntax. See <a class="external" href="http://www.textism.com/tools/textile/">http://www.textism.com/tools/textile/</a> for information on using any of these features. A few samples are included below, but the engine is capable of much more of that.</p> |
||||
|
||||
<h3><a name="6" class="wiki-page"></a>Font style</h3> |
||||
|
||||
<pre> |
||||
* *bold* |
||||
* _italic_ |
||||
* _*bold italic*_ |
||||
* +underline+ |
||||
* -strike-through- |
||||
</pre> |
||||
|
||||
<p>Display:</p> |
||||
|
||||
<ul> |
||||
<li><strong>bold</strong></li> |
||||
<li><em>italic</em></li> |
||||
<li><em>*bold italic*</em></li> |
||||
<li><ins>underline</ins></li> |
||||
<li><del>strike-through</del></li> |
||||
</ul> |
||||
|
||||
<h3><a name="7" class="wiki-page"></a>Inline images</h3> |
||||
|
||||
<ul> |
||||
<li><strong>!image_url!</strong> displays an image located at image_url (textile syntax)</li> |
||||
<li><strong>!>image_url!</strong> right floating image</li> |
||||
<li>If you have an image attached to your wiki page, it can be displayed inline using its filename: <strong>!attached_image.png!</strong></li> |
||||
</ul> |
||||
|
||||
<h3><a name="8" class="wiki-page"></a>Headings</h3> |
||||
|
||||
<pre> |
||||
h1. Heading |
||||
h2. Subheading |
||||
h3. Subsubheading |
||||
</pre> |
||||
|
||||
<p>OpenProject assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.</p> |
||||
|
||||
|
||||
<h3><a name="9" class="wiki-page"></a>Paragraphs</h3> |
||||
|
||||
<pre> |
||||
p>. right aligned |
||||
p=. centered |
||||
</pre> |
||||
|
||||
<p style="text-align:center;">This is a centered paragraph.</p> |
||||
|
||||
|
||||
<h3><a name="10" class="wiki-page"></a>Blockquotes</h3> |
||||
|
||||
<p>Start the paragraph with <strong>bq.</strong></p> |
||||
|
||||
<pre> |
||||
bq. Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern. |
||||
To go live, all you need to add is a database and a web server. |
||||
</pre> |
||||
|
||||
<p>Display:</p> |
||||
|
||||
<blockquote> |
||||
<p>Rails is a full-stack framework for developing database-backed web applications according to the Model-View-Control pattern.<br />To go live, all you need to add is a database and a web server.</p> |
||||
</blockquote> |
||||
|
||||
|
||||
<h3><a name="11" class="wiki-page"></a>Table of content</h3> |
||||
|
||||
<pre> |
||||
{{toc}} => left aligned toc |
||||
{{>toc}} => right aligned toc |
||||
</pre> |
||||
|
||||
<h2><a name="12" class="wiki-page"></a>Macros</h2> |
||||
|
||||
<p>OpenProject has the following builtin macros:</p> |
||||
|
||||
<p><dl><dt><code>hello_world</code></dt><dd><p>Sample macro.</p></dd><dt><code>include</code></dt><dd><p>Include a wiki page. Example:</p> |
||||
|
||||
<pre><code>{{include(Foo)}}</code></pre></dd><dt><code>macro_list</code></dt><dd><p>Displays a list of all available macros, including description if available.</p></dd></dl></p> |
||||
|
||||
|
||||
<h2><a name="13" class="wiki-page"></a>Code highlighting</h2> |
||||
|
||||
<p>Code highlightment relies on <a href="http://coderay.rubychan.de/" class="external">CodeRay</a>, a fast syntax highlighting library written completely in Ruby. It currently supports c, cpp, css, delphi, groovy, html, java, javascript, json, php, python, rhtml, ruby, scheme, sql, xml and yaml languages.</p> |
||||
|
||||
<p>You can highlight code in your wiki page using this syntax:</p> |
||||
|
||||
<pre> |
||||
<pre><code class="ruby"> |
||||
Place you code here. |
||||
</code></pre> |
||||
</pre> |
||||
|
||||
<p>Example:</p> |
||||
|
||||
<pre><code class="ruby CodeRay"><span class="no"> 1</span> <span class="c"># The Greeter class</span> |
||||
<span class="no"> 2</span> <span class="r">class</span> <span class="cl">Greeter</span> |
||||
<span class="no"> 3</span> <span class="r">def</span> <span class="fu">initialize</span>(name) |
||||
<span class="no"> 4</span> <span class="iv">@name</span> = name.capitalize |
||||
<span class="no"> 5</span> <span class="r">end</span> |
||||
<span class="no"> 6</span> |
||||
<span class="no"> 7</span> <span class="r">def</span> <span class="fu">salute</span> |
||||
<span class="no"> 8</span> puts <span class="s"><span class="dl">"</span><span class="k">Hello </span><span class="il"><span class="idl">#{</span><span class="iv">@name</span><span class="idl">}</span></span><span class="k">!</span><span class="dl">"</span></span> |
||||
<span class="no"> 9</span> <span class="r">end</span> |
||||
<span class="no"><strong>10</strong></span> <span class="r">end</span> |
||||
</code> |
||||
</pre> |
@ -0,0 +1,33 @@ |
||||
<%#-- copyright |
||||
OpenProject Documents Plugin |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
|
||||
++#%> |
||||
|
||||
<%= stylesheet_link_tag 'documents/documents.css' %> |
@ -0,0 +1,48 @@ |
||||
<%#-- copyright |
||||
OpenProject Documents Plugin |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
|
||||
++#%> |
||||
|
||||
<% if defined? block_name %> |
||||
<%= content_for "#{block_name}-remove-block" %> |
||||
<% end %> |
||||
|
||||
<h3 class="widget-box--header"> |
||||
<%= op_icon('icon-context icon-notes') %> |
||||
<span class="widget-box--header-title"><%=l(:label_document_plural)%></span> |
||||
</h3> |
||||
|
||||
<% project_ids = @user.projects.select {|p| @user.allowed_to?(:view_documents, p)}.collect(&:id) %> |
||||
<%= render(partial: 'documents/document', |
||||
collection: Document |
||||
.limit(10) |
||||
.order("#{Document.table_name}.created_on DESC") |
||||
.where("#{Document.table_name}.project_id in (#{project_ids.join(',')})") |
||||
.includes(:project)) unless project_ids.empty? %> |
@ -0,0 +1,46 @@ |
||||
<%#-- copyright |
||||
OpenProject Documents Plugin |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
|
||||
++#%> |
||||
|
||||
<% if defined? block_name_id %> |
||||
<%= content_for block_name_id %> |
||||
<% end %> |
||||
|
||||
<h3 class="widget-box--header"> |
||||
<%= op_icon('icon-context icon-notes') %> |
||||
<span class="widget-box--header-title"><%=l(:label_document_plural)%></span> |
||||
</h3> |
||||
|
||||
|
||||
<% if current_user.allowed_to?(:view_documents, @project)%> |
||||
<%= render(:partial => 'documents/document', |
||||
:collection => Document.where(project_id: @project.id).limit(10).order("created_on DESC")) %> |
||||
<% end %> |
@ -0,0 +1,19 @@ |
||||
ar: |
||||
activerecord: |
||||
models: |
||||
document: "الوثيقة" |
||||
default_doc_category_tech: "التوثيق التقني" |
||||
default_doc_category_user: "توثيق المستخدم" |
||||
enumeration_doc_categories: "فئات الوثائق" |
||||
enumeration: |
||||
document_category: |
||||
documentation: التوثيق |
||||
specification: المواصفة |
||||
other: أخرى |
||||
label_document_added: "تم إضافة وثيقة" |
||||
label_document_new: "وثيقة جديدة" |
||||
label_document_plural: "الوثائق" |
||||
label_documents: "الوثائق" |
||||
permission_manage_documents: "إدارة الوثائق" |
||||
permission_view_documents: "عرض الوثائق" |
||||
project_module_documents: "الوثائق" |
@ -0,0 +1,19 @@ |
||||
bg: |
||||
activerecord: |
||||
models: |
||||
document: "Документ" |
||||
default_doc_category_tech: "Техническа документация" |
||||
default_doc_category_user: "Документация за потребителя" |
||||
enumeration_doc_categories: "Document categories" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Documentation |
||||
specification: Specification |
||||
other: Other |
||||
label_document_added: "Документът е добавен" |
||||
label_document_new: "Нов документ" |
||||
label_document_plural: "Документи" |
||||
label_documents: "Документи" |
||||
permission_manage_documents: "Управление на документите" |
||||
permission_view_documents: "Преглед на документите" |
||||
project_module_documents: "Документи" |
@ -0,0 +1,19 @@ |
||||
da: |
||||
activerecord: |
||||
models: |
||||
document: "Dokument" |
||||
default_doc_category_tech: "Teknisk dokumentation" |
||||
default_doc_category_user: "Brugerdokumentation" |
||||
enumeration_doc_categories: "Dokumentkategorier" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Documentation |
||||
specification: Specification |
||||
other: Other |
||||
label_document_added: "Dokument tilføjet" |
||||
label_document_new: "Nyt dokument" |
||||
label_document_plural: "Dokumenter" |
||||
label_documents: "Dokumenter" |
||||
permission_manage_documents: "Håndter dokumenter" |
||||
permission_view_documents: "Se dokumenter" |
||||
project_module_documents: "Dokumenter" |
@ -0,0 +1,19 @@ |
||||
de: |
||||
activerecord: |
||||
models: |
||||
document: "Dokument" |
||||
default_doc_category_tech: "Technische Dokumentation" |
||||
default_doc_category_user: "Benutzerdokumentation" |
||||
enumeration_doc_categories: "Dokumentenkategorien" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Dokumentation |
||||
specification: Spezifikation |
||||
other: Andere |
||||
label_document_added: "Dokument hinzugefügt" |
||||
label_document_new: "Neues Dokument" |
||||
label_document_plural: "Dokumente" |
||||
label_documents: "Dokumente" |
||||
permission_manage_documents: "Dokumente verwalten" |
||||
permission_view_documents: "Dokumente ansehen" |
||||
project_module_documents: "Dokumente" |
@ -0,0 +1,19 @@ |
||||
es: |
||||
activerecord: |
||||
models: |
||||
document: "Documento" |
||||
default_doc_category_tech: "Documentación técnica" |
||||
default_doc_category_user: "Documentacion para el usuario" |
||||
enumeration_doc_categories: "Categorías de documentos" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Documentación |
||||
specification: Especificación |
||||
other: Otros |
||||
label_document_added: "Documento agregado" |
||||
label_document_new: "Nuevo documento" |
||||
label_document_plural: "Documentos" |
||||
label_documents: "Documentos" |
||||
permission_manage_documents: "Administrar documentos" |
||||
permission_view_documents: "Ver documentos" |
||||
project_module_documents: "Documentos" |
@ -0,0 +1,19 @@ |
||||
et: |
||||
activerecord: |
||||
models: |
||||
document: "Dokument" |
||||
default_doc_category_tech: "Tehniline dokumentatsioon" |
||||
default_doc_category_user: "Kasutaja dokumentatsioon" |
||||
enumeration_doc_categories: "Dokumentide kategooriad" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Documentation |
||||
specification: Specification |
||||
other: Other |
||||
label_document_added: "Dokument on lisatud" |
||||
label_document_new: "Uus dokument" |
||||
label_document_plural: "Dokumendid" |
||||
label_documents: "Dokumendid" |
||||
permission_manage_documents: "Dokumentide haldamine" |
||||
permission_view_documents: "Dokumentide vaatamine" |
||||
project_module_documents: "Dokumendid" |
@ -0,0 +1,19 @@ |
||||
fi: |
||||
activerecord: |
||||
models: |
||||
document: "Asiakirja" |
||||
default_doc_category_tech: "Tekniset asiakirjat" |
||||
default_doc_category_user: "Käyttöohjeet" |
||||
enumeration_doc_categories: "Tiedostoluokat" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Käyttöohjeet |
||||
specification: Määrittely |
||||
other: Muut |
||||
label_document_added: "Asiakirja lisätty" |
||||
label_document_new: "Uusi asiakirja" |
||||
label_document_plural: "Asiakirjat" |
||||
label_documents: "Asiakirjat" |
||||
permission_manage_documents: "Hallitse asiakirjoja" |
||||
permission_view_documents: "Näytä asiakirjat" |
||||
project_module_documents: "Asiakirjat" |
@ -0,0 +1,19 @@ |
||||
fil: |
||||
activerecord: |
||||
models: |
||||
document: "Dokumento" |
||||
default_doc_category_tech: "Teknikal na dokumentasyon" |
||||
default_doc_category_user: "Dokumento para sa mga gagamit" |
||||
enumeration_doc_categories: "Mga kategorya ng dokumento" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Dokumentasyon |
||||
specification: Mga Detalye |
||||
other: Iba pa |
||||
label_document_added: "Idinagdag ang dokumento" |
||||
label_document_new: "Bagong dokumento" |
||||
label_document_plural: "Mga dokumento" |
||||
label_documents: "Mga dokumento" |
||||
permission_manage_documents: "Pamahalaan ang mga dokumento" |
||||
permission_view_documents: "Tingnan ang dokumento" |
||||
project_module_documents: "Mga dokumento" |
@ -0,0 +1,19 @@ |
||||
fr: |
||||
activerecord: |
||||
models: |
||||
document: "Document" |
||||
default_doc_category_tech: "Documentation technique" |
||||
default_doc_category_user: "Documentation utilisateur" |
||||
enumeration_doc_categories: "Catégories de documents" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Documentation |
||||
specification: Spécification |
||||
other: Autre |
||||
label_document_added: "Document ajouté" |
||||
label_document_new: "Nouveau document" |
||||
label_document_plural: "Documents" |
||||
label_documents: "Documents" |
||||
permission_manage_documents: "Gérer les documents" |
||||
permission_view_documents: "Consulter les documents" |
||||
project_module_documents: "Documents" |
@ -0,0 +1,19 @@ |
||||
hr: |
||||
activerecord: |
||||
models: |
||||
document: "Dokument" |
||||
default_doc_category_tech: "Tehnička dokumentacija" |
||||
default_doc_category_user: "Korisnička dokumentacija" |
||||
enumeration_doc_categories: "Kategorije dokumenata" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Documentation |
||||
specification: Specification |
||||
other: Other |
||||
label_document_added: "Dokument dodan" |
||||
label_document_new: "Novi dokument" |
||||
label_document_plural: "Dokumenti" |
||||
label_documents: "Dokumenti" |
||||
permission_manage_documents: "Upravljanje dokumentima" |
||||
permission_view_documents: "Pogledaj dokumente" |
||||
project_module_documents: "Dokumenti" |
@ -0,0 +1,19 @@ |
||||
hu: |
||||
activerecord: |
||||
models: |
||||
document: "Dokumentum" |
||||
default_doc_category_tech: "Technikai dokumentáció" |
||||
default_doc_category_user: "Felhasználói dokumentáció" |
||||
enumeration_doc_categories: "Dokumentum kategóriák" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Dokumentáció |
||||
specification: Specifikáció |
||||
other: Egyéb |
||||
label_document_added: "Dokumentum hozzáadva" |
||||
label_document_new: "Új dokumentum" |
||||
label_document_plural: "Dokumentumok" |
||||
label_documents: "Dokumentumok" |
||||
permission_manage_documents: "Dokumentumok kezelése" |
||||
permission_view_documents: "Dokumetumok megtekintése" |
||||
project_module_documents: "Dokumentumok" |
@ -0,0 +1,19 @@ |
||||
id: |
||||
activerecord: |
||||
models: |
||||
document: "Dokumen" |
||||
default_doc_category_tech: "Dokumentasi teknis" |
||||
default_doc_category_user: "Dokumentasi pengguna" |
||||
enumeration_doc_categories: "Kategori dokumen" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Documentation |
||||
specification: Specification |
||||
other: Other |
||||
label_document_added: "Dokumen ditambahkan" |
||||
label_document_new: "Dokumen baru" |
||||
label_document_plural: "Dokumen" |
||||
label_documents: "Dokumen" |
||||
permission_manage_documents: "Kelola dokumen" |
||||
permission_view_documents: "Lihat dokumen" |
||||
project_module_documents: "Dokumen" |
@ -0,0 +1,19 @@ |
||||
it: |
||||
activerecord: |
||||
models: |
||||
document: "Documento" |
||||
default_doc_category_tech: "Documentazione tecnica" |
||||
default_doc_category_user: "Documentazione utente" |
||||
enumeration_doc_categories: "Categorie di documenti" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Documentazione |
||||
specification: Specifiche |
||||
other: Altro |
||||
label_document_added: "Documento aggiunto" |
||||
label_document_new: "Nuovo Documento" |
||||
label_document_plural: "Documenti" |
||||
label_documents: "Documenti" |
||||
permission_manage_documents: "Gestione documenti" |
||||
permission_view_documents: "Visualizzare i documenti" |
||||
project_module_documents: "Documenti" |
@ -0,0 +1,19 @@ |
||||
ja: |
||||
activerecord: |
||||
models: |
||||
document: "ドキュメント" |
||||
default_doc_category_tech: "技術文書" |
||||
default_doc_category_user: "ユーザー文書" |
||||
enumeration_doc_categories: "ドキュメントのカテゴリ" |
||||
enumeration: |
||||
document_category: |
||||
documentation: 文章 |
||||
specification: 仕様 |
||||
other: その他 |
||||
label_document_added: "追加されたドキュメント" |
||||
label_document_new: "新しいドキュメント" |
||||
label_document_plural: "ドキュメント" |
||||
label_documents: "ドキュメント" |
||||
permission_manage_documents: "ドキュメントを管理" |
||||
permission_view_documents: "ドキュメントの表示" |
||||
project_module_documents: "ドキュメント" |
@ -0,0 +1,19 @@ |
||||
ko: |
||||
activerecord: |
||||
models: |
||||
document: "문서" |
||||
default_doc_category_tech: "기술 설명서" |
||||
default_doc_category_user: "사용자 설명서" |
||||
enumeration_doc_categories: "문서 범주" |
||||
enumeration: |
||||
document_category: |
||||
documentation: 설명서 |
||||
specification: 사양 |
||||
other: 기타 |
||||
label_document_added: "문서 추가됨" |
||||
label_document_new: "새 문서" |
||||
label_document_plural: "문서" |
||||
label_documents: "문서" |
||||
permission_manage_documents: "문서 관리" |
||||
permission_view_documents: "문서 보기" |
||||
project_module_documents: "문서" |
@ -0,0 +1,19 @@ |
||||
lt: |
||||
activerecord: |
||||
models: |
||||
document: "Dokumentas" |
||||
default_doc_category_tech: "Techninė dokumentacija" |
||||
default_doc_category_user: "Vartotojo dokumentacija" |
||||
enumeration_doc_categories: "Dokumentų kategorijos" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Dokumentacija |
||||
specification: Specifikacija |
||||
other: Kita |
||||
label_document_added: "Dokumentas pridėtas" |
||||
label_document_new: "Naujas dokumentas" |
||||
label_document_plural: "Dokumentai" |
||||
label_documents: "Dokumentai" |
||||
permission_manage_documents: "Valdyti dokumentus" |
||||
permission_view_documents: "Peržiūrėti dokumentus" |
||||
project_module_documents: "Dokumentai" |
@ -0,0 +1,19 @@ |
||||
"no": |
||||
activerecord: |
||||
models: |
||||
document: "Dokument" |
||||
default_doc_category_tech: "Teknisk dokumentasjon" |
||||
default_doc_category_user: "Brukerdokumentasjon" |
||||
enumeration_doc_categories: "Dokumentkategorier" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Dokumentasjon |
||||
specification: Spesifikasjon |
||||
other: Andre |
||||
label_document_added: "Dokument lagt til" |
||||
label_document_new: "Nytt dokumenter" |
||||
label_document_plural: "Dokumenter" |
||||
label_documents: "Dokumenter" |
||||
permission_manage_documents: "Administrere dokumenter" |
||||
permission_view_documents: "Vise dokumenter" |
||||
project_module_documents: "Dokumenter" |
@ -0,0 +1,19 @@ |
||||
pl: |
||||
activerecord: |
||||
models: |
||||
document: "Dokument" |
||||
default_doc_category_tech: "Dokumentacja techniczna" |
||||
default_doc_category_user: "Dokumentacja użytkownika" |
||||
enumeration_doc_categories: "Kategoria dokumentu" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Dokumentacja |
||||
specification: Specyfikacja |
||||
other: Inne |
||||
label_document_added: "Dodano dokument" |
||||
label_document_new: "Nowy dokument" |
||||
label_document_plural: "Dokumenty" |
||||
label_documents: "Dokumenty" |
||||
permission_manage_documents: "Zarządzanie dokumentami" |
||||
permission_view_documents: "Zobacz dokumenty" |
||||
project_module_documents: "Dokumenty" |
@ -0,0 +1,19 @@ |
||||
pt-BR: |
||||
activerecord: |
||||
models: |
||||
document: "Documento" |
||||
default_doc_category_tech: "Documentação técnica" |
||||
default_doc_category_user: "Documentação do usuário" |
||||
enumeration_doc_categories: "Categorias de documento" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Documentação |
||||
specification: Especificação |
||||
other: Outro |
||||
label_document_added: "Documento adicionado" |
||||
label_document_new: "Novo documento" |
||||
label_document_plural: "Documentos" |
||||
label_documents: "Documentos" |
||||
permission_manage_documents: "Gerenciar documentos" |
||||
permission_view_documents: "Visualizar documentos" |
||||
project_module_documents: "Documentos" |
@ -0,0 +1,19 @@ |
||||
pt: |
||||
activerecord: |
||||
models: |
||||
document: "Documento" |
||||
default_doc_category_tech: "Documentação técnica" |
||||
default_doc_category_user: "Documentação de utilizador" |
||||
enumeration_doc_categories: "Categorias de documentos" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Documentação |
||||
specification: Especificação |
||||
other: Outro |
||||
label_document_added: "Documento adicionado" |
||||
label_document_new: "Novo documento" |
||||
label_document_plural: "Documentos" |
||||
label_documents: "Documentos" |
||||
permission_manage_documents: "Gerir documentos" |
||||
permission_view_documents: "Ver documentos" |
||||
project_module_documents: "Documentos" |
@ -0,0 +1,19 @@ |
||||
ru: |
||||
activerecord: |
||||
models: |
||||
document: "Документ" |
||||
default_doc_category_tech: "Техническая документация" |
||||
default_doc_category_user: "Документация пользователя" |
||||
enumeration_doc_categories: "Категории документов" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Документация |
||||
specification: Спецификация |
||||
other: Прочее |
||||
label_document_added: "Документ добавлен" |
||||
label_document_new: "Новый документ" |
||||
label_document_plural: "Документы" |
||||
label_documents: "Документы" |
||||
permission_manage_documents: "Управление документами" |
||||
permission_view_documents: "Просмотр документов" |
||||
project_module_documents: "Документы" |
@ -0,0 +1,19 @@ |
||||
sk: |
||||
activerecord: |
||||
models: |
||||
document: "Dokument" |
||||
default_doc_category_tech: "Technická dokumentácia" |
||||
default_doc_category_user: "Používateľská dokumentácia" |
||||
enumeration_doc_categories: "Kategórie dokumentu" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Documentation |
||||
specification: Specification |
||||
other: Other |
||||
label_document_added: "Dokument pridaný" |
||||
label_document_new: "Nový dokument" |
||||
label_document_plural: "Dokumenty" |
||||
label_documents: "Dokumenty" |
||||
permission_manage_documents: "Správa dokumentov" |
||||
permission_view_documents: "Zobrazenie dokumentov" |
||||
project_module_documents: "Dokumenty" |
@ -0,0 +1,19 @@ |
||||
sv: |
||||
activerecord: |
||||
models: |
||||
document: "Dokument" |
||||
default_doc_category_tech: "Teknisk dokumentation" |
||||
default_doc_category_user: "Användardokumentation" |
||||
enumeration_doc_categories: "Dokumentkategorier" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Dokumentation |
||||
specification: Specifikation |
||||
other: Andra |
||||
label_document_added: "Dokumentet tillagt" |
||||
label_document_new: "Nytt dokument" |
||||
label_document_plural: "Dokument" |
||||
label_documents: "Dokument" |
||||
permission_manage_documents: "Hantera dokument" |
||||
permission_view_documents: "Visa dokument" |
||||
project_module_documents: "Dokument" |
@ -0,0 +1,19 @@ |
||||
tr: |
||||
activerecord: |
||||
models: |
||||
document: "Belge" |
||||
default_doc_category_tech: "Teknik belgeler" |
||||
default_doc_category_user: "Kullanıcı belgeleri" |
||||
enumeration_doc_categories: "Belge kategorileri" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Belgeleme |
||||
specification: Şartname |
||||
other: Diğer |
||||
label_document_added: "Belge eklendi" |
||||
label_document_new: "Yeni belge" |
||||
label_document_plural: "Belgeler" |
||||
label_documents: "Belgeler" |
||||
permission_manage_documents: "Belgeleri yönetme" |
||||
permission_view_documents: "Belgeleri görüntüleme" |
||||
project_module_documents: "Belgeler" |
@ -0,0 +1,19 @@ |
||||
zh-CN: |
||||
activerecord: |
||||
models: |
||||
document: "文档" |
||||
default_doc_category_tech: "技术文档" |
||||
default_doc_category_user: "用户文档" |
||||
enumeration_doc_categories: "文档类别" |
||||
enumeration: |
||||
document_category: |
||||
documentation: 文档 |
||||
specification: 技术规范 |
||||
other: ' 其它' |
||||
label_document_added: "文档已添加" |
||||
label_document_new: "新建文档" |
||||
label_document_plural: "文档" |
||||
label_documents: "文档" |
||||
permission_manage_documents: "管理文档" |
||||
permission_view_documents: "查看文档" |
||||
project_module_documents: "文档" |
@ -0,0 +1,19 @@ |
||||
zh-TW: |
||||
activerecord: |
||||
models: |
||||
document: "文件" |
||||
default_doc_category_tech: "技術文件" |
||||
default_doc_category_user: "使用者文件" |
||||
enumeration_doc_categories: "文件類別" |
||||
enumeration: |
||||
document_category: |
||||
documentation: 說明文件 |
||||
specification: 技術規格 |
||||
other: 其他 |
||||
label_document_added: "文件已新增" |
||||
label_document_new: "建立新文件" |
||||
label_document_plural: "文件" |
||||
label_documents: "文件" |
||||
permission_manage_documents: "管理文件" |
||||
permission_view_documents: "檢視文件" |
||||
project_module_documents: "文件" |
@ -0,0 +1,54 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
en: |
||||
activerecord: |
||||
models: |
||||
document: "Document" |
||||
|
||||
default_doc_category_tech: "Technical documentation" |
||||
default_doc_category_user: "User documentation" |
||||
|
||||
enumeration_doc_categories: "Document categories" |
||||
enumeration: |
||||
document_category: |
||||
documentation: Documentation |
||||
specification: Specification |
||||
other: Other |
||||
|
||||
label_document_added: "Document added" |
||||
label_document_new: "New document" |
||||
label_document_plural: "Documents" |
||||
label_documents: "Documents" |
||||
|
||||
permission_manage_documents: "Manage documents" |
||||
permission_view_documents: "View documents" |
||||
project_module_documents: "Documents" |
@ -0,0 +1,42 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
OpenProject::Application.routes.draw do |
||||
resources :projects, only: [] do |
||||
resources :documents, only: [:create, :new, :index] |
||||
end |
||||
|
||||
resources :documents, except: [:create, :new, :index] do |
||||
member do |
||||
post 'add_attachment' |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,66 @@ |
||||
#-- copyright |
||||
# OpenProject Reporting Plugin |
||||
# |
||||
# Copyright (C) 2010 - 2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# This program is free software; you can redistribute it and/or |
||||
# modify it under the terms of the GNU General Public License |
||||
# version 3. |
||||
# |
||||
# 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. |
||||
#++ |
||||
|
||||
require Rails.root.join("db","migrate","migration_utils","migration_squasher").to_s |
||||
# This migration aggregates the migrations detailed in MIGRATION_FILES |
||||
class ToV710AggregatedDocumentsMigrations < ActiveRecord::Migration[5.1] |
||||
|
||||
MIGRATION_FILES = <<-MIGRATIONS |
||||
20130807085604_create_document_journals.rb |
||||
20130814131242_create_documents_tables.rb |
||||
20140320140001_legacy_document_journal_data.rb |
||||
MIGRATIONS |
||||
|
||||
def up |
||||
Migration::MigrationSquasher.squash(migrations) do |
||||
create_table "documents", id: :integer do |t| |
||||
t.integer "project_id", :default => 0, :null => false |
||||
t.integer "category_id", :default => 0, :null => false |
||||
t.string "title", :limit => 60, :default => "", :null => false |
||||
t.text "description" |
||||
t.datetime "created_on" |
||||
end |
||||
add_index "documents", ["category_id"], :name => "index_documents_on_category_id" |
||||
add_index "documents", ["created_on"], :name => "index_documents_on_created_on" |
||||
add_index "documents", ["project_id"], :name => "documents_project_id" |
||||
|
||||
create_table :document_journals, id: :integer do |t| |
||||
t.integer :journal_id, :null => false |
||||
t.integer :project_id, :default => 0, :null => false |
||||
t.integer :category_id, :default => 0, :null => false |
||||
t.string :title, :limit => 60, :default => "", :null => false |
||||
t.text :description |
||||
t.datetime :created_on |
||||
end |
||||
end |
||||
end |
||||
|
||||
def down |
||||
drop_table :documents |
||||
drop_table :document_journals |
||||
end |
||||
|
||||
private |
||||
|
||||
def migrations |
||||
MIGRATION_FILES.split.map do |m| |
||||
m.gsub(/_.*\z/, '') |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,69 @@ |
||||
<!---- copyright |
||||
OpenProject Documents Plugin |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
|
||||
++--> |
||||
|
||||
# Changelog |
||||
|
||||
## 3.0.8 |
||||
|
||||
* `#7679` Fix: Permissions not nested in 'documents' project module |
||||
* `#5650` Fix: Acts as event datetime |
||||
|
||||
## 1.0.1 |
||||
|
||||
* `#5361` Add missing journal data migration |
||||
|
||||
## 1.0.0 |
||||
|
||||
* `#3329` Refactor Duplicated Code Journals |
||||
* `#5190` Public Release Documents plugin |
||||
* Adaptations for new icon font |
||||
|
||||
## 1.0.0.pre5 |
||||
|
||||
* `#2402` Activated migrations running from the plugin |
||||
* Additional namespacing of hook partials to prevent clashes on activity view |
||||
|
||||
## 1.0.0.pre4 |
||||
|
||||
* `#1875` Added document block to my project page |
||||
|
||||
## 1.0.0.pre3 |
||||
|
||||
* Removed hard wiring to specific core version |
||||
|
||||
## 1.0.0.pre2 |
||||
|
||||
* `#1602` Adaptions to Core acts_as_journalized_changes |
||||
|
||||
## 1.0.0.pre1 |
||||
|
||||
* `#1631` Initial creation of Documents plugin |
@ -0,0 +1,63 @@ |
||||
OpenProject Documents Plugin |
||||
|
||||
This plugin adds features to connect and categorize documents with your project. |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
This program is free software; you can redistribute it and/or |
||||
modify it under the terms of the GNU General Public License |
||||
version 3. |
||||
|
||||
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. |
||||
|
||||
--- |
||||
|
||||
OpenProject is a derivative work based on ChiliProject, whose Copyright follows. |
||||
|
||||
ChiliProject is a project management system. |
||||
|
||||
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. |
||||
|
||||
--- |
||||
|
||||
ChiliProject is a derivative work based on Redmine, whose Copyright follows. |
||||
|
||||
Redmine - project management software |
||||
Copyright (C) 2006-2013 Jean-Philippe Lang |
||||
|
||||
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. |
@ -0,0 +1,28 @@ |
||||
OpenProject Documents Plugin |
||||
|
||||
Former OpenProject Core functionality extracted into a plugin. |
||||
|
||||
Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
|
||||
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-2013 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 doc/COPYRIGHT.rdoc for more details. |
@ -0,0 +1,674 @@ |
||||
GNU GENERAL PUBLIC LICENSE |
||||
Version 3, 29 June 2007 |
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> |
||||
Everyone is permitted to copy and distribute verbatim copies |
||||
of this license document, but changing it is not allowed. |
||||
|
||||
Preamble |
||||
|
||||
The GNU General Public License is a free, copyleft license for |
||||
software and other kinds of works. |
||||
|
||||
The licenses for most software and other practical works are designed |
||||
to take away your freedom to share and change the works. By contrast, |
||||
the GNU General Public License is intended to guarantee your freedom to |
||||
share and change all versions of a program--to make sure it remains free |
||||
software for all its users. We, the Free Software Foundation, use the |
||||
GNU General Public License for most of our software; it applies also to |
||||
any other work released this way by its authors. You can apply it to |
||||
your programs, too. |
||||
|
||||
When we speak of free software, we are referring to freedom, not |
||||
price. Our General Public Licenses are designed to make sure that you |
||||
have the freedom to distribute copies of free software (and charge for |
||||
them if you wish), that you receive source code or can get it if you |
||||
want it, that you can change the software or use pieces of it in new |
||||
free programs, and that you know you can do these things. |
||||
|
||||
To protect your rights, we need to prevent others from denying you |
||||
these rights or asking you to surrender the rights. Therefore, you have |
||||
certain responsibilities if you distribute copies of the software, or if |
||||
you modify it: responsibilities to respect the freedom of others. |
||||
|
||||
For example, if you distribute copies of such a program, whether |
||||
gratis or for a fee, you must pass on to the recipients the same |
||||
freedoms that you received. You must make sure that they, too, receive |
||||
or can get the source code. And you must show them these terms so they |
||||
know their rights. |
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps: |
||||
(1) assert copyright on the software, and (2) offer you this License |
||||
giving you legal permission to copy, distribute and/or modify it. |
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains |
||||
that there is no warranty for this free software. For both users' and |
||||
authors' sake, the GPL requires that modified versions be marked as |
||||
changed, so that their problems will not be attributed erroneously to |
||||
authors of previous versions. |
||||
|
||||
Some devices are designed to deny users access to install or run |
||||
modified versions of the software inside them, although the manufacturer |
||||
can do so. This is fundamentally incompatible with the aim of |
||||
protecting users' freedom to change the software. The systematic |
||||
pattern of such abuse occurs in the area of products for individuals to |
||||
use, which is precisely where it is most unacceptable. Therefore, we |
||||
have designed this version of the GPL to prohibit the practice for those |
||||
products. If such problems arise substantially in other domains, we |
||||
stand ready to extend this provision to those domains in future versions |
||||
of the GPL, as needed to protect the freedom of users. |
||||
|
||||
Finally, every program is threatened constantly by software patents. |
||||
States should not allow patents to restrict development and use of |
||||
software on general-purpose computers, but in those that do, we wish to |
||||
avoid the special danger that patents applied to a free program could |
||||
make it effectively proprietary. To prevent this, the GPL assures that |
||||
patents cannot be used to render the program non-free. |
||||
|
||||
The precise terms and conditions for copying, distribution and |
||||
modification follow. |
||||
|
||||
TERMS AND CONDITIONS |
||||
|
||||
0. Definitions. |
||||
|
||||
"This License" refers to version 3 of the GNU General Public License. |
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of |
||||
works, such as semiconductor masks. |
||||
|
||||
"The Program" refers to any copyrightable work licensed under this |
||||
License. Each licensee is addressed as "you". "Licensees" and |
||||
"recipients" may be individuals or organizations. |
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work |
||||
in a fashion requiring copyright permission, other than the making of an |
||||
exact copy. The resulting work is called a "modified version" of the |
||||
earlier work or a work "based on" the earlier work. |
||||
|
||||
A "covered work" means either the unmodified Program or a work based |
||||
on the Program. |
||||
|
||||
To "propagate" a work means to do anything with it that, without |
||||
permission, would make you directly or secondarily liable for |
||||
infringement under applicable copyright law, except executing it on a |
||||
computer or modifying a private copy. Propagation includes copying, |
||||
distribution (with or without modification), making available to the |
||||
public, and in some countries other activities as well. |
||||
|
||||
To "convey" a work means any kind of propagation that enables other |
||||
parties to make or receive copies. Mere interaction with a user through |
||||
a computer network, with no transfer of a copy, is not conveying. |
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices" |
||||
to the extent that it includes a convenient and prominently visible |
||||
feature that (1) displays an appropriate copyright notice, and (2) |
||||
tells the user that there is no warranty for the work (except to the |
||||
extent that warranties are provided), that licensees may convey the |
||||
work under this License, and how to view a copy of this License. If |
||||
the interface presents a list of user commands or options, such as a |
||||
menu, a prominent item in the list meets this criterion. |
||||
|
||||
1. Source Code. |
||||
|
||||
The "source code" for a work means the preferred form of the work |
||||
for making modifications to it. "Object code" means any non-source |
||||
form of a work. |
||||
|
||||
A "Standard Interface" means an interface that either is an official |
||||
standard defined by a recognized standards body, or, in the case of |
||||
interfaces specified for a particular programming language, one that |
||||
is widely used among developers working in that language. |
||||
|
||||
The "System Libraries" of an executable work include anything, other |
||||
than the work as a whole, that (a) is included in the normal form of |
||||
packaging a Major Component, but which is not part of that Major |
||||
Component, and (b) serves only to enable use of the work with that |
||||
Major Component, or to implement a Standard Interface for which an |
||||
implementation is available to the public in source code form. A |
||||
"Major Component", in this context, means a major essential component |
||||
(kernel, window system, and so on) of the specific operating system |
||||
(if any) on which the executable work runs, or a compiler used to |
||||
produce the work, or an object code interpreter used to run it. |
||||
|
||||
The "Corresponding Source" for a work in object code form means all |
||||
the source code needed to generate, install, and (for an executable |
||||
work) run the object code and to modify the work, including scripts to |
||||
control those activities. However, it does not include the work's |
||||
System Libraries, or general-purpose tools or generally available free |
||||
programs which are used unmodified in performing those activities but |
||||
which are not part of the work. For example, Corresponding Source |
||||
includes interface definition files associated with source files for |
||||
the work, and the source code for shared libraries and dynamically |
||||
linked subprograms that the work is specifically designed to require, |
||||
such as by intimate data communication or control flow between those |
||||
subprograms and other parts of the work. |
||||
|
||||
The Corresponding Source need not include anything that users |
||||
can regenerate automatically from other parts of the Corresponding |
||||
Source. |
||||
|
||||
The Corresponding Source for a work in source code form is that |
||||
same work. |
||||
|
||||
2. Basic Permissions. |
||||
|
||||
All rights granted under this License are granted for the term of |
||||
copyright on the Program, and are irrevocable provided the stated |
||||
conditions are met. This License explicitly affirms your unlimited |
||||
permission to run the unmodified Program. The output from running a |
||||
covered work is covered by this License only if the output, given its |
||||
content, constitutes a covered work. This License acknowledges your |
||||
rights of fair use or other equivalent, as provided by copyright law. |
||||
|
||||
You may make, run and propagate covered works that you do not |
||||
convey, without conditions so long as your license otherwise remains |
||||
in force. You may convey covered works to others for the sole purpose |
||||
of having them make modifications exclusively for you, or provide you |
||||
with facilities for running those works, provided that you comply with |
||||
the terms of this License in conveying all material for which you do |
||||
not control copyright. Those thus making or running the covered works |
||||
for you must do so exclusively on your behalf, under your direction |
||||
and control, on terms that prohibit them from making any copies of |
||||
your copyrighted material outside their relationship with you. |
||||
|
||||
Conveying under any other circumstances is permitted solely under |
||||
the conditions stated below. Sublicensing is not allowed; section 10 |
||||
makes it unnecessary. |
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law. |
||||
|
||||
No covered work shall be deemed part of an effective technological |
||||
measure under any applicable law fulfilling obligations under article |
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or |
||||
similar laws prohibiting or restricting circumvention of such |
||||
measures. |
||||
|
||||
When you convey a covered work, you waive any legal power to forbid |
||||
circumvention of technological measures to the extent such circumvention |
||||
is effected by exercising rights under this License with respect to |
||||
the covered work, and you disclaim any intention to limit operation or |
||||
modification of the work as a means of enforcing, against the work's |
||||
users, your or third parties' legal rights to forbid circumvention of |
||||
technological measures. |
||||
|
||||
4. Conveying Verbatim Copies. |
||||
|
||||
You may convey verbatim copies of the Program's source code as you |
||||
receive it, in any medium, provided that you conspicuously and |
||||
appropriately publish on each copy an appropriate copyright notice; |
||||
keep intact all notices stating that this License and any |
||||
non-permissive terms added in accord with section 7 apply to the code; |
||||
keep intact all notices of the absence of any warranty; and give all |
||||
recipients a copy of this License along with the Program. |
||||
|
||||
You may charge any price or no price for each copy that you convey, |
||||
and you may offer support or warranty protection for a fee. |
||||
|
||||
5. Conveying Modified Source Versions. |
||||
|
||||
You may convey a work based on the Program, or the modifications to |
||||
produce it from the Program, in the form of source code under the |
||||
terms of section 4, provided that you also meet all of these conditions: |
||||
|
||||
a) The work must carry prominent notices stating that you modified |
||||
it, and giving a relevant date. |
||||
|
||||
b) The work must carry prominent notices stating that it is |
||||
released under this License and any conditions added under section |
||||
7. This requirement modifies the requirement in section 4 to |
||||
"keep intact all notices". |
||||
|
||||
c) You must license the entire work, as a whole, under this |
||||
License to anyone who comes into possession of a copy. This |
||||
License will therefore apply, along with any applicable section 7 |
||||
additional terms, to the whole of the work, and all its parts, |
||||
regardless of how they are packaged. This License gives no |
||||
permission to license the work in any other way, but it does not |
||||
invalidate such permission if you have separately received it. |
||||
|
||||
d) If the work has interactive user interfaces, each must display |
||||
Appropriate Legal Notices; however, if the Program has interactive |
||||
interfaces that do not display Appropriate Legal Notices, your |
||||
work need not make them do so. |
||||
|
||||
A compilation of a covered work with other separate and independent |
||||
works, which are not by their nature extensions of the covered work, |
||||
and which are not combined with it such as to form a larger program, |
||||
in or on a volume of a storage or distribution medium, is called an |
||||
"aggregate" if the compilation and its resulting copyright are not |
||||
used to limit the access or legal rights of the compilation's users |
||||
beyond what the individual works permit. Inclusion of a covered work |
||||
in an aggregate does not cause this License to apply to the other |
||||
parts of the aggregate. |
||||
|
||||
6. Conveying Non-Source Forms. |
||||
|
||||
You may convey a covered work in object code form under the terms |
||||
of sections 4 and 5, provided that you also convey the |
||||
machine-readable Corresponding Source under the terms of this License, |
||||
in one of these ways: |
||||
|
||||
a) Convey the object code in, or embodied in, a physical product |
||||
(including a physical distribution medium), accompanied by the |
||||
Corresponding Source fixed on a durable physical medium |
||||
customarily used for software interchange. |
||||
|
||||
b) Convey the object code in, or embodied in, a physical product |
||||
(including a physical distribution medium), accompanied by a |
||||
written offer, valid for at least three years and valid for as |
||||
long as you offer spare parts or customer support for that product |
||||
model, to give anyone who possesses the object code either (1) a |
||||
copy of the Corresponding Source for all the software in the |
||||
product that is covered by this License, on a durable physical |
||||
medium customarily used for software interchange, for a price no |
||||
more than your reasonable cost of physically performing this |
||||
conveying of source, or (2) access to copy the |
||||
Corresponding Source from a network server at no charge. |
||||
|
||||
c) Convey individual copies of the object code with a copy of the |
||||
written offer to provide the Corresponding Source. This |
||||
alternative is allowed only occasionally and noncommercially, and |
||||
only if you received the object code with such an offer, in accord |
||||
with subsection 6b. |
||||
|
||||
d) Convey the object code by offering access from a designated |
||||
place (gratis or for a charge), and offer equivalent access to the |
||||
Corresponding Source in the same way through the same place at no |
||||
further charge. You need not require recipients to copy the |
||||
Corresponding Source along with the object code. If the place to |
||||
copy the object code is a network server, the Corresponding Source |
||||
may be on a different server (operated by you or a third party) |
||||
that supports equivalent copying facilities, provided you maintain |
||||
clear directions next to the object code saying where to find the |
||||
Corresponding Source. Regardless of what server hosts the |
||||
Corresponding Source, you remain obligated to ensure that it is |
||||
available for as long as needed to satisfy these requirements. |
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided |
||||
you inform other peers where the object code and Corresponding |
||||
Source of the work are being offered to the general public at no |
||||
charge under subsection 6d. |
||||
|
||||
A separable portion of the object code, whose source code is excluded |
||||
from the Corresponding Source as a System Library, need not be |
||||
included in conveying the object code work. |
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any |
||||
tangible personal property which is normally used for personal, family, |
||||
or household purposes, or (2) anything designed or sold for incorporation |
||||
into a dwelling. In determining whether a product is a consumer product, |
||||
doubtful cases shall be resolved in favor of coverage. For a particular |
||||
product received by a particular user, "normally used" refers to a |
||||
typical or common use of that class of product, regardless of the status |
||||
of the particular user or of the way in which the particular user |
||||
actually uses, or expects or is expected to use, the product. A product |
||||
is a consumer product regardless of whether the product has substantial |
||||
commercial, industrial or non-consumer uses, unless such uses represent |
||||
the only significant mode of use of the product. |
||||
|
||||
"Installation Information" for a User Product means any methods, |
||||
procedures, authorization keys, or other information required to install |
||||
and execute modified versions of a covered work in that User Product from |
||||
a modified version of its Corresponding Source. The information must |
||||
suffice to ensure that the continued functioning of the modified object |
||||
code is in no case prevented or interfered with solely because |
||||
modification has been made. |
||||
|
||||
If you convey an object code work under this section in, or with, or |
||||
specifically for use in, a User Product, and the conveying occurs as |
||||
part of a transaction in which the right of possession and use of the |
||||
User Product is transferred to the recipient in perpetuity or for a |
||||
fixed term (regardless of how the transaction is characterized), the |
||||
Corresponding Source conveyed under this section must be accompanied |
||||
by the Installation Information. But this requirement does not apply |
||||
if neither you nor any third party retains the ability to install |
||||
modified object code on the User Product (for example, the work has |
||||
been installed in ROM). |
||||
|
||||
The requirement to provide Installation Information does not include a |
||||
requirement to continue to provide support service, warranty, or updates |
||||
for a work that has been modified or installed by the recipient, or for |
||||
the User Product in which it has been modified or installed. Access to a |
||||
network may be denied when the modification itself materially and |
||||
adversely affects the operation of the network or violates the rules and |
||||
protocols for communication across the network. |
||||
|
||||
Corresponding Source conveyed, and Installation Information provided, |
||||
in accord with this section must be in a format that is publicly |
||||
documented (and with an implementation available to the public in |
||||
source code form), and must require no special password or key for |
||||
unpacking, reading or copying. |
||||
|
||||
7. Additional Terms. |
||||
|
||||
"Additional permissions" are terms that supplement the terms of this |
||||
License by making exceptions from one or more of its conditions. |
||||
Additional permissions that are applicable to the entire Program shall |
||||
be treated as though they were included in this License, to the extent |
||||
that they are valid under applicable law. If additional permissions |
||||
apply only to part of the Program, that part may be used separately |
||||
under those permissions, but the entire Program remains governed by |
||||
this License without regard to the additional permissions. |
||||
|
||||
When you convey a copy of a covered work, you may at your option |
||||
remove any additional permissions from that copy, or from any part of |
||||
it. (Additional permissions may be written to require their own |
||||
removal in certain cases when you modify the work.) You may place |
||||
additional permissions on material, added by you to a covered work, |
||||
for which you have or can give appropriate copyright permission. |
||||
|
||||
Notwithstanding any other provision of this License, for material you |
||||
add to a covered work, you may (if authorized by the copyright holders of |
||||
that material) supplement the terms of this License with terms: |
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the |
||||
terms of sections 15 and 16 of this License; or |
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or |
||||
author attributions in that material or in the Appropriate Legal |
||||
Notices displayed by works containing it; or |
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or |
||||
requiring that modified versions of such material be marked in |
||||
reasonable ways as different from the original version; or |
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or |
||||
authors of the material; or |
||||
|
||||
e) Declining to grant rights under trademark law for use of some |
||||
trade names, trademarks, or service marks; or |
||||
|
||||
f) Requiring indemnification of licensors and authors of that |
||||
material by anyone who conveys the material (or modified versions of |
||||
it) with contractual assumptions of liability to the recipient, for |
||||
any liability that these contractual assumptions directly impose on |
||||
those licensors and authors. |
||||
|
||||
All other non-permissive additional terms are considered "further |
||||
restrictions" within the meaning of section 10. If the Program as you |
||||
received it, or any part of it, contains a notice stating that it is |
||||
governed by this License along with a term that is a further |
||||
restriction, you may remove that term. If a license document contains |
||||
a further restriction but permits relicensing or conveying under this |
||||
License, you may add to a covered work material governed by the terms |
||||
of that license document, provided that the further restriction does |
||||
not survive such relicensing or conveying. |
||||
|
||||
If you add terms to a covered work in accord with this section, you |
||||
must place, in the relevant source files, a statement of the |
||||
additional terms that apply to those files, or a notice indicating |
||||
where to find the applicable terms. |
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the |
||||
form of a separately written license, or stated as exceptions; |
||||
the above requirements apply either way. |
||||
|
||||
8. Termination. |
||||
|
||||
You may not propagate or modify a covered work except as expressly |
||||
provided under this License. Any attempt otherwise to propagate or |
||||
modify it is void, and will automatically terminate your rights under |
||||
this License (including any patent licenses granted under the third |
||||
paragraph of section 11). |
||||
|
||||
However, if you cease all violation of this License, then your |
||||
license from a particular copyright holder is reinstated (a) |
||||
provisionally, unless and until the copyright holder explicitly and |
||||
finally terminates your license, and (b) permanently, if the copyright |
||||
holder fails to notify you of the violation by some reasonable means |
||||
prior to 60 days after the cessation. |
||||
|
||||
Moreover, your license from a particular copyright holder is |
||||
reinstated permanently if the copyright holder notifies you of the |
||||
violation by some reasonable means, this is the first time you have |
||||
received notice of violation of this License (for any work) from that |
||||
copyright holder, and you cure the violation prior to 30 days after |
||||
your receipt of the notice. |
||||
|
||||
Termination of your rights under this section does not terminate the |
||||
licenses of parties who have received copies or rights from you under |
||||
this License. If your rights have been terminated and not permanently |
||||
reinstated, you do not qualify to receive new licenses for the same |
||||
material under section 10. |
||||
|
||||
9. Acceptance Not Required for Having Copies. |
||||
|
||||
You are not required to accept this License in order to receive or |
||||
run a copy of the Program. Ancillary propagation of a covered work |
||||
occurring solely as a consequence of using peer-to-peer transmission |
||||
to receive a copy likewise does not require acceptance. However, |
||||
nothing other than this License grants you permission to propagate or |
||||
modify any covered work. These actions infringe copyright if you do |
||||
not accept this License. Therefore, by modifying or propagating a |
||||
covered work, you indicate your acceptance of this License to do so. |
||||
|
||||
10. Automatic Licensing of Downstream Recipients. |
||||
|
||||
Each time you convey a covered work, the recipient automatically |
||||
receives a license from the original licensors, to run, modify and |
||||
propagate that work, subject to this License. You are not responsible |
||||
for enforcing compliance by third parties with this License. |
||||
|
||||
An "entity transaction" is a transaction transferring control of an |
||||
organization, or substantially all assets of one, or subdividing an |
||||
organization, or merging organizations. If propagation of a covered |
||||
work results from an entity transaction, each party to that |
||||
transaction who receives a copy of the work also receives whatever |
||||
licenses to the work the party's predecessor in interest had or could |
||||
give under the previous paragraph, plus a right to possession of the |
||||
Corresponding Source of the work from the predecessor in interest, if |
||||
the predecessor has it or can get it with reasonable efforts. |
||||
|
||||
You may not impose any further restrictions on the exercise of the |
||||
rights granted or affirmed under this License. For example, you may |
||||
not impose a license fee, royalty, or other charge for exercise of |
||||
rights granted under this License, and you may not initiate litigation |
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that |
||||
any patent claim is infringed by making, using, selling, offering for |
||||
sale, or importing the Program or any portion of it. |
||||
|
||||
11. Patents. |
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this |
||||
License of the Program or a work on which the Program is based. The |
||||
work thus licensed is called the contributor's "contributor version". |
||||
|
||||
A contributor's "essential patent claims" are all patent claims |
||||
owned or controlled by the contributor, whether already acquired or |
||||
hereafter acquired, that would be infringed by some manner, permitted |
||||
by this License, of making, using, or selling its contributor version, |
||||
but do not include claims that would be infringed only as a |
||||
consequence of further modification of the contributor version. For |
||||
purposes of this definition, "control" includes the right to grant |
||||
patent sublicenses in a manner consistent with the requirements of |
||||
this License. |
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free |
||||
patent license under the contributor's essential patent claims, to |
||||
make, use, sell, offer for sale, import and otherwise run, modify and |
||||
propagate the contents of its contributor version. |
||||
|
||||
In the following three paragraphs, a "patent license" is any express |
||||
agreement or commitment, however denominated, not to enforce a patent |
||||
(such as an express permission to practice a patent or covenant not to |
||||
sue for patent infringement). To "grant" such a patent license to a |
||||
party means to make such an agreement or commitment not to enforce a |
||||
patent against the party. |
||||
|
||||
If you convey a covered work, knowingly relying on a patent license, |
||||
and the Corresponding Source of the work is not available for anyone |
||||
to copy, free of charge and under the terms of this License, through a |
||||
publicly available network server or other readily accessible means, |
||||
then you must either (1) cause the Corresponding Source to be so |
||||
available, or (2) arrange to deprive yourself of the benefit of the |
||||
patent license for this particular work, or (3) arrange, in a manner |
||||
consistent with the requirements of this License, to extend the patent |
||||
license to downstream recipients. "Knowingly relying" means you have |
||||
actual knowledge that, but for the patent license, your conveying the |
||||
covered work in a country, or your recipient's use of the covered work |
||||
in a country, would infringe one or more identifiable patents in that |
||||
country that you have reason to believe are valid. |
||||
|
||||
If, pursuant to or in connection with a single transaction or |
||||
arrangement, you convey, or propagate by procuring conveyance of, a |
||||
covered work, and grant a patent license to some of the parties |
||||
receiving the covered work authorizing them to use, propagate, modify |
||||
or convey a specific copy of the covered work, then the patent license |
||||
you grant is automatically extended to all recipients of the covered |
||||
work and works based on it. |
||||
|
||||
A patent license is "discriminatory" if it does not include within |
||||
the scope of its coverage, prohibits the exercise of, or is |
||||
conditioned on the non-exercise of one or more of the rights that are |
||||
specifically granted under this License. You may not convey a covered |
||||
work if you are a party to an arrangement with a third party that is |
||||
in the business of distributing software, under which you make payment |
||||
to the third party based on the extent of your activity of conveying |
||||
the work, and under which the third party grants, to any of the |
||||
parties who would receive the covered work from you, a discriminatory |
||||
patent license (a) in connection with copies of the covered work |
||||
conveyed by you (or copies made from those copies), or (b) primarily |
||||
for and in connection with specific products or compilations that |
||||
contain the covered work, unless you entered into that arrangement, |
||||
or that patent license was granted, prior to 28 March 2007. |
||||
|
||||
Nothing in this License shall be construed as excluding or limiting |
||||
any implied license or other defenses to infringement that may |
||||
otherwise be available to you under applicable patent law. |
||||
|
||||
12. No Surrender of Others' Freedom. |
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or |
||||
otherwise) that contradict the conditions of this License, they do not |
||||
excuse you from the conditions of this License. If you cannot convey a |
||||
covered work so as to satisfy simultaneously your obligations under this |
||||
License and any other pertinent obligations, then as a consequence you may |
||||
not convey it at all. For example, if you agree to terms that obligate you |
||||
to collect a royalty for further conveying from those to whom you convey |
||||
the Program, the only way you could satisfy both those terms and this |
||||
License would be to refrain entirely from conveying the Program. |
||||
|
||||
13. Use with the GNU Affero General Public License. |
||||
|
||||
Notwithstanding any other provision of this License, you have |
||||
permission to link or combine any covered work with a work licensed |
||||
under version 3 of the GNU Affero General Public License into a single |
||||
combined work, and to convey the resulting work. The terms of this |
||||
License will continue to apply to the part which is the covered work, |
||||
but the special requirements of the GNU Affero General Public License, |
||||
section 13, concerning interaction through a network will apply to the |
||||
combination as such. |
||||
|
||||
14. Revised Versions of this License. |
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of |
||||
the GNU General Public License from time to time. Such new versions will |
||||
be similar in spirit to the present version, but may differ in detail to |
||||
address new problems or concerns. |
||||
|
||||
Each version is given a distinguishing version number. If the |
||||
Program specifies that a certain numbered version of the GNU General |
||||
Public License "or any later version" applies to it, you have the |
||||
option of following the terms and conditions either of that numbered |
||||
version or of any later version published by the Free Software |
||||
Foundation. If the Program does not specify a version number of the |
||||
GNU General Public License, you may choose any version ever published |
||||
by the Free Software Foundation. |
||||
|
||||
If the Program specifies that a proxy can decide which future |
||||
versions of the GNU General Public License can be used, that proxy's |
||||
public statement of acceptance of a version permanently authorizes you |
||||
to choose that version for the Program. |
||||
|
||||
Later license versions may give you additional or different |
||||
permissions. However, no additional obligations are imposed on any |
||||
author or copyright holder as a result of your choosing to follow a |
||||
later version. |
||||
|
||||
15. Disclaimer of Warranty. |
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY |
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT |
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY |
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, |
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM |
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF |
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION. |
||||
|
||||
16. Limitation of Liability. |
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS |
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY |
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE |
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF |
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD |
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), |
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF |
||||
SUCH DAMAGES. |
||||
|
||||
17. Interpretation of Sections 15 and 16. |
||||
|
||||
If the disclaimer of warranty and limitation of liability provided |
||||
above cannot be given local legal effect according to their terms, |
||||
reviewing courts shall apply local law that most closely approximates |
||||
an absolute waiver of all civil liability in connection with the |
||||
Program, unless a warranty or assumption of liability accompanies a |
||||
copy of the Program in return for a fee. |
||||
|
||||
END OF TERMS AND CONDITIONS |
||||
|
||||
How to Apply These Terms to Your New Programs |
||||
|
||||
If you develop a new program, and you want it to be of the greatest |
||||
possible use to the public, the best way to achieve this is to make it |
||||
free software which everyone can redistribute and change under these terms. |
||||
|
||||
To do so, attach the following notices to the program. It is safest |
||||
to attach them to the start of each source file to most effectively |
||||
state the exclusion of warranty; and each file should have at least |
||||
the "copyright" line and a pointer to where the full notice is found. |
||||
|
||||
<one line to give the program's name and a brief idea of what it does.> |
||||
Copyright (C) <year> <name of author> |
||||
|
||||
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 3 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, see <http://www.gnu.org/licenses/>. |
||||
|
||||
Also add information on how to contact you by electronic and paper mail. |
||||
|
||||
If the program does terminal interaction, make it output a short |
||||
notice like this when it starts in an interactive mode: |
||||
|
||||
<program> Copyright (C) <year> <name of author> |
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
||||
This is free software, and you are welcome to redistribute it |
||||
under certain conditions; type `show c' for details. |
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate |
||||
parts of the General Public License. Of course, your program's commands |
||||
might be different; for a GUI interface, you would use an "about box". |
||||
|
||||
You should also get your employer (if you work as a programmer) or school, |
||||
if any, to sign a "copyright disclaimer" for the program, if necessary. |
||||
For more information on this, and how to apply and follow the GNU GPL, see |
||||
<http://www.gnu.org/licenses/>. |
||||
|
||||
The GNU General Public License does not permit incorporating your program |
||||
into proprietary programs. If your program is a subroutine library, you |
||||
may consider it more useful to permit linking proprietary applications with |
||||
the library. If this is what you want to do, use the GNU Lesser General |
||||
Public License instead of this License. But first, please read |
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>. |
@ -0,0 +1,50 @@ |
||||
// -- copyright
|
||||
// OpenProject Documents Plugin
|
||||
//
|
||||
// Former OpenProject Core functionality extracted into a plugin.
|
||||
//
|
||||
// Copyright (C) 2009-2014 the OpenProject Foundation (OPF)
|
||||
//
|
||||
// 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-2013 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 doc/COPYRIGHT.rdoc for more details.
|
||||
// ++
|
||||
|
||||
// This resource exists solely for the purpose of uploading attachments via the
|
||||
// WYSIWYIG editor.
|
||||
import {HalResource} from 'core-app/modules/hal/resources/hal-resource'; |
||||
import {Attachable} from 'core-app/modules/hal/resources/mixins/attachable-mixin'; |
||||
|
||||
export interface DocumentResourceLinks { |
||||
addAttachment(attachment:HalResource):Promise<any>; |
||||
} |
||||
|
||||
class DocumentBaseResource extends HalResource { |
||||
public $links:DocumentResourceLinks; |
||||
|
||||
private attachmentsBackend = false; |
||||
} |
||||
|
||||
export const DocumentResource = Attachable(DocumentBaseResource); |
||||
|
||||
export interface DocumentResource extends DocumentBaseResource { |
||||
} |
@ -0,0 +1,57 @@ |
||||
// -- copyright
|
||||
// OpenProject Documents Plugin
|
||||
//
|
||||
// Former OpenProject Core functionality extracted into a plugin.
|
||||
//
|
||||
// Copyright (C) 2009-2014 the OpenProject Foundation (OPF)
|
||||
//
|
||||
// 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-2013 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 doc/COPYRIGHT.rdoc for more details.
|
||||
// ++
|
||||
|
||||
import {APP_INITIALIZER, Injector, NgModule} from '@angular/core'; |
||||
import {OpenProjectPluginContext} from "core-app/modules/plugins/plugin-context"; |
||||
import {DocumentResource} from './hal/resources/document-resource'; |
||||
import {multiInput} from 'reactivestates'; |
||||
|
||||
export function initializeDocumentPlugin() { |
||||
return () => { |
||||
window.OpenProject.getPluginContext() |
||||
.then((pluginContext:OpenProjectPluginContext) => { |
||||
let halResourceService = pluginContext.services.halResource; |
||||
halResourceService.registerResource('Document', { cls: DocumentResource }); |
||||
|
||||
let states = pluginContext.services.states; |
||||
states.add('documents', multiInput<DocumentResource>()); |
||||
}); |
||||
}; |
||||
} |
||||
|
||||
|
||||
@NgModule({ |
||||
providers: [ |
||||
{ provide: APP_INITIALIZER, useFactory: initializeDocumentPlugin, deps: [Injector], multi: true }, |
||||
], |
||||
}) |
||||
export class PluginModule { |
||||
} |
@ -0,0 +1,52 @@ |
||||
#-- copyright |
||||
# OpenProject is a project management system. |
||||
# Copyright (C) 2012-2018 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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 API |
||||
module V3 |
||||
module Attachments |
||||
class AttachmentsByDocumentAPI < ::API::OpenProjectAPI |
||||
resources :attachments do |
||||
helpers API::V3::Attachments::AttachmentsByContainerAPI::Helpers |
||||
|
||||
helpers do |
||||
def container |
||||
document |
||||
end |
||||
|
||||
def get_attachment_self_path |
||||
api_v3_paths.attachments_by_document(container.id) |
||||
end |
||||
end |
||||
|
||||
get &API::V3::Attachments::AttachmentsByContainerAPI.read |
||||
post &API::V3::Attachments::AttachmentsByContainerAPI.create |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,60 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
module API |
||||
module V3 |
||||
module Documents |
||||
class DocumentRepresenter < ::API::Decorators::Single |
||||
include API::Decorators::LinkedResource |
||||
include API::Caching::CachedRepresenter |
||||
include ::API::V3::Attachments::AttachableRepresenterMixin |
||||
|
||||
self_link title_getter: ->(*) { represented.title } |
||||
|
||||
property :id |
||||
|
||||
property :title |
||||
|
||||
associated_resource :project, |
||||
link: ->(*) do |
||||
{ |
||||
href: api_v3_paths.project(represented.project.id), |
||||
title: represented.project.name |
||||
} |
||||
end |
||||
|
||||
def _type |
||||
'Document' |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,56 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
module API |
||||
module V3 |
||||
module Documents |
||||
class DocumentsAPI < ::API::OpenProjectAPI |
||||
resources :documents do |
||||
helpers do |
||||
def document |
||||
Document.visible.find(params[:id]) |
||||
end |
||||
end |
||||
|
||||
route_param :id do |
||||
get do |
||||
::API::V3::Documents::DocumentRepresenter.new(document, |
||||
current_user: current_user, |
||||
embed_links: true) |
||||
end |
||||
|
||||
mount ::API::V3::Attachments::AttachmentsByDocumentAPI |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,36 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
module OpenProject |
||||
module Documents |
||||
require "open_project/documents/engine" |
||||
end |
||||
end |
@ -0,0 +1,104 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
module OpenProject::Documents |
||||
class Engine < ::Rails::Engine |
||||
engine_name :openproject_documents |
||||
|
||||
include OpenProject::Plugins::ActsAsOpEngine |
||||
|
||||
register 'openproject-documents', |
||||
author_url: "http://www.openproject.com", |
||||
global_assets: { css: 'documents/global_rules' }, |
||||
requires_openproject: ">= 4.0.0" do |
||||
|
||||
menu :project_menu, :documents, |
||||
{ controller: '/documents', action: 'index' }, |
||||
param: :project_id, |
||||
caption: :label_document_plural, |
||||
icon: 'icon2 icon-notes' |
||||
|
||||
project_module :documents do |_map| |
||||
permission :manage_documents, { |
||||
documents: [:new, :create, :edit, :update, :destroy, :add_attachment] |
||||
}, require: :loggedin |
||||
permission :view_documents, documents: [:index, :show, :download] |
||||
end |
||||
|
||||
Redmine::Notifiable.all << Redmine::Notifiable.new('document_added') |
||||
|
||||
Redmine::Activity.map do |activity| |
||||
activity.register :documents, class_name: 'Activity::DocumentActivityProvider', default: false |
||||
end |
||||
|
||||
Redmine::Search.register :documents |
||||
end |
||||
|
||||
patches [:CustomFieldsHelper, :Project] |
||||
|
||||
add_api_path :document do |id| |
||||
"#{root}/documents/#{id}" |
||||
end |
||||
|
||||
add_api_path :attachments_by_document do |id| |
||||
"#{document(id)}/attachments" |
||||
end |
||||
|
||||
add_api_endpoint 'API::V3::Root' do |
||||
mount ::API::V3::Documents::DocumentsAPI |
||||
end |
||||
|
||||
assets %w(documents/documents.css) |
||||
|
||||
# Add documents to allowed search params |
||||
additional_permitted_attributes search: %i(documents) |
||||
|
||||
initializer "documents.register_hooks" do |
||||
require 'open_project/documents/hooks' |
||||
end |
||||
|
||||
config.to_prepare do |
||||
require_dependency 'document' |
||||
require_dependency 'document_category' |
||||
require_dependency 'document_category_custom_field' |
||||
|
||||
# Have to apply this one by hand and not via op_engine patches method |
||||
# becauses the op_engine method does not allow for patching something |
||||
# in the lib/open_project directory. Bummer. |
||||
require_relative 'patches/text_formatting_patch' |
||||
require_dependency 'open_project/documents/patches/text_formatting_patch' |
||||
::OpenProject::Documents::Patches::ColonSeparatorPatch.mixin! |
||||
::OpenProject::Documents::Patches::HashSeparatorPatch.mixin! |
||||
|
||||
require_dependency 'open_project/documents/patches/textile_converter_patch' |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,37 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
module OpenProject::Documents |
||||
class Hooks < Redmine::Hook::ViewListener |
||||
render_on :activity_index_head, |
||||
partial: 'hooks/documents/activity_index_head' |
||||
end |
||||
end |
@ -0,0 +1,35 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
module OpenProject::Documents |
||||
module Patches |
||||
end |
||||
end |
@ -0,0 +1,52 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
module OpenProject::Documents::Patches |
||||
module CustomFieldsHelperPatch |
||||
def self.included(base) |
||||
base.prepend InstanceMethods |
||||
end |
||||
|
||||
module InstanceMethods |
||||
def custom_fields_tabs |
||||
super << { |
||||
name: 'DocumentCategoryCustomField', |
||||
partial: 'custom_fields/tab', |
||||
label: DocumentCategory::OptionName |
||||
} |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|
||||
unless CustomFieldsHelper.included_modules.include?(OpenProject::Documents::Patches::CustomFieldsHelperPatch) |
||||
CustomFieldsHelper.send(:include, OpenProject::Documents::Patches::CustomFieldsHelperPatch) |
||||
end |
@ -0,0 +1,43 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
module OpenProject::Documents::Patches |
||||
module ProjectPatch |
||||
def self.included(base) |
||||
base.class_eval do |
||||
|
||||
has_many :documents, dependent: :destroy |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|
||||
Project.send(:include, OpenProject::Documents::Patches::ProjectPatch) |
@ -0,0 +1,87 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
module OpenProject::Documents::Patches |
||||
module HashSeparatorPatch |
||||
def self.mixin! |
||||
base = ::OpenProject::TextFormatting::Matchers::LinkHandlers::HashSeparator |
||||
base.prepend InstanceMethods |
||||
base.singleton_class.prepend ClassMethods |
||||
end |
||||
|
||||
module InstanceMethods |
||||
def render_document |
||||
if document = Document.visible.find_by_id(oid) |
||||
link_to document.title, |
||||
{ only_path: context[:only_path], |
||||
controller: '/documents', |
||||
action: 'show', |
||||
id: document }, |
||||
class: 'document' |
||||
end |
||||
end |
||||
end |
||||
|
||||
module ClassMethods |
||||
def allowed_prefixes |
||||
super + %w[document] |
||||
end |
||||
end |
||||
end |
||||
|
||||
module ColonSeparatorPatch |
||||
def self.mixin! |
||||
base = ::OpenProject::TextFormatting::Matchers::LinkHandlers::ColonSeparator |
||||
base.prepend InstanceMethods |
||||
base.singleton_class.prepend ClassMethods |
||||
end |
||||
|
||||
module InstanceMethods |
||||
def render_document |
||||
name = identifier.gsub(%r{^"(.*)"$}, "\\1") |
||||
if document = project.documents.visible.find_by_title(name) |
||||
link_to document.title, |
||||
{ only_path: context[:only_path], |
||||
controller: '/documents', |
||||
action: 'show', |
||||
id: document }, |
||||
class: 'document' |
||||
end |
||||
end |
||||
end |
||||
|
||||
module ClassMethods |
||||
def allowed_prefixes |
||||
super + %w[document] |
||||
end |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,42 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#+ |
||||
|
||||
module OpenProject::Documents::Patches |
||||
module TextileConverterPatch |
||||
def models_to_convert |
||||
super.merge(::Document => [:description]) |
||||
end |
||||
end |
||||
end |
||||
|
||||
::OpenProject::TextFormatting::Formats::Markdown::TextileConverter.prepend( |
||||
::OpenProject::Documents::Patches::TextileConverterPatch |
||||
) |
@ -0,0 +1,36 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
module OpenProject |
||||
module Documents |
||||
VERSION = "8.2.0" |
||||
end |
||||
end |
@ -0,0 +1,32 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
require 'open_project/documents' |
@ -0,0 +1,18 @@ |
||||
# encoding: UTF-8 |
||||
$:.push File.expand_path("../lib", __FILE__) |
||||
|
||||
require 'open_project/documents/version' |
||||
# Describe your gem and declare its dependencies: |
||||
Gem::Specification.new do |s| |
||||
s.name = "openproject-documents" |
||||
s.version = OpenProject::Documents::VERSION |
||||
s.authors = "OpenProject GmbH" |
||||
s.email = "info@openproject.com" |
||||
s.homepage = "https://community.openproject.org/projects/documents" |
||||
s.summary = "OpenProject Documents" |
||||
s.description = "An OpenProject plugin to allow creation of documents in projects" |
||||
s.license = "GPLv3" |
||||
|
||||
s.files = Dir["{app,config,db,lib,doc}/**/*", "README.md"] |
||||
s.test_files = Dir["spec/**/*"] |
||||
end |
@ -0,0 +1,108 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
require 'spec_helper' |
||||
|
||||
describe ::API::V3::Documents::DocumentRepresenter, 'rendering' do |
||||
include ::API::V3::Utilities::PathHelper |
||||
|
||||
let(:document) do |
||||
FactoryBot.build_stubbed(:document) do |wp| |
||||
allow(wp) |
||||
.to receive(:project) |
||||
.and_return(project) |
||||
end |
||||
end |
||||
let(:project) { FactoryBot.build_stubbed(:project) } |
||||
let(:user) { FactoryBot.build_stubbed(:user) } |
||||
let(:representer) do |
||||
described_class.create(document, current_user: user, embed_links: true) |
||||
end |
||||
let(:permissions) { all_permissions } |
||||
let(:all_permissions) { %i(manage_documents) } |
||||
|
||||
subject { representer.to_json } |
||||
|
||||
before do |
||||
allow(user) |
||||
.to receive(:allowed_to?) do |permission, project| |
||||
permissions.include?(permission) |
||||
end |
||||
end |
||||
|
||||
describe '_links' do |
||||
it_behaves_like 'has a titled link' do |
||||
let(:link) { 'self' } |
||||
let(:href) { api_v3_paths.document document.id } |
||||
let(:title) { document.title } |
||||
end |
||||
|
||||
it_behaves_like 'has an untitled link' do |
||||
let(:link) { :attachments } |
||||
let(:href) { api_v3_paths.attachments_by_document document.id } |
||||
end |
||||
|
||||
it_behaves_like 'has a titled link' do |
||||
let(:link) { :project } |
||||
let(:title) { project.name } |
||||
let(:href) { api_v3_paths.project project.id } |
||||
end |
||||
|
||||
it_behaves_like 'has an untitled action link' do |
||||
let(:link) { :addAttachment } |
||||
let(:href) { api_v3_paths.attachments_by_document document.id } |
||||
let(:method) { :post } |
||||
let(:permission) { :manage_documents } |
||||
end |
||||
end |
||||
|
||||
describe 'properties' do |
||||
it_behaves_like 'property', :_type do |
||||
let(:value) { 'Document' } |
||||
end |
||||
|
||||
it_behaves_like 'property', :id do |
||||
let(:value) { document.id } |
||||
end |
||||
|
||||
it_behaves_like 'property', :title do |
||||
let(:value) { document.title } |
||||
end |
||||
end |
||||
|
||||
describe '_embedded' do |
||||
it 'has project embedded' do |
||||
expect(subject) |
||||
.to be_json_eql(project.name.to_json) |
||||
.at_path('_embedded/project/name') |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,128 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
require 'spec_helper' |
||||
|
||||
describe ApplicationHelper do |
||||
include ApplicationHelper |
||||
include ActionView::Helpers |
||||
include ActionDispatch::Routing |
||||
include Rails.application.routes.url_helpers |
||||
|
||||
|
||||
describe ".format_text" do |
||||
let(:project) { FactoryBot.create :valid_project } |
||||
let(:identifier) { project.identifier } |
||||
let(:role) { |
||||
FactoryBot.create(:role, permissions: [ |
||||
:view_work_packages, :edit_work_packages, :view_documents, :browse_repository, :view_changesets, :view_wiki_pages |
||||
]) |
||||
} |
||||
let(:project_member) { |
||||
FactoryBot.create :user, member_in_project: project, |
||||
member_through_role: role |
||||
} |
||||
let(:document) { |
||||
FactoryBot.create :document, |
||||
title: 'Test document', |
||||
project: project |
||||
} |
||||
|
||||
before do |
||||
@project = project |
||||
allow(User).to receive(:current).and_return project_member |
||||
end |
||||
|
||||
after do |
||||
allow(User).to receive(:current).and_call_original |
||||
end |
||||
|
||||
context "Simple Document links" do |
||||
let(:document_link) { |
||||
link_to('Test document', |
||||
{ controller: 'documents', action: 'show', id: document.id }, |
||||
class: 'document') |
||||
} |
||||
|
||||
context "Plain link" do |
||||
subject { format_text("document##{document.id}") } |
||||
|
||||
it { is_expected.to eq("<p>#{document_link}</p>") } |
||||
end |
||||
|
||||
context "Link with document name" do |
||||
subject { format_text("document##{document.id}") } |
||||
|
||||
it { is_expected.to eq("<p>#{document_link}</p>") } |
||||
end |
||||
|
||||
context "Escaping plain link" do |
||||
subject { format_text("!document##{document.id}") } |
||||
|
||||
it { is_expected.to eq("<p>document##{document.id}</p>") } |
||||
end |
||||
|
||||
context "Escaping link with document name" do |
||||
subject { format_text('!document:"Test document"') } |
||||
|
||||
it { is_expected.to eq('<p>document:"Test document"</p>') } |
||||
end |
||||
end |
||||
|
||||
context 'Cross-Project Document Links' do |
||||
let(:the_other_project) { FactoryBot.create :valid_project } |
||||
|
||||
context "By name without project" do |
||||
subject { format_text("document:\"#{document.title}\"", project: the_other_project) } |
||||
|
||||
it { is_expected.to eq('<p>document:"Test document"</p>') } |
||||
end |
||||
|
||||
context "By id and given project" do |
||||
subject { format_text("#{identifier}:document##{document.id}", project: the_other_project) } |
||||
|
||||
it { is_expected.to eq("<p><a class=\"document\" href=\"/documents/#{document.id}\">Test document</a></p>") } |
||||
end |
||||
|
||||
context "By name and given project" do |
||||
subject { format_text("#{identifier}:document:\"#{document.title}\"", project: the_other_project) } |
||||
|
||||
it { is_expected.to eq("<p><a class=\"document\" href=\"/documents/#{document.id}\">Test document</a></p>") } |
||||
end |
||||
|
||||
context "Invalid link" do |
||||
subject { format_text("invalid:document:\"Test document\"", project: the_other_project) } |
||||
|
||||
it { is_expected.to eq('<p>invalid:document:"Test document"</p>') } |
||||
end |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,2 @@ |
||||
this is a text file for upload tests |
||||
with multiple lines |
@ -0,0 +1,226 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
require File.dirname(__FILE__) + '/../spec_helper' |
||||
|
||||
describe DocumentsController do |
||||
|
||||
render_views |
||||
|
||||
let(:admin) { FactoryBot.create(:admin)} |
||||
let(:project) { FactoryBot.create(:project, name: "Test Project")} |
||||
let(:user) { FactoryBot.create(:user)} |
||||
let(:role) { FactoryBot.create(:role, permissions: [:view_documents]) } |
||||
|
||||
let(:default_category){ |
||||
FactoryBot.create(:document_category, project: project, name: "Default Category") |
||||
} |
||||
|
||||
let(:document) { |
||||
FactoryBot.create(:document, title: "Sample Document", project: project, category: default_category) |
||||
} |
||||
|
||||
before do |
||||
allow(User).to receive(:current).and_return admin |
||||
end |
||||
|
||||
describe "index" do |
||||
let(:long_description) { |
||||
<<-LOREM.strip_heredoc |
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit.\ |
||||
Ut egestas, mi vehicula varius varius, ipsum massa fermentum orci,\ |
||||
eget tristique ante sem vel mi. Nulla facilisi.\ |
||||
Donec enim libero, luctus ac sagittis sit amet, vehicula sagittis magna.\ |
||||
Duis ultrices molestie ante, eget scelerisque sem iaculis vitae.\ |
||||
Etiam fermentum mauris vitae metus pharetra condimentum fermentum est pretium.\ |
||||
Proin sollicitudin elementum quam quis pharetra.\ |
||||
Aenean facilisis nunc quis elit volutpat mollis.\ |
||||
Aenean eleifend varius euismod. Ut dolor est, congue eget dapibus eget, elementum eu odio.\ |
||||
Integer et lectus neque, nec scelerisque nisi. EndOfLineHere |
||||
|
||||
Praesent a nunc lorem, ac porttitor eros. |
||||
LOREM |
||||
} |
||||
|
||||
before do |
||||
document.update_attributes(description: long_description) |
||||
get :index, params: { project_id: project.identifier } |
||||
end |
||||
|
||||
it "should render the index-template successfully" do |
||||
expect(response).to be_success |
||||
expect(response).to render_template("index") |
||||
end |
||||
|
||||
it "should group documents by category, if no other sorting is given " do |
||||
expect(assigns(:grouped)).not_to be_nil |
||||
expect(assigns(:grouped).keys.map(&:name)).to eql [default_category.name] |
||||
end |
||||
|
||||
it "should render documents with long descriptions properly" do |
||||
|
||||
expect(response.body).to have_css('.wiki p') |
||||
expect(response.body).to have_css('.wiki p', text: (document.description.split("\n").first + '...')) |
||||
expect(response.body).to have_css('.wiki p', text: /EndOfLineHere.../) |
||||
end |
||||
|
||||
end |
||||
|
||||
describe 'new' do |
||||
before do |
||||
get :new, params: { project_id: project.id } |
||||
end |
||||
|
||||
it 'show the new document form' do |
||||
expect(response).to render_template(partial: 'documents/_form') |
||||
end |
||||
end |
||||
|
||||
describe "create" do |
||||
|
||||
let(:document_attributes) { |
||||
FactoryBot.attributes_for(:document, title: "New Document", |
||||
project_id: project.id, |
||||
category_id: default_category.id) |
||||
} |
||||
|
||||
|
||||
before do |
||||
ActionMailer::Base.deliveries.clear |
||||
allow(Setting).to receive(:notified_events).and_return(Setting.notified_events.dup << 'document_added') |
||||
end |
||||
|
||||
it "should create a new document with valid arguments" do |
||||
expect do |
||||
post :create, params: { project_id: project.identifier, |
||||
document: FactoryBot.attributes_for(:document, title: "New Document", |
||||
project_id: project.id, |
||||
category_id: default_category.id |
||||
) } |
||||
|
||||
end.to change{Document.count}.by 1 |
||||
end |
||||
|
||||
it "should create a new document with valid arguments" do |
||||
expect do |
||||
post :create, |
||||
params: { |
||||
project_id: project.identifier, |
||||
document: document_attributes |
||||
} |
||||
end.to change{Document.count}.by 1 |
||||
end |
||||
|
||||
describe "with attachments" do |
||||
|
||||
before do |
||||
notify_project = project |
||||
FactoryBot.create(:member, project: notify_project, user: user, roles: [role]) |
||||
|
||||
post :create, |
||||
params: { |
||||
project_id: notify_project.identifier, |
||||
document: FactoryBot.attributes_for(:document, title: "New Document", |
||||
project_id: notify_project.id, |
||||
category_id: default_category.id |
||||
), |
||||
attachments: { '1' => { description: "sample file", file: file_attachment } } |
||||
} |
||||
end |
||||
|
||||
it "should add an attachment" do |
||||
document = Document.last |
||||
|
||||
expect(document.attachments.count).to eql 1 |
||||
attachment = document.attachments.first |
||||
expect(attachment.description).to eql "sample file" |
||||
expect(attachment.filename).to eql "testfile.txt" |
||||
end |
||||
|
||||
it "should redirect to the documents-page" do |
||||
expect(response).to redirect_to project_documents_path(project.identifier) |
||||
end |
||||
|
||||
it "should send out mails with notifications to members of the project with :view_documents-permission" do |
||||
expect(ActionMailer::Base.deliveries.size).to eql 1 |
||||
end |
||||
end |
||||
end |
||||
|
||||
describe 'show' do |
||||
before do |
||||
document |
||||
get :show, params: { id: document.id } |
||||
end |
||||
|
||||
it "should delete the document and redirect back to documents-page of the project" do |
||||
expect(response).to be_success |
||||
expect(response).to render_template('show') |
||||
end |
||||
end |
||||
|
||||
describe '#add_attachment' do |
||||
before do |
||||
document |
||||
post :add_attachment, |
||||
params: { |
||||
id: document.id, |
||||
attachments: { '1' => { description: "sample file", file: file_attachment } } |
||||
} |
||||
end |
||||
|
||||
it "should delete the document and redirect back to documents-page of the project" do |
||||
expect(response).to be_redirect |
||||
document.reload |
||||
expect(document.attachments.length).to eq(1) |
||||
end |
||||
end |
||||
|
||||
describe "destroy" do |
||||
before do |
||||
document |
||||
end |
||||
|
||||
it "should delete the document and redirect back to documents-page of the project" do |
||||
expect{ |
||||
delete :destroy, params: { id: document.id } |
||||
}.to change{Document.count}.by -1 |
||||
|
||||
expect(response).to redirect_to "/projects/#{project.identifier}/documents" |
||||
expect{Document.find(document.id)}.to raise_error ActiveRecord::RecordNotFound |
||||
end |
||||
end |
||||
|
||||
def file_attachment |
||||
test_document = "#{OpenProject::Documents::Engine.root}/spec/assets/attachments/testfile.txt" |
||||
Rack::Test::UploadedFile.new(test_document, "text/plain") |
||||
end |
||||
end |
@ -0,0 +1,37 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
FactoryBot.define do |
||||
factory :document_category do |
||||
project |
||||
sequence(:name) { |n| "I am Category No. #{n}" } |
||||
end |
||||
end |
@ -0,0 +1,39 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
FactoryBot.define do |
||||
factory :document do |
||||
project |
||||
category factory: :document_category |
||||
sequence(:description) { |n| "I am a document's description No. #{n}" } |
||||
sequence(:title) { |n| "I am the document No. #{n}" } |
||||
end |
||||
end |
@ -0,0 +1,90 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
require 'spec_helper' |
||||
require 'features/page_objects/notification' |
||||
|
||||
describe 'Upload attachment to documents', js: true do |
||||
let!(:user) do |
||||
FactoryBot.create :user, |
||||
member_in_project: project, |
||||
member_with_permissions: %i[view_documents |
||||
manage_documents] |
||||
end |
||||
let!(:category) do |
||||
FactoryBot.create(:document_category) |
||||
end |
||||
let(:project) { FactoryBot.create(:project) } |
||||
let(:attachments) { ::Components::Attachments.new } |
||||
let(:image_fixture) { Rails.root.join('spec/fixtures/files/image.png') } |
||||
let(:editor) { ::Components::WysiwygEditor.new } |
||||
|
||||
before do |
||||
login_as(user) |
||||
end |
||||
|
||||
it 'can upload an image' do |
||||
visit project_documents_path(project) |
||||
|
||||
within '.toolbar-items' do |
||||
click_on 'Document' |
||||
end |
||||
|
||||
select(category.name, from: 'Category') |
||||
fill_in "Title", with: 'New documentation' |
||||
|
||||
# adding an image |
||||
editor.drag_attachment image_fixture, 'Image uploaded on creation' |
||||
|
||||
expect(page).to have_selector('attachment-list-item', text: 'image.png') |
||||
|
||||
click_on 'Create' |
||||
|
||||
expect(page).to have_selector('#content img', count: 1) |
||||
expect(page).to have_content('Image uploaded on creation') |
||||
|
||||
click_on 'New documentation' |
||||
|
||||
within '.toolbar-items' do |
||||
click_on 'Edit' |
||||
end |
||||
|
||||
editor.drag_attachment image_fixture, 'Image uploaded the second time' |
||||
expect(page).to have_selector('attachment-list-item', text: 'image.png', count: 2) |
||||
|
||||
click_on 'Save' |
||||
|
||||
expect(page).to have_selector('#content img', count: 2) |
||||
expect(page).to have_content('Image uploaded on creation') |
||||
expect(page).to have_content('Image uploaded the second time') |
||||
expect(page).to have_selector('attachment-list-item', text: 'image.png', count: 2) |
||||
end |
||||
end |
@ -0,0 +1,72 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
require_relative '../spec_helper' |
||||
|
||||
describe 'Documents widget', type: :feature, js: true do |
||||
let(:project) { FactoryBot.create(:project) } |
||||
let(:user) do |
||||
FactoryBot.create(:user, |
||||
member_in_project: project, |
||||
member_through_role: role) |
||||
end |
||||
let(:role) { FactoryBot.create(:role, permissions: [:edit_project]) } |
||||
|
||||
before do |
||||
allow(User) |
||||
.to receive(:current) |
||||
.and_return(user) |
||||
end |
||||
|
||||
if Redmine::Plugin.registered_plugins[:openproject_my_project_page] |
||||
it 'has a "Document" widget on the my project page' do |
||||
visit my_projects_overview_path project |
||||
|
||||
select 'Documents', from: 'block-select' |
||||
|
||||
within '#list-hidden' do |
||||
expect(page).to have_content('Documents') |
||||
end |
||||
|
||||
expect(page.find('#block-select option', text: 'Documents')['disabled']).to eql 'true' |
||||
end |
||||
end |
||||
|
||||
it 'has a "Document" widget on the my page' do |
||||
visit my_page_layout_path |
||||
|
||||
select 'Documents', from: 'block-options' |
||||
click_button 'Add' |
||||
|
||||
expect(page).to have_selector('.widget-box--header-title', text: 'Documents', wait: 10) |
||||
expect(page.find('#block-options option', text: 'Documents')['disabled']).to eql 'true' |
||||
end |
||||
end |
@ -0,0 +1,50 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
require 'spec_helper' |
||||
|
||||
describe "Journalized Objects" do |
||||
before(:each) do |
||||
@type ||= FactoryBot.create(:type_feature) |
||||
@project ||= FactoryBot.create(:project_with_types) |
||||
@current = FactoryBot.create(:user, login: "user1", mail: "user1@users.com") |
||||
allow(User).to receive(:current).and_return @current |
||||
end |
||||
|
||||
it 'should work with documents' do |
||||
@document ||= FactoryBot.create(:document) |
||||
|
||||
initial_journal = @document.journals.first |
||||
recreated_journal = @document.recreate_initial_journal! |
||||
|
||||
expect(initial_journal).to be_identical(recreated_journal) |
||||
end |
||||
end |
@ -0,0 +1,51 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
require File.dirname(__FILE__) + '/../../spec_helper' |
||||
|
||||
describe Redmine::AccessControl do |
||||
|
||||
describe 'manage documents permission' do |
||||
it 'should be part of the documents project module' do |
||||
permission = Redmine::AccessControl.permission(:manage_documents) |
||||
|
||||
expect(permission.project_module).to eql(:documents) |
||||
end |
||||
end |
||||
|
||||
describe 'view documents permission' do |
||||
it 'should be part of the documents project module' do |
||||
permission = Redmine::AccessControl.permission(:view_documents) |
||||
|
||||
expect(permission.project_module).to eql(:documents) |
||||
end |
||||
end |
||||
|
||||
end |
@ -0,0 +1,64 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
require File.dirname(__FILE__) + '/../spec_helper' |
||||
|
||||
describe DocumentsMailer do |
||||
|
||||
let(:user) { |
||||
FactoryBot.create(:user, firstname: 'Test', lastname: "User", mail: 'test@test.com') |
||||
} |
||||
let(:project) { FactoryBot.create(:project, name: "TestProject") } |
||||
let(:document) { |
||||
FactoryBot.create(:document, project: project, description: "Test Description", title: "Test Title" ) |
||||
} |
||||
let(:mail) { DocumentsMailer.document_added(user, document) } |
||||
|
||||
describe "document added-mail" do |
||||
it "renders the subject" do |
||||
expect(mail.subject).to eql '[TestProject] New document: Test Title' |
||||
end |
||||
|
||||
it "should render the receivers mail" do |
||||
expect(mail.to.count).to eql 1 |
||||
expect(mail.to.first).to eql user.mail |
||||
end |
||||
|
||||
it "should render the document-info into the body" do |
||||
expect(mail.body.encoded).to match(document.description) |
||||
expect(mail.body.encoded).to match(document.title) |
||||
end |
||||
|
||||
end |
||||
|
||||
|
||||
|
||||
|
||||
end |
@ -0,0 +1,68 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
require File.dirname(__FILE__) + '/../spec_helper' |
||||
|
||||
|
||||
describe DocumentCategory do |
||||
|
||||
let(:project) {FactoryBot.create(:project)} |
||||
|
||||
it "should be an enumeration" do |
||||
expect(DocumentCategory.ancestors).to include Enumeration |
||||
end |
||||
|
||||
it "should order documents by the category they are created with" do |
||||
uncategorized = FactoryBot.create :document_category, name: "Uncategorized", project: project |
||||
user_documentation = FactoryBot.create :document_category, name: "User documentation" |
||||
|
||||
FactoryBot.create_list :document, 2, category: uncategorized, project: project |
||||
|
||||
expect(DocumentCategory.find_by_name(uncategorized.name).objects_count).to eql 2 |
||||
expect(DocumentCategory.find_by_name(user_documentation.name).objects_count).to eql 0 |
||||
|
||||
end |
||||
|
||||
it "should file the categorizations under the option name :enumeration_doc_categories" do |
||||
expect(DocumentCategory.new.option_name).to eql :enumeration_doc_categories |
||||
end |
||||
|
||||
it "should only allow one category to be the default-category" do |
||||
old_default = FactoryBot.create :document_category, name: "old default", project: project, is_default: true |
||||
|
||||
expect{ |
||||
FactoryBot.create :document_category, name: "new default", project: project, is_default: true |
||||
old_default.reload |
||||
}.to change{old_default.is_default?}.from(true).to(false) |
||||
|
||||
|
||||
end |
||||
|
||||
end |
@ -0,0 +1,128 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
require File.dirname(__FILE__) + '/../spec_helper' |
||||
|
||||
|
||||
describe Document do |
||||
|
||||
let(:documentation_category) { FactoryBot.create :document_category, name: 'User documentation'} |
||||
let(:project) { FactoryBot.create :project} |
||||
let(:user) { FactoryBot.create(:user)} |
||||
let(:admin) { FactoryBot.create(:admin)} |
||||
|
||||
let(:mail) do |
||||
mock = Object.new |
||||
allow(mock).to receive(:deliver_now) |
||||
mock |
||||
end |
||||
|
||||
context "validation" do |
||||
|
||||
it { is_expected.to validate_presence_of :project} |
||||
it { is_expected.to validate_presence_of :title} |
||||
it { is_expected.to validate_presence_of :category} |
||||
|
||||
end |
||||
|
||||
describe "create with a valid document" do |
||||
let(:valid_document) {Document.new(title: "Test", project: project, category: documentation_category)} |
||||
|
||||
it "should add a document" do |
||||
expect{ |
||||
valid_document.save |
||||
}.to change{Document.count}.by 1 |
||||
end |
||||
|
||||
it "should send out email-notifications" do |
||||
allow(valid_document).to receive(:recipients).and_return([user]) |
||||
Setting.notified_events = Setting.notified_events << 'document_added' |
||||
|
||||
expect{ |
||||
valid_document.save |
||||
}.to change{ActionMailer::Base.deliveries.size}.by 1 |
||||
end |
||||
|
||||
it "should send notifications to the recipients of the project" do |
||||
allow(project).to receive(:notified_users).and_return([admin]) |
||||
document = FactoryBot.create(:document, project: project) |
||||
|
||||
expect(document.recipients).not_to be_empty |
||||
expect(document.recipients.count).to eql 1 |
||||
expect(document.recipients.map(&:mail)).to include admin.mail |
||||
end |
||||
|
||||
it "should set a default-category, if none is given" do |
||||
default_category = FactoryBot.create :document_category, name: 'Technical documentation', is_default: true |
||||
document = Document.new(project: project, title: "New Document") |
||||
expect(document.category).to eql default_category |
||||
expect{ |
||||
document.save |
||||
}.to change{Document.count}.by 1 |
||||
end |
||||
|
||||
it "with attachments should change the updated_on-date on the document to the attachment's date" do |
||||
3.times do |
||||
FactoryBot.create(:attachment, container: valid_document) |
||||
end |
||||
|
||||
valid_document.reload |
||||
expect(valid_document.attachments.size).to eql 3 |
||||
expect(valid_document.attachments.map(&:created_at).max).to eql valid_document.updated_on |
||||
end |
||||
|
||||
it "without attachments, the updated-on-date is taken from the document's date" do |
||||
document = FactoryBot.create(:document, project: project) |
||||
expect(document.attachments).to be_empty |
||||
expect(document.created_on).to eql document.updated_on |
||||
end |
||||
end |
||||
|
||||
describe "acts as event" do |
||||
let(:now) { Time.zone.now } |
||||
let(:document) { |
||||
FactoryBot.build(:document, |
||||
created_on: now) |
||||
} |
||||
|
||||
it { expect(document.event_datetime.to_i).to eq(now.to_i) } |
||||
end |
||||
|
||||
it "calls the DocumentsMailer, when a new document has been added" do |
||||
document = FactoryBot.build(:document) |
||||
# make sure, that we have actually someone to notify |
||||
allow(document).to receive(:recipients).and_return([user]) |
||||
# ... and notifies are actually sent out |
||||
Setting.notified_events = Setting.notified_events << 'document_added' |
||||
expect(DocumentsMailer).to receive(:document_added).and_return(mail) |
||||
|
||||
document.save |
||||
end |
||||
end |
@ -0,0 +1,142 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
require 'spec_helper' |
||||
require 'rack/test' |
||||
|
||||
describe 'API v3 Attachments by document resource', type: :request do |
||||
include Rack::Test::Methods |
||||
include API::V3::Utilities::PathHelper |
||||
include FileHelpers |
||||
|
||||
let(:current_user) do |
||||
FactoryBot.create(:user, |
||||
member_in_project: project, |
||||
member_through_role: role) |
||||
end |
||||
let(:project) { FactoryBot.create(:project) } |
||||
let(:role) { FactoryBot.create(:role, permissions: permissions) } |
||||
let(:permissions) { [:view_documents] } |
||||
let(:document) { FactoryBot.create(:document, project: project) } |
||||
|
||||
subject(:response) { last_response } |
||||
|
||||
before do |
||||
allow(User).to receive(:current).and_return current_user |
||||
end |
||||
|
||||
describe '#get' do |
||||
let(:get_path) { api_v3_paths.attachments_by_document document.id } |
||||
|
||||
before do |
||||
FactoryBot.create_list(:attachment, 2, container: document) |
||||
get get_path |
||||
end |
||||
|
||||
it 'should respond with 200' do |
||||
expect(subject.status).to eq(200) |
||||
end |
||||
|
||||
it_behaves_like 'API V3 collection response', 2, 2, 'Attachment' |
||||
end |
||||
|
||||
describe '#post' do |
||||
let(:permissions) { %i[view_documents manage_documents] } |
||||
|
||||
let(:request_path) { api_v3_paths.attachments_by_document document.id } |
||||
let(:request_parts) { { metadata: metadata, file: file } } |
||||
let(:metadata) { { fileName: 'cat.png' }.to_json } |
||||
let(:file) { mock_uploaded_file(name: 'original-filename.txt') } |
||||
let(:max_file_size) { 1 } # given in kiB |
||||
|
||||
before do |
||||
allow(Setting).to receive(:attachment_max_size).and_return max_file_size.to_s |
||||
post request_path, request_parts |
||||
end |
||||
|
||||
it 'should respond with HTTP Created' do |
||||
expect(subject.status).to eq(201) |
||||
end |
||||
|
||||
it 'should return the new attachment' do |
||||
expect(subject.body).to be_json_eql('Attachment'.to_json).at_path('_type') |
||||
end |
||||
|
||||
it 'ignores the original file name' do |
||||
expect(subject.body).to be_json_eql('cat.png'.to_json).at_path('fileName') |
||||
end |
||||
|
||||
context 'metadata section is missing' do |
||||
let(:request_parts) { { file: file } } |
||||
|
||||
it_behaves_like 'invalid request body', I18n.t('api_v3.errors.multipart_body_error') |
||||
end |
||||
|
||||
context 'file section is missing' do |
||||
# rack-test won't send a multipart request without a file being present |
||||
# however as long as we depend on correctly named sections this test should do just fine |
||||
let(:request_parts) { { metadata: metadata, wrongFileSection: file } } |
||||
|
||||
it_behaves_like 'invalid request body', I18n.t('api_v3.errors.multipart_body_error') |
||||
end |
||||
|
||||
context 'metadata section is no valid JSON' do |
||||
let(:metadata) { '"fileName": "cat.png"' } |
||||
|
||||
it_behaves_like 'parse error' |
||||
end |
||||
|
||||
context 'metadata is missing the fileName' do |
||||
let(:metadata) { Hash.new.to_json } |
||||
|
||||
it_behaves_like 'constraint violation' do |
||||
let(:message) { "fileName #{I18n.t('activerecord.errors.messages.blank')}" } |
||||
end |
||||
end |
||||
|
||||
context 'file is too large' do |
||||
let(:file) { mock_uploaded_file(content: 'a' * 2.kilobytes) } |
||||
let(:expanded_localization) do |
||||
I18n.t('activerecord.errors.messages.file_too_large', count: max_file_size.kilobytes) |
||||
end |
||||
|
||||
it_behaves_like 'constraint violation' do |
||||
let(:message) { "File #{expanded_localization}" } |
||||
end |
||||
end |
||||
|
||||
context 'only allowed to view documents' do |
||||
let(:permissions) { [:view_documents] } |
||||
|
||||
it_behaves_like 'unauthorized access' |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,84 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
require 'spec_helper' |
||||
require 'rack/test' |
||||
|
||||
describe 'API v3 documents resource', type: :request do |
||||
include Rack::Test::Methods |
||||
include API::V3::Utilities::PathHelper |
||||
|
||||
let(:current_user) do |
||||
FactoryBot.create(:user, member_in_project: project, member_through_role: role) |
||||
end |
||||
let(:document) { FactoryBot.create(:document, project: project) } |
||||
let(:project) { FactoryBot.create(:project) } |
||||
let(:role) { FactoryBot.create(:role, permissions: permissions) } |
||||
let(:permissions) { %i(view_documents) } |
||||
|
||||
subject(:response) { last_response } |
||||
|
||||
before do |
||||
login_as(current_user) |
||||
end |
||||
|
||||
describe 'GET /api/v3/wiki_pages/:id' do |
||||
let(:path) { api_v3_paths.document(document.id) } |
||||
|
||||
before do |
||||
get path |
||||
end |
||||
|
||||
it 'returns 200 OK' do |
||||
expect(subject.status) |
||||
.to eql(200) |
||||
end |
||||
|
||||
it 'returns the wiki page' do |
||||
expect(subject.body) |
||||
.to be_json_eql('Document'.to_json) |
||||
.at_path('_type') |
||||
|
||||
expect(subject.body) |
||||
.to be_json_eql(document.id.to_json) |
||||
.at_path('id') |
||||
end |
||||
|
||||
context 'when lacking permissions' do |
||||
let(:permissions) { [] } |
||||
|
||||
it 'returns 404 NOT FOUND' do |
||||
expect(subject.status) |
||||
.to eql(404) |
||||
end |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,78 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
require 'spec_helper' |
||||
|
||||
describe DocumentsController do |
||||
describe "routing" do |
||||
it { |
||||
expect(get('/projects/567/documents')).to route_to(controller: 'documents', |
||||
action: 'index', |
||||
project_id: '567' ) |
||||
} |
||||
|
||||
it { |
||||
expect(get('/projects/567/documents/new')).to route_to(controller: 'documents', |
||||
action: 'new', |
||||
project_id: '567' ) |
||||
} |
||||
|
||||
it { |
||||
expect(get('/documents/22')).to route_to(controller: 'documents', |
||||
action: 'show', |
||||
id: '22') |
||||
} |
||||
|
||||
it { |
||||
expect(get('/documents/22/edit')).to route_to(controller: 'documents', |
||||
action: 'edit', |
||||
id: '22') |
||||
} |
||||
|
||||
it { |
||||
expect(post('/projects/567/documents')).to route_to(controller: 'documents', |
||||
action: 'create', |
||||
project_id: '567') |
||||
} |
||||
|
||||
it { |
||||
expect(put('/documents/567')).to route_to(controller: 'documents', |
||||
action: 'update', |
||||
id: '567') |
||||
} |
||||
|
||||
it { |
||||
expect(delete('/documents/567')).to route_to(controller: 'documents', |
||||
action: 'destroy', |
||||
id: '567') |
||||
} |
||||
end |
||||
end |
@ -0,0 +1,33 @@ |
||||
#-- copyright |
||||
# OpenProject Documents Plugin |
||||
# |
||||
# Former OpenProject Core functionality extracted into a plugin. |
||||
# |
||||
# Copyright (C) 2009-2014 the OpenProject Foundation (OPF) |
||||
# |
||||
# 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-2013 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 doc/COPYRIGHT.rdoc for more details. |
||||
#++ |
||||
|
||||
# -- load spec_helper from OpenProject core |
||||
require "spec_helper" |
Loading…
Reference in new issue