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