Compare commits

...

No commits in common. "v4.0.2" and "main" have entirely different histories.
v4.0.2 ... main

393 changed files with 5703 additions and 7589 deletions

View File

@ -1,181 +0,0 @@
# Redmine plugin for Document Management System "Features"
#
# Karel Pičman <karel.picman@kontron.com>
#
# 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.
#
# GitHub CI script
name: "GitHub CI"
on:
push:
branches: ["master"]
pull_request:
branches: ["master"]
jobs:
plugin_tests:
strategy:
fail-fast: false
matrix:
engine: [mysql, postgresql, sqlite]
include:
- engine: mysql
# Database configuration for Redmine
database_configuration: >
test:
adapter: mysql2
database: test
username: redmine
password: redmine
encoding: utf8mb4
collation: utf8mb4_unicode_ci
# SQL commands to create a database for Redmine
sql1: CREATE DATABASE IF NOT EXISTS test CHARACTER SET utf8mb4;
sql2: CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'redmine';
sql3: GRANT ALL PRIVILEGES ON test.* TO 'redmine'@'localhost';
# SQL client command
database_command: mysql -uroot -proot -e
# SQL service
database_service: mysql
- engine: postgresql
# Database configuration for Redmine
database_configuration: >
test:
adapter: postgresql
database: test
username: redmine
password: redmine
host: localhost
# SQL commands to create a database for Redmine
sql1: CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD 'redmine' NOINHERIT VALID UNTIL 'infinity';
sql2: CREATE DATABASE test WITH ENCODING='UTF8' OWNER=redmine;
sql3: ALTER USER redmine CREATEDB;
# SQL client command
database_command: sudo -u postgres psql -c
# SQL service
database_service: postgresql
- engine: sqlite
# Database configuration for Redmine
database_configuration: >
test:
adapter: sqlite3
database: db/redmine.sqlite3
# No database needed here. It's just a file.
runs-on: ubuntu-latest
env:
RAILS_ENV: test
NAME: redmine_dmsf
steps:
- name: Install dependencies
# Install necessary packages
run: |
sudo apt-get update
sudo apt-get install -y litmus libreoffice subversion
- name: Clone Redmine
# Get the latest stable Redmine
run: svn export http://svn.redmine.org/redmine/branches/6.0-stable/ /opt/redmine
- name: Checkout code
uses: actions/checkout@v3
- name: Link the plugin
# Link the plugin to the redmine folder
run: |
ln -s $(pwd) /opt/redmine/plugins/redmine_dmsf
- name: Install Ruby and gems
uses: ruby/setup-ruby@v1 # The latest major version
with:
bundler-cache: true
ruby-version: '3.2'
- name: Setup database
# Create the database
run: |
echo "${{matrix.database_configuration}}" > /opt/redmine/config/database.yml
if [[ "${{matrix.database_service}}" ]]; then
sudo systemctl start ${{matrix.engine}}
fi
if [[ "${{matrix.database_command}}" ]]; then
${{matrix.database_command}} "${{matrix.sql1}}"
${{matrix.database_command}} "${{matrix.sql2}}"
${{matrix.database_command}} "${{matrix.sql3}}"
fi
- name: Install Redmine
# Install Redmine
run: |
cd /opt/redmine
echo "gem \"webrick\"" > Gemfile.local
bundle config set --local without 'rmagick development xapian'
bundle install
bundle exec rake generate_secret_token
bundle exec rake db:migrate
bundle exec rake redmine:plugins:migrate
bundle exec rake redmine:load_default_data
bundle exec rake assets:precompile
env:
REDMINE_LANG: en
- name: Configure WebDAV
# Add configuration for WebDAV to work
run: |
cp /opt/redmine/config/additional_environment.rb.example /opt/redmine/config/additional_environment.rb
echo "config.log_level = :info" >> /opt/redmine/config/additional_environment.rb
echo "# Redmine DMSF's WebDAV" >> /opt/redmine/config/additional_environment.rb
echo "require \"#{Rails.root}/plugins/redmine_dmsf/lib/redmine_dmsf/webdav/custom_middleware\"" >> /opt/redmine/config/additional_environment.rb
echo "config.middleware.insert_before ActionDispatch::Cookies, RedmineDmsf::Webdav::CustomMiddleware" >> /opt/redmine/config/additional_environment.rb
- name: Standard tests
# Run the tests
run: |
cd /opt/redmine
bundle exec rake redmine:plugins:test:units
bundle exec rake redmine:plugins:test:functionals
bundle exec rake redmine:plugins:test:integration
- name: Helpers tests
run: |
cd /opt/redmine
ruby plugins/redmine_dmsf/test/helpers/dmsf_helper_test.rb
ruby plugins/redmine_dmsf/test/helpers/dmsf_queries_helper_test.rb
- name: Rubocop
# Run the Rubocop tests
run: |
cd /opt/redmine
bundle exec rubocop -c plugins/redmine_dmsf/.rubocop.yml plugins/redmine_dmsf/
- name: Litmus
# Prepare Redmine's environment for WebDAV testing
# Run Webrick server
# Run Litmus tests (Omit 'http' tests due to 'timeout waiting for interim response' and locks due to complex bogus conditional)
# Shutdown Webrick
# Clean up Redmine's environment from WebDAV testing
run: |
cd /opt/redmine
bundle exec rake redmine:dmsf_webdav_test_on
bundle exec rails server -u webrick -e test -d
sleep 5
litmus http://localhost:3000/dmsf/webdav/dmsf_test_project admin admin
kill $(pgrep -f webrick)
bundle exec rake redmine:dmsf_webdav_test_off
env:
TESTS: "basic copymove props"
- name: Cleanup
# Rollback plugin's changes to the database
# Stop the database engine
run: |
cd /opt/redmine
bundle exec rake redmine:plugins:migrate VERSION=0
if [[ "${{matrix.database_service}}" ]]; then
sudo systemctl stop ${{matrix.engine}}
fi
- name: Archive test.log
if: always()
uses: actions/upload-artifact@v4
with:
name: "test_${{matrix.engine}}.log"
path: /opt/redmine/log/test.log

View File

@ -2,24 +2,26 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
plugins:
- rubocop-rails
- rubocop-performance
AllCops: AllCops:
TargetRubyVersion: 3.2 TargetRubyVersion: 3.2
TargetRailsVersion: 7.1 TargetRailsVersion: 7.1
SuggestExtensions: false SuggestExtensions: false
NewCops: enable NewCops: enable
@ -27,11 +29,6 @@ AllCops:
Exclude: Exclude:
- '**/vendor/**/*' - '**/vendor/**/*'
# Enable extensions
require:
- rubocop-performance
- rubocop-rails
# Rules for DMSF # Rules for DMSF
Layout/LineLength: Layout/LineLength:
Exclude: Exclude:
@ -83,9 +80,9 @@ Naming/AccessorMethodName:
Exclude: Exclude:
- lib/dav4rack/resource.rb - lib/dav4rack/resource.rb
Naming/PredicateName: Naming/PredicatePrefix:
Exclude: Exclude:
- patches/attachable_patch.rb # Easy tests - patches/attachable_patch.rb
Style/HashSyntax: Style/HashSyntax:
EnforcedShorthandSyntax: either EnforcedShorthandSyntax: either
@ -96,7 +93,7 @@ Style/ZeroLengthPredicate:
Rails/BulkChangeTable: Rails/BulkChangeTable:
Exclude: Exclude:
- db/migrate/20170217141601_add_dmsf_not_inheritable_to_custom_fields.rb # Easy tests - db/migrate/20170217141601_add_dmsf_not_inheritable_to_custom_fields.rb
Rails/DangerousColumnNames: Rails/DangerousColumnNames:
Exclude: Exclude:
@ -111,8 +108,8 @@ Rails/SkipsModelValidations:
Exclude: Exclude:
- app/helpers/dmsf_upload_helper.rb # touch is Okay - app/helpers/dmsf_upload_helper.rb # touch is Okay
- app/models/dmsf_workflow.rb # update doesn't work here - app/models/dmsf_workflow.rb # update doesn't work here
- patches/user_patch.rb - lib/redmine_dmsf/patches/user_patch.rb
- patches/role_patch.rb - lib/redmine_dmsf/patches/role_patch.rb
- db/migrate/20170526144701_dmsf_attachable.rb - db/migrate/20170526144701_dmsf_attachable.rb
- db/migrate/20170421101901_dmsf_file_container_rollback.rb - db/migrate/20170421101901_dmsf_file_container_rollback.rb
- db/migrate/20170118142001_dmsf_file_container.rb - db/migrate/20170118142001_dmsf_file_container.rb
@ -124,8 +121,8 @@ Rails/SkipsModelValidations:
Rails/ThreeStateBooleanColumn: Rails/ThreeStateBooleanColumn:
Exclude: Exclude:
- db/migrate/04_dmsf_0_9_0.rb # Easy tests - db/migrate/04_dmsf_0_9_0.rb
- db/migrate/20170217141601_add_dmsf_not_inheritable_to_custom_fields.rb # Easy tests - db/migrate/20170217141601_add_dmsf_not_inheritable_to_custom_fields.rb
Rails/UniqueValidationWithoutIndex: Rails/UniqueValidationWithoutIndex:
Exclude: Exclude:

View File

@ -1,6 +1,80 @@
Changelog for Redmine DMSF Changelog for Redmine DMSF
========================== ==========================
4.2.3 *2025-10-06*
------------------
Redmine 6.1 compatibility
* Bug: #11 - DMSF json API wrong pagination handling
* Bug: #7 - Document edit via WebDAV sets workflow into undefined state
4.2.2 *2025-07-22*
------------------
Missing lock icons
* Bug: #5 - Missing lock icons by locked objects
4.2.1 *2025-07-10*
------------------
Searching in multiple revisions
IMPORTANT: Issue tracking numbering has been restarted after the movement to the new repository
* Bug: #1 - Can't install 3.2.4 on redmine 5.0
* Bug: #3 - Download CSV file leads to 404
* New: #4 - Searching in multiple revisions
4.2.0 *2025-07-04*
------------------
SQL server compatibility
Change of the license from GNU GPL v2 to v3
PDF thumbnails
NOTE: These issues are still from the original danmunn's repository
* Bug: #1601 - Serialization of attached documents is wrong
* Bug: #1600 - Different versions for different types of uploading
* Bug: #1599 - Empty Trash => Error 500
* New: #1597 - GNU GPL v2 -> v3
* New: #1596 - Add a warning about searching in sub-folders
* Bug: #1595 - DMSF WebDAV Configuration Fails on Redmine 6.0.5
4.1.3 *2025-05-09*
------------------
SQL server compatibility
* Bug: #1595 - DMSF WebDAV Configuration Fails on Redmine 6.0.5
4.1.2 *2025-04-02*
------------------
Wrong workflow text by linked documents
4.1.1 *2025-02-19*
------------------
Links download error fix
* Bug: #1592 - Link entries download error
4.1.0 *2025-02-12*
------------------
Puma 6 compatibility
* New: #1589 - Support for Puma web server
4.0.3 *2025-01-31*
------------------
Security enhancement
* Bug: #1370 - Where to report security issues?
4.0.2 *2025-01-30* 4.0.2 *2025-01-30*
------------------ ------------------
@ -43,15 +117,10 @@ Changelog for Redmine DMSF
------------------ ------------------
Multiple file upload fix Multiple file upload fix
Uploaded file size fix
* Bug: #1559 - Multiple files upload * Bug: #1559 - Multiple files upload
* Bug: #1558 - Deleting of uploaded files * Bug: #1558 - Deleting of uploaded files
3.2.3 *2024-10-18*
------------------
Uploaded file size fix
* Bug: 1556 - Wrong file size when uploading documents * Bug: 1556 - Wrong file size when uploading documents
3.2.2 *2024-10-09* 3.2.2 *2024-10-09*
@ -99,7 +168,7 @@ Changelog for Redmine DMSF
Several bugs fixed Several bugs fixed
* Bug: #1533 - Mysql2::Error::TimeoutError * Bug: #1533 - Mysql2::Error::TimeoutError
* Bug: #1532 - Target folder and project are the same as current * Bug: #1532 - Target folder and project are the same as current
* Bug: #1531 - Fixing NoMethodError in DmsfFileRevisionFormat * Bug: #1531 - Fixing NoMethodError in DmsfFileRevisionFormat
* New: #1529 - Maintenance/update german translation * New: #1529 - Maintenance/update german translation
@ -108,7 +177,7 @@ Changelog for Redmine DMSF
Maintenance release Maintenance release
* Bug: #1528 - WebDAV / LDAP-User errors * Bug: #1528 - WebDAV / LDAP-User errors
3.1.6 *2024-06-04* 3.1.6 *2024-06-04*
------------------ ------------------
@ -158,7 +227,7 @@ Changelog for Redmine DMSF
IMPORTANT: REST API for copying/moving has changed. Check *extra/api/api_client.sh*. IMPORTANT: REST API for copying/moving has changed. Check *extra/api/api_client.sh*.
* Bug: #1490 - Latest plugin version on windows: problematic dependency 'xapian-ruby' * Bug: #1490 - Latest plugin version on windows: problematic dependency 'xapian-ruby'
* Bug: #1486 - Some context menu improvements * Bug: #1486 - Some context menu improvements
* Bug: #1485 - Renames locales/ua.yml * Bug: #1485 - Renames locales/ua.yml
* Bug: #1484 - Author should be kept when moving a folder type * Bug: #1484 - Author should be kept when moving a folder type
* Bug: #1483 - Setting.plugin_redmine_dmsf['dmsf_index_database']: undefined method 'strip' for nil:NilClass * Bug: #1483 - Setting.plugin_redmine_dmsf['dmsf_index_database']: undefined method 'strip' for nil:NilClass
@ -168,7 +237,7 @@ IMPORTANT: REST API for copying/moving has changed. Check *extra/api/api_client.
* Bug: #1473 - Edited documents cannot be unlocked * Bug: #1473 - Edited documents cannot be unlocked
* Bug: #1472 - Failed upgrade up to version 3.1.1 from version 3.0.12 * Bug: #1472 - Failed upgrade up to version 3.1.1 from version 3.0.12
* New: #1248 - Make DMS document available as Type of a custom field * New: #1248 - Make DMS document available as Type of a custom field
* New: #1132 - Please provide a simple file operation menu * New: #1132 - Please provide a simple file operation menu
3.1.2 *2023-08-23* 3.1.2 *2023-08-23*
------------------ ------------------
@ -182,7 +251,7 @@ IMPORTANT: REST API for copying/moving has changed. Check *extra/api/api_client.
Bug fixing Bug fixing
* Bug #1466 - Wrong number of arguments in dmsf links new * Bug #1466 - Wrong number of arguments in dmsf links new
3.1.0 *2023-08-10* 3.1.0 *2023-08-10*
------------------ ------------------
@ -209,7 +278,7 @@ IMPORTANT: REST API for copying/moving has changed. Check *extra/api/api_client.
* Bug: #1449 - Lost attachment on bulk edit * Bug: #1449 - Lost attachment on bulk edit
* Bug: #1448 - Convert documents fails * Bug: #1448 - Convert documents fails
* New: #1445 - To support OCR feature * New: #1445 - To support OCR feature
* Bug: #1444 - Feature/add notification labels * Bug: #1444 - Feature/add notification labels
* New: #1443 - Updates german translations * New: #1443 - Updates german translations
* Bug: #1439 - Error when opening Setting page * Bug: #1439 - Error when opening Setting page
* Bug: #1438 - Error while de-installing the plugin "Validation failed: Name contains invalid character(s)" * Bug: #1438 - Error while de-installing the plugin "Validation failed: Name contains invalid character(s)"
@ -254,7 +323,7 @@ IMPORTANT: REST API for copying/moving has changed. Check *extra/api/api_client.
* Bug: #1413 - Vim edit through webdav causes lose of all file versions besides last. * Bug: #1413 - Vim edit through webdav causes lose of all file versions besides last.
* Bug: #1408 - Lost attachment 2 * Bug: #1408 - Lost attachment 2
* New: #513 - Email Notification when someone downloads a file * New: #513 - Email Notification when someone downloads a file
* New: #239 - Easy Document link macro creation * New: #239 - Easy Document link macro creation
3.0.7 *2022-11-01* 3.0.7 *2022-11-01*
------------------ ------------------
@ -362,7 +431,7 @@ IMPORTANT: REST API for copying/moving has changed. Check *extra/api/api_client.
* New: #1348 - Custom Fields not shown on folder level * New: #1348 - Custom Fields not shown on folder level
* Bug: #1345 - Conflict with RedmineUP invoice plugin * Bug: #1345 - Conflict with RedmineUP invoice plugin
* New: #1227 - Check if a document contains a signature * New: #1227 - Check if a document contains a signature
* New: #1203 - Suggest to add document preview * New: #1203 - Suggest to add document preview
3.0.0 *2022-04-28* 3.0.0 *2022-04-28*
------------------- -------------------
@ -403,7 +472,7 @@ IMPORTANT: REST API for copying/moving has changed. Check *extra/api/api_client.
* New: #1309 - Gitlab CI * New: #1309 - Gitlab CI
* Bug: #1306 - Mysql2::Error: Operand should contain 1 column(s) * Bug: #1306 - Mysql2::Error: Operand should contain 1 column(s)
* Bug: #1304 - SQL error with postgresql on top menu * Bug: #1304 - SQL error with postgresql on top menu
* New: #1301 - REST API for documents movement * New: #1301 - REST API for documents movement
2.4.10 *2021-10-20* 2.4.10 *2021-10-20*
------------------- -------------------
@ -424,7 +493,7 @@ IMPORTANT: REST API for copying/moving has changed. Check *extra/api/api_client.
2.4.8 *2021-10-08* 2.4.8 *2021-10-08*
------------------ ------------------
REST API REST API
Create a revision, updating custom fields Create a revision, updating custom fields
Bug fixes Bug fixes
@ -526,10 +595,10 @@ IMPORTANT: REST API for copying/moving has changed. Check *extra/api/api_client.
2.4.3 *2020-06-12* 2.4.3 *2020-06-12*
------------------ ------------------
Redmine's look&feel Redmine's look&feel
Implementation of folders movement between projects (WebDAV) Implementation of folders movement between projects (WebDAV)
Korean localization updated Korean localization updated
* New: #1129 - New UI: Optimize Actions Menu * New: #1129 - New UI: Optimize Actions Menu
* New: #1128 - New German translations * New: #1128 - New German translations
@ -555,7 +624,7 @@ IMPORTANT: REST API for copying/moving has changed. Check *extra/api/api_client.
Compatibility with Redmine 4.1 Compatibility with Redmine 4.1
Chinese localisation updated Chinese localisation updated
* New: #1072 - Bug deprecation multiple gemfile sources * New: #1072 - Bug deprecation multiple gemfile sources
* New: #1069 - Minor version is limited to 99 max - I recommend to change the limit to 999 * New: #1069 - Minor version is limited to 99 max - I recommend to change the limit to 999
* New: #1068 - [travis] test redmine 4.1.0 * New: #1068 - [travis] test redmine 4.1.0
@ -582,17 +651,17 @@ IMPORTANT: REST API for copying/moving has changed. Check *extra/api/api_client.
Compatibility with Redmine 4.0.4 Compatibility with Redmine 4.0.4
Japanese localization updated Japanese localization updated
Plupload & DataTables libraries upgraded Plupload & DataTables libraries upgraded
* Bug: #1033 - Bitnami Redmine 4.0.4 * Bug: #1033 - Bitnami Redmine 4.0.4
* New: #1032 - Deprecate silverlight support? * New: #1032 - Deprecate silverlight support?
* New: #1023 - Project menu is not displayed in Redmine 4.0.3 * New: #1023 - Project menu is not displayed in Redmine 4.0.3
* Bug: #1019 - Internal Erro 500 when enable "Act as attachable" and access Activity page * Bug: #1019 - Internal Erro 500 when enable "Act as attachable" and access Activity page
* Bug: #1017 - Multiple zip files are filling the tmp folder * Bug: #1017 - Multiple zip files are filling the tmp folder
* Bug: #1015 - WebDAV client error * Bug: #1015 - WebDAV client error
* Bug: #1013 - Approval workflow notifications are sent to locked users * Bug: #1013 - Approval workflow notifications are sent to locked users
* Bug: #1010 - Installing Redmine in a sub URI * Bug: #1010 - Installing Redmine in a sub URI
* Bug: #1008 - Description field trunkates on blank line * Bug: #1008 - Description field trunkates on blank line
* Bug: #1004 - Wrong revision order after upgrading to DMSF 1.6.2 * Bug: #1004 - Wrong revision order after upgrading to DMSF 1.6.2
* Bug: #1003 - Wrong file structure on migrate * Bug: #1003 - Wrong file structure on migrate
* Bug: #1002 - New folder with empty titlle => Error 500 * Bug: #1002 - New folder with empty titlle => Error 500
* Bug: #1001 - User Permission problem (can't choose user) * Bug: #1001 - User Permission problem (can't choose user)
@ -612,7 +681,7 @@ IMPORTANT: REST API for copying/moving has changed. Check *extra/api/api_client.
Compatibility with Redmine 4.0 Compatibility with Redmine 4.0
Russian localization updated Russian localization updated
* Bug: #976 - Can't link document to issue with column in subject * Bug: #976 - Can't link document to issue with column in subject
* Bug: #969 - About the DMSF folder search logic * Bug: #969 - About the DMSF folder search logic
* Bug: #966 - folder_manipulation permission * Bug: #966 - folder_manipulation permission
@ -664,22 +733,22 @@ IMPORTANT: REST API for copying/moving has changed. Check *extra/api/api_client.
1.6.1 *2018-04-03* 1.6.1 *2018-04-03*
------------------ ------------------
Javascript on pages is loaded asynchronously Javascript on pages is loaded asynchronously
Obsolete Dav4Rack gem replaced with an up to date fork by Planio (Consequently WebDAV caching has been removed, sorry...) Obsolete Dav4Rack gem replaced with an up to date fork by Planio (Consequently WebDAV caching has been removed, sorry...)
Cloned from gem https://github.com/planio-gmbh/dav4rack.git Cloned from gem https://github.com/planio-gmbh/dav4rack.git
Project members can be chosen as recipients when sending documents by email Project members can be chosen as recipients when sending documents by email
Responsive view (optimized for mobile devices) Responsive view (optimized for mobile devices)
Direct editing of document in MS Office Direct editing of document in MS Office
Korean & Dutch localisation Korean & Dutch localisation
Move folder feature Move folder feature
Document versions can contain letters Document versions can contain letters
IMPORTANT IMPORTANT
1. `alias_method_chain` has been replaced with `prepend`. Not directly but using `RedmineExtensions::PatchManager`. 1. `alias_method_chain` has been replaced with `prepend`. Not directly but using `RedmineExtensions::PatchManager`.
Consequently, there might occure conficts with plugins which overwrite the same methods. Consequently, there might occure conficts with plugins which overwrite the same methods.
* Bug: #839 - Webdav not working * Bug: #839 - Webdav not working
* New: #838 - Rake task for regenerating document's digests * New: #838 - Rake task for regenerating document's digests
* Bug: #831 - ActionView::Template::Error, when i am creating issue from the list of all projects * Bug: #831 - ActionView::Template::Error, when i am creating issue from the list of all projects
@ -715,23 +784,23 @@ IMPORTANT
1.6.0 *2017-09-12* 1.6.0 *2017-09-12*
------------------ ------------------
Folder permissions Folder permissions
Documents attachable to issues Documents attachable to issues
Hungarian localization Hungarian localization
Full-text search in *.eml and *.msg Full-text search in *.eml and *.msg
IMPORTANT IMPORTANT
1. Files in the filesystem are re-organized by a new system based on dates. So, documents are not stored in folders named 1. Files in the filesystem are re-organized by a new system based on dates. So, documents are not stored in folders named
by the project's identifier but by the data of uploading, e.g. 2017/09. It's the same system used by Redmine for by the project's identifier but by the data of uploading, e.g. 2017/09. It's the same system used by Redmine for
attachments. attachments.
2. DMS storage directory plugin option is related to the rails root directory. 2. DMS storage directory plugin option is related to the rails root directory.
3. The plugin is independent of the gem xapian-full-alaveteli which has been replaced with ruby-xapian package. Therefore 3. The plugin is independent of the gem xapian-full-alaveteli which has been replaced with ruby-xapian package. Therefore
is recommended to uninstall xapian-full-alaveteli gem and install ruby-xapian package in order the full-text search is recommended to uninstall xapian-full-alaveteli gem and install ruby-xapian package in order the full-text search
is working. is working.
* Bug: #758 - Error in template when retrieving details of a file in a subfolder * Bug: #758 - Error in template when retrieving details of a file in a subfolder
* New: #755 - Ability to retrieve the MD5 value of a Document type * New: #755 - Ability to retrieve the MD5 value of a Document type
* Bug: #749 - REST API - List of documents in folder fails when using folder_title * Bug: #749 - REST API - List of documents in folder fails when using folder_title
* Bug: #747 - Background icon repeating in admin panel (Redmine 3.4.2) * Bug: #747 - Background icon repeating in admin panel (Redmine 3.4.2)
* Bug: #746 - Thumbnail macro: size paramter not respected * Bug: #746 - Thumbnail macro: size paramter not respected
@ -763,7 +832,7 @@ IMPORTANT
* Bug: #683 - Approval reminder problem * Bug: #683 - Approval reminder problem
* New: #667 - A better navigation in found results * New: #667 - A better navigation in found results
* New: #651 - Incomplete copy of a file to another project * New: #651 - Incomplete copy of a file to another project
* Bug: #623 - Option "Navigate folders in a tree" seems not to be saved * Bug: #623 - Option "Navigate folders in a tree" seems not to be saved
* New: #543 - Feature Request: Document Location - Folder Structure * New: #543 - Feature Request: Document Location - Folder Structure
* New: #170 - Document and Folder Access Control. This issue may be duplicated as I saw it on google code some time ago. * New: #170 - Document and Folder Access Control. This issue may be duplicated as I saw it on google code some time ago.
* New: #48 - Linking Issues and DMSF Documents * New: #48 - Linking Issues and DMSF Documents
@ -771,9 +840,9 @@ IMPORTANT
1.5.9 *2016-03-01* 1.5.9 *2016-03-01*
------------------ ------------------
WebDAV WebDAV
Documents editing in MS Office Documents editing in MS Office
Support for rsync and cp commands Support for rsync and cp commands
Disable verioning for certain file names pattern by PUT request Disable verioning for certain file names pattern by PUT request
Ignoring certain file names pattern by PUT request Ignoring certain file names pattern by PUT request
Caching of PROPSTATS and PROPFIND requests Caching of PROPSTATS and PROPFIND requests
@ -784,7 +853,7 @@ IMPORTANT
Editing of approval workflow steps Editing of approval workflow steps
Approval workflow step name Approval workflow step name
DMSF DMSF
Document export Document export
Public URLs option in email entries Public URLs option in email entries
Global title format for downloading Global title format for downloading
New columns in the main DMSF view; columns are configurable from the plugin settings New columns in the main DMSF view; columns are configurable from the plugin settings
@ -813,7 +882,7 @@ IMPORTANT
* Bug: #593 - Modern upload file type doesn't work * Bug: #593 - Modern upload file type doesn't work
* Bug: #592 - reset_column_information is missing in DB migration * Bug: #592 - reset_column_information is missing in DB migration
* Bug: #591 - rsync doesn't work for WebDAV mounted folder * Bug: #591 - rsync doesn't work for WebDAV mounted folder
* Bug: #587 - Working with MS Office documents directly in mounted WebDAV share * Bug: #587 - Working with MS Office documents directly in mounted WebDAV share
* New: #584 - A lot of warnings in WebDAV unit tests * New: #584 - A lot of warnings in WebDAV unit tests
* Bug: #582 - FATAL -- : ActionController::RoutingError (No route matches [GET] "/plugin_assets/redmine_dmsf/javascripts/jquery.dataTables/zh.json") * Bug: #582 - FATAL -- : ActionController::RoutingError (No route matches [GET] "/plugin_assets/redmine_dmsf/javascripts/jquery.dataTables/zh.json")
* Bug: #581 - Webdav always shows the create date * Bug: #581 - Webdav always shows the create date
@ -822,7 +891,7 @@ IMPORTANT
* New: #555 - Documents ID easy access * New: #555 - Documents ID easy access
* New: #551 - Default action for files viewing * New: #551 - Default action for files viewing
* New: #547 - Setting Title format should be global setting, but released as local setting * New: #547 - Setting Title format should be global setting, but released as local setting
* New: #499 - Add column "type/extension" in folder content view * New: #499 - Add column "type/extension" in folder content view
1.5.8 *2016-10-21* 1.5.8 *2016-10-21*
------------------ ------------------
@ -831,10 +900,10 @@ IMPORTANT
Tree view optimization for speed Tree view optimization for speed
Wiki macros revision: dmsfd X dmsfdesc Wiki macros revision: dmsfd X dmsfdesc
Support for deleting users Support for deleting users
* Bug: #578 - A wrong title when uploading documents * Bug: #578 - A wrong title when uploading documents
* Bug: #574 - Macro {{dmsfd(xx)}} produce blank value * Bug: #574 - Macro {{dmsfd(xx)}} produce blank value
* Bug: #566 - HTML tags in the document description breaks UI * Bug: #566 - HTML tags in the document description breaks UI
* Bug: #565 - Error 500 when a link to another folder is in the folder/project * Bug: #565 - Error 500 when a link to another folder is in the folder/project
* New: #562 - New step button text * New: #562 - New step button text
* Bug: #561 - Wrong path in the document's details form * Bug: #561 - Wrong path in the document's details form
@ -844,7 +913,7 @@ IMPORTANT
1.5.7 *2016-08-12* 1.5.7 *2016-08-12*
------------------ ------------------
SQLite compatibility SQLite compatibility
Lock/Unlock feature for global approval workflows Lock/Unlock feature for global approval workflows
Document ID in the document's details Document ID in the document's details
@ -974,7 +1043,7 @@ IMPORTANT
External links External links
* New: #307 - Filter mail receivers for approval workflow with file managing permission * New: #307 - Filter mail receivers for approval workflow with file managing permission
* New: #308 - Rails 4 * New: #308 - Rails 4
* Bug: #321 - My open approvals * Bug: #321 - My open approvals
* Bug: #322 - Approval workflow notifications * Bug: #322 - Approval workflow notifications
* New: #325 - Approval workflow permission * New: #325 - Approval workflow permission
@ -993,7 +1062,7 @@ IMPORTANT
* New: #357 - Redmine 3.0.0 released! Compatibility with DMSF? * New: #357 - Redmine 3.0.0 released! Compatibility with DMSF?
* Bug: #361 - incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string) * Bug: #361 - incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string)
* Bug: #366 - unable to properly uninstall under Redmine 3.0.1 * Bug: #366 - unable to properly uninstall under Redmine 3.0.1
* Bug: #367 - Unable to create a folder * Bug: #367 - Unable to create a folder
* Bug: #368 - Cannot create a document workflow * Bug: #368 - Cannot create a document workflow
* Bug: #369 - Update document revision under Redmine 3.0.1 * Bug: #369 - Update document revision under Redmine 3.0.1
* Bug: #371 - Unable to properly uninstall the plugin * Bug: #371 - Unable to properly uninstall the plugin
@ -1006,7 +1075,7 @@ IMPORTANT
Standard Redmine's upload form with progress bar for files > 100 MB Standard Redmine's upload form with progress bar for files > 100 MB
WebDAV library upgrade WebDAV library upgrade
* New: #130 - redmine_dmsf: last update of the folders * New: #130 - redmine_dmsf: last update of the folders
* Bug: #131 - Wiki link shows filename for all users type * Bug: #131 - Wiki link shows filename for all users type
* New: #136 - `File Manipulation` permissions * New: #136 - `File Manipulation` permissions
* New: #218 - Feature request: Recycle bin * New: #218 - Feature request: Recycle bin
@ -1014,12 +1083,12 @@ IMPORTANT
* New: #238 - DMSF document update shows up in issue referred to in comment * New: #238 - DMSF document update shows up in issue referred to in comment
* New: #249 - Storage path for DMSF files ignores global storage path for attachments * New: #249 - Storage path for DMSF files ignores global storage path for attachments
* New: #255 - Debian - Readme install procedure update * New: #255 - Debian - Readme install procedure update
* Bug: #258 - Jquery conflict with Redmine * Bug: #258 - Jquery conflict with Redmine
* Bug: #267 - Custom fields tabs not work with last custom_fields_helper_patch.rb * Bug: #267 - Custom fields tabs not work with last custom_fields_helper_patch.rb
* Bug: #269 - Workflow OR not working for second reviewer * Bug: #269 - Workflow OR not working for second reviewer
* Bug: #270 - 500 Internal Server Error, redmine 2.5.1, MS SQL Server 2012, dmsf 1.4.8-master, dmsf_link.rb * Bug: #270 - 500 Internal Server Error, redmine 2.5.1, MS SQL Server 2012, dmsf 1.4.8-master, dmsf_link.rb
* Bug: #275 - Typo in readme file type * Bug: #275 - Typo in readme file type
* Bug: #288 - ubuntu migrate failed * Bug: #288 - ubuntu migrate failed
* Bug: #290 - error installing plugin * Bug: #290 - error installing plugin
* Bug: #293 - Locking of inexistent files fails * Bug: #293 - Locking of inexistent files fails
* Bug: #298 - The same approver in one approval step * Bug: #298 - The same approver in one approval step
@ -1051,7 +1120,7 @@ IMPORTANT
* New: #236 - Documents tagging * New: #236 - Documents tagging
* Bug: #240 - Internal server error, redmine 2.5.1-devel.13064, PostgreSQL, dmsf 1.4.8-devel * Bug: #240 - Internal server error, redmine 2.5.1-devel.13064, PostgreSQL, dmsf 1.4.8-devel
* Bug: #242 - dsmf 1.4.8 minor ... "link form" tab * Bug: #242 - dsmf 1.4.8 minor ... "link form" tab
* Bug: #246 - "File storage directory" does not default properly when setting is empty * Bug: #246 - "File storage directory" does not default properly when setting is empty
1.4.7: *2014-01-02* 1.4.7: *2014-01-02*
------------------- -------------------
@ -1062,7 +1131,7 @@ IMPORTANT
Code revision Code revision
* New: #38 - A few questions about the plugin (possible improvements) * New: #38 - A few questions about the plugin (possible improvements)
* New: #49 - Make the 100 MB ajax upload limit an option * New: #49 - Make the 100 MB ajax upload limit an option
* Bug: #52 - Error : undefined method `size' for nil:NilClass * Bug: #52 - Error : undefined method `size' for nil:NilClass
* Bug: #90 - Missing redmine_dmsf / assets / javascripts / plupload / i18n /en.js file? * Bug: #90 - Missing redmine_dmsf / assets / javascripts / plupload / i18n /en.js file?
* Bug: #94 - Files not deleted with project * Bug: #94 - Files not deleted with project
@ -1071,22 +1140,22 @@ IMPORTANT
* Bug: #141 - Error 500 uploading file with DMSF custom fields * Bug: #141 - Error 500 uploading file with DMSF custom fields
* Bug: #159 - Broken links caused by plugin_asset_path implementation * Bug: #159 - Broken links caused by plugin_asset_path implementation
* New: #173 - Open approvals in My page * New: #173 - Open approvals in My page
* Bug: #174 - Workflow error when more than one approver * Bug: #174 - Workflow error when more than one approver
* Bug: #175 - Error 500 on performing search * Bug: #175 - Error 500 on performing search
* Bug: #176 - 500 internal error when approving workflow - dmsf_workflows/4/new_action * Bug: #176 - 500 internal error when approving workflow - dmsf_workflows/4/new_action
* Bug: #177 - 1.4.7-devel unable to upload files * Bug: #177 - 1.4.7-devel unable to upload files
* Bug: #178 - Error 500 cannot access Administration -> Custom Fields page * Bug: #178 - Error 500 cannot access Administration -> Custom Fields page
* New: #179 - Workflow Log History in Detailed View * New: #179 - Workflow Log History in Detailed View
* Bug: #187 - Approval workflow permissions * Bug: #187 - Approval workflow permissions
* New: #190 - Very slow in directories containing many files * New: #190 - Very slow in directories containing many files
* Bug: #191 - Move/Copy gives undefined method for File:Class * Bug: #191 - Move/Copy gives undefined method for File:Class
* New: #193 - French translation * New: #193 - French translation
* Bug: #194 - Workflow name link in workflow log window * Bug: #194 - Workflow name link in workflow log window
* Bug: #195 - Workflow log not displaying all the steps * Bug: #195 - Workflow log not displaying all the steps
* New: #196 - Update French Language * New: #196 - Update French Language
* Bug: #197 - Multi upload not loading the translation * Bug: #197 - Multi upload not loading the translation
* New: #198 - When editing a workflow, only show current project's users * New: #198 - When editing a workflow, only show current project's users
* Bug: #199 - Small error in plugin_asset_path function * Bug: #199 - Small error in plugin_asset_path function
* New: #200 - Update the french translation for the multi upload module * New: #200 - Update the french translation for the multi upload module
* Bug: #202 - unable to create Custom Field when DMSF plugin installed * Bug: #202 - unable to create Custom Field when DMSF plugin installed
* Bug: #203 - Little typing error in french translation * Bug: #203 - Little typing error in french translation
@ -1151,7 +1220,7 @@ IMPORTANT
* New: Locks store a timestamp based UUID string enabling better interaction with webservices * New: Locks store a timestamp based UUID string enabling better interaction with webservices
* Bug: #16 - unable to add new project when plugin enabled due to bug in UI * Bug: #16 - unable to add new project when plugin enabled due to bug in UI
* Bug: #17 - dav4rack not installable on some systems - it is now vendored * Bug: #17 - dav4rack not installable on some systems - it is now vendored
* Bug: #18 - Warnings thrown due to space between function and parentheses * Bug: #18 - Warnings thrown due to space between function and parentheses
1.4.3: *2012-06-26* 1.4.3: *2012-06-26*
------------------- -------------------
@ -1184,4 +1253,4 @@ IMPORTANT
1.4.0: *2012-06-06* 1.4.0: *2012-06-06*
------------------- -------------------
* New: Redmine 2.0 or higher is required * New: Redmine 2.0 or higher is required

35
Gemfile
View File

@ -2,21 +2,20 @@
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
source 'https://rubygems.org' do source 'https://rubygems.org' do
gem 'ox' # Dav4Rack gem 'ox' # Dav4Rack
@ -25,14 +24,12 @@ source 'https://rubygems.org' do
gem 'zip-zip' unless Dir.exist?(File.expand_path('../../vault', __FILE__)) gem 'zip-zip' unless Dir.exist?(File.expand_path('../../vault', __FILE__))
# Redmine extensions # Redmine extensions
unless Dir.exist?(File.expand_path('../../easyproject', __FILE__)) gem 'active_record_union'
gem 'active_record_union' gem 'simple_enum'
gem 'simple_enum' group :xapian do
group :xapian do gem 'xapian-ruby'
gem 'xapian-ruby'
end
end end
unless %w[easyproject easy_gantt custom_tables] unless %w[easy_gantt custom_tables]
.any? { |plugin| Dir.exist?(File.expand_path("../../#{plugin}", __FILE__)) } .any? { |plugin| Dir.exist?(File.expand_path("../../#{plugin}", __FILE__)) }
group :test do group :test do
gem 'rails-controller-testing' gem 'rails-controller-testing'

View File

@ -1,339 +1,617 @@
GNU GENERAL PUBLIC LICENSE # GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc., Version 3, 29 June 2007
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble Copyright (C) 2007 Free Software Foundation, Inc.
<https://fsf.org/>
The licenses for most software are designed to take away your Everyone is permitted to copy and distribute verbatim copies of this
freedom to share and change it. By contrast, the GNU General Public license document, but changing it is not allowed.
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not ## Preamble
price. Our General Public Licenses are designed to make sure that you
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 have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it them if you wish), that you receive source code or can get it if you
if you want it, that you can change the software or use pieces of it want it, that you can change the software or use pieces of it in new
in new free programs; and that you know you can do these things. free programs, and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid To protect your rights, we need to prevent others from denying you
anyone to deny you these rights or to ask you to surrender the rights. these rights or asking you to surrender the rights. Therefore, you
These restrictions translate to certain responsibilities for you if you have certain responsibilities if you distribute copies of the
distribute copies of the software, or if you modify it. software, or if you modify it: responsibilities to respect the freedom
of others.
For example, if you distribute copies of such a program, whether For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that gratis or for a fee, you must pass on to the recipients the same
you have. You must make sure that they, too, receive or can get the freedoms that you received. You must make sure that they, too, receive
source code. And you must show them these terms so they know their or can get the source code. And you must show them these terms so they
rights. know their rights.
We protect your rights with two steps: (1) copyright the software, and Developers that use the GNU GPL protect your rights with two steps:
(2) offer you this license which gives you legal permission to copy, (1) assert copyright on the software, and (2) offer you this License
distribute and/or modify the software. giving you legal permission to copy, distribute and/or modify it.
Also, for each author's protection and ours, we want to make certain For the developers' and authors' protection, the GPL clearly explains
that everyone understands that there is no warranty for this free that there is no warranty for this free software. For both users' and
software. If the software is modified by someone else and passed on, we authors' sake, the GPL requires that modified versions be marked as
want its recipients to know that what they have is not the original, so changed, so that their problems will not be attributed erroneously to
that any problems introduced by others will not reflect on the original authors of previous versions.
authors' reputations.
Finally, any free program is threatened constantly by software Some devices are designed to deny users access to install or run
patents. We wish to avoid the danger that redistributors of a free modified versions of the software inside them, although the
program will individually obtain patent licenses, in effect making the manufacturer can do so. This is fundamentally incompatible with the
program proprietary. To prevent this, we have made it clear that any aim of protecting users' freedom to change the software. The
patent must be licensed for everyone's free use or not licensed at all. 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.
The precise terms and conditions for copying, distribution and 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. modification follow.
GNU GENERAL PUBLIC LICENSE ## TERMS AND CONDITIONS
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains ### 0. Definitions.
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not "This License" refers to version 3 of the GNU General Public License.
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's "Copyright" also means copyright-like laws that apply to other kinds
source code as you receive it, in any medium, provided that you of works, such as semiconductor masks.
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and "The Program" refers to any copyrightable work licensed under this
you may at your option offer warranty protection in exchange for a fee. License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
2. You may modify your copy or copies of the Program or any portion To "modify" a work means to copy from or adapt all or part of the work
of it, thus forming a work based on the Program, and copy and in a fashion requiring copyright permission, other than the making of
distribute such modifications or work under the terms of Section 1 an exact copy. The resulting work is called a "modified version" of
above, provided that you also meet all of these conditions: the earlier work or a work "based on" the earlier work.
a) You must cause the modified files to carry prominent notices A "covered work" means either the unmodified Program or a work based
stating that you changed the files and the date of any change. on the Program.
b) You must cause any work that you distribute or publish, that in To "propagate" a work means to do anything with it that, without
whole or in part contains or is derived from the Program or any permission, would make you directly or secondarily liable for
part thereof, to be licensed as a whole at no charge to all third infringement under applicable copyright law, except executing it on a
parties under the terms of this License. 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.
c) If the modified program normally reads commands interactively To "convey" a work means any kind of propagation that enables other
when run, you must cause it, when started running for such parties to make or receive copies. Mere interaction with a user
interactive use in the most ordinary way, to print or display an through a computer network, with no transfer of a copy, is not
announcement including an appropriate copyright notice and a conveying.
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If An interactive user interface displays "Appropriate Legal Notices" to
identifiable sections of that work are not derived from the Program, the extent that it includes a convenient and prominently visible
and can be reasonably considered independent and separate works in feature that (1) displays an appropriate copyright notice, and (2)
themselves, then this License, and its terms, do not apply to those tells the user that there is no warranty for the work (except to the
sections when you distribute them as separate works. But when you extent that warranties are provided), that licensees may convey the
distribute the same sections as part of a whole which is a work based work under this License, and how to view a copy of this License. If
on the Program, the distribution of the whole must be on the terms of the interface presents a list of user commands or options, such as a
this License, whose permissions for other licensees extend to the menu, a prominent item in the list meets this criterion.
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest ### 1. Source Code.
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program The "source code" for a work means the preferred form of the work for
with the Program (or with a work based on the Program) on a volume of making modifications to it. "Object code" means any non-source form of
a storage or distribution medium does not bring the other work under a work.
the scope of this License.
3. You may copy and distribute the Program (or a work based on it, A "Standard Interface" means an interface that either is an official
under Section 2) in object code or executable form under the terms of standard defined by a recognized standards body, or, in the case of
Sections 1 and 2 above provided that you also do one of the following: interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
a) Accompany it with the complete corresponding machine-readable The "System Libraries" of an executable work include anything, other
source code, which must be distributed under the terms of Sections than the work as a whole, that (a) is included in the normal form of
1 and 2 above on a medium customarily used for software interchange; or, 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.
b) Accompany it with a written offer, valid for at least three The "Corresponding Source" for a work in object code form means all
years, to give any third party, for a charge no more than your the source code needed to generate, install, and (for an executable
cost of physically performing source distribution, a complete work) run the object code and to modify the work, including scripts to
machine-readable copy of the corresponding source code, to be control those activities. However, it does not include the work's
distributed under the terms of Sections 1 and 2 above on a medium System Libraries, or general-purpose tools or generally available free
customarily used for software interchange; or, 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.
c) Accompany it with the information you received as to the offer The Corresponding Source need not include anything that users can
to distribute corresponding source code. (This alternative is regenerate automatically from other parts of the Corresponding Source.
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for The Corresponding Source for a work in source code form is that same
making modifications to it. For an executable work, complete source work.
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering ### 2. Basic Permissions.
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program All rights granted under this License are granted for the term of
except as expressly provided under this License. Any attempt copyright on the Program, and are irrevocable provided the stated
otherwise to copy, modify, sublicense or distribute the Program is conditions are met. This License explicitly affirms your unlimited
void, and will automatically terminate your rights under this License. permission to run the unmodified Program. The output from running a
However, parties who have received copies, or rights, from you under covered work is covered by this License only if the output, given its
this License will not have their licenses terminated so long as such content, constitutes a covered work. This License acknowledges your
parties remain in full compliance. rights of fair use or other equivalent, as provided by copyright law.
5. You are not required to accept this License, since you have not You may make, run and propagate covered works that you do not convey,
signed it. However, nothing else grants you permission to modify or without conditions so long as your license otherwise remains in force.
distribute the Program or its derivative works. These actions are You may convey covered works to others for the sole purpose of having
prohibited by law if you do not accept this License. Therefore, by them make modifications exclusively for you, or provide you with
modifying or distributing the Program (or any work based on the facilities for running those works, provided that you comply with the
Program), you indicate your acceptance of this License to do so, and terms of this License in conveying all material for which you do not
all its terms and conditions for copying, distributing or modifying control copyright. Those thus making or running the covered works for
the Program or works based on it. 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.
6. Each time you redistribute the Program (or any work based on the Conveying under any other circumstances is permitted solely under the
Program), the recipient automatically receives a license from the conditions stated below. Sublicensing is not allowed; section 10 makes
original licensor to copy, distribute or modify the Program subject to it unnecessary.
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein. ### 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
You are not responsible for enforcing compliance by third parties to
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. this License.
7. If, as a consequence of a court judgment or allegation of patent Each contributor grants you a non-exclusive, worldwide, royalty-free
infringement or for any other reason (not limited to patent issues), patent license under the contributor's essential patent claims, to
conditions are imposed on you (whether by court order, agreement or 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 otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot excuse you from the conditions of this License. If you cannot convey a
distribute so as to satisfy simultaneously your obligations under this covered work so as to satisfy simultaneously your obligations under
License and any other pertinent obligations, then as a consequence you this License and any other pertinent obligations, then as a
may not distribute the Program at all. For example, if a patent consequence you may not convey it at all. For example, if you agree to
license would not permit royalty-free redistribution of the Program by terms that obligate you to collect a royalty for further conveying
all those who receive copies directly or indirectly through you, then from those to whom you convey the Program, the only way you could
the only way you could satisfy both it and this License would be to satisfy both those terms and this License would be to refrain entirely
refrain entirely from distribution of the Program. from conveying the Program.
If any portion of this section is held invalid or unenforceable under ### 13. Use with the GNU Affero General Public License.
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any Notwithstanding any other provision of this License, you have
patents or other property right claims or to contest validity of any permission to link or combine any covered work with a work licensed
such claims; this section has the sole purpose of protecting the under version 3 of the GNU Affero General Public License into a single
integrity of the free software distribution system, which is combined work, and to convey the resulting work. The terms of this
implemented by public license practices. Many people have made License will continue to apply to the part which is the covered work,
generous contributions to the wide range of software distributed but the special requirements of the GNU Affero General Public License,
through that system in reliance on consistent application of that section 13, concerning interaction through a network will apply to the
system; it is up to the author/donor to decide if he or she is willing combination as such.
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to ### 14. Revised Versions of this License.
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in The Free Software Foundation may publish revised and/or new versions
certain countries either by patents or by copyrighted interfaces, the of the GNU General Public License from time to time. Such new versions
original copyright holder who places the Program under this License will be similar in spirit to the present version, but may differ in
may add an explicit geographical distribution limitation excluding detail to address new problems or concerns.
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions Each version is given a distinguishing version number. If the Program
of the General Public License from time to time. Such new versions will specifies that a certain numbered version of the GNU General Public
be similar in spirit to the present version, but may differ in detail to License "or any later version" applies to it, you have the option of
address new problems or concerns. 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.
Each version is given a distinguishing version number. If the Program If the Program specifies that a proxy can decide which future versions
specifies a version number of this License which applies to it and "any of the GNU General Public License can be used, that proxy's public
later version", you have the option of following the terms and conditions statement of acceptance of a version permanently authorizes you to
either of that version or of any later version published by the Free choose that version for the Program.
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free Later license versions may give you additional or different
programs whose distribution conditions are different, write to the author permissions. However, no additional obligations are imposed on any
to ask for permission. For software which is copyrighted by the Free author or copyright holder as a result of your choosing to follow a
Software Foundation, write to the Free Software Foundation; we sometimes later version.
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY ### 15. Disclaimer of Warranty.
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
REPAIR OR CORRECTION. CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING ### 16. Limitation of Liability.
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE 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.
END OF TERMS AND CONDITIONS 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.
How to Apply These Terms to Your New Programs ### 17. Interpretation of Sections 15 and 16.
If you develop a new program, and you want it to be of the greatest If the disclaimer of warranty and limitation of liability provided
possible use to the public, the best way to achieve this is to make it above cannot be given local legal effect according to their terms,
free software which everyone can redistribute and change under these terms. reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
To do so, attach the following notices to the program. It is safest Program, unless a warranty or assumption of liability accompanies a
to attach them to the start of each source file to most effectively copy of the Program in return for a fee.
convey 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 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.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision 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, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This 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.

339
README.md
View File

@ -1,339 +0,0 @@
# Redmine DMSF Plugin 4.0.2
[![GitHub CI](https://github.com/danmunn/redmine_dmsf/actions/workflows/rubyonrails.yml/badge.svg?branch=master)](https://github.com/danmunn/redmine_dmsf/actions/workflows/rubyonrails.yml)
[![Support Ukraine Badge](https://bit.ly/support-ukraine-now)](https://github.com/support-ukraine/support-ukraine)
Redmine DMSF is Document Management System Features plugin for Redmine issue tracking system; It is aimed to replace current Redmine's Documents module.
Redmine DMSF now comes bundled with WebDAV functionality: if switched on within plugin settings this will be accessible from _/dmsf/webdav_.
WebDAV functionality is provided through Dav4Rack library.
The development has been supported by [Kontron](https://www.kontron.com) and has been released as open source thanks to their generosity.
Project home: <https://github.com/danmunn/redmine_dmsf>
Redmine Document Management System "Features" plugin is distributed under GNU General Public License v2 (GPL).
Redmine is a flexible project management web application, released under the terms of the GNU General Public License v2 (GPL) at <https://www.redmine.org/>
Further information about the GPL license can be found at
<https://www.gnu.org/licenses/old-licenses/gpl-2.0.html#SEC1>
## Features
* Directory structure
* Document versioning / revision history
* Document locking
* Multi (drag/drop depending on browser) upload/download
* Direct document or document link sending via email
* Configurable document approval workflow
* Document access auditing
* Integration with Redmine's activity feed
* Wiki macros for a quick content linking
* Full read/write WebDAV functionality
* Optional document content full-text search
* Documents and folders' symbolic links
* Trash bin
* Documents attachable to issues
* Office documents are displayed inline
* Editing of office documents
* REST API
* DMS Document revision as a custom field type
* Compatible with Redmine 6
## Dependencies
* Redmine 6.0 or higher
### Full-text search (optional)
#### Indexing
If you want to use full-text search features, you must setup file content indexing.
It is necessary to index DMSF files with omindex before searching attempts to receive some output:
1. Change the configuration part of redmine_dmsf/extra/xapian_indexer.rb file according to your environment.
(The path to the index database set in xapian_indexer.rb must corresponds to the path set in the plugin's settings.)
2. Run `ruby redmine_dmsf/extra/xapian_indexer.rb -v`
This command should be run on regular basis (e.g. from cron)
Example of cron job (once per hour at 8th minute):
8 * * * * root /usr/bin/ruby redmine_dmsf/extra/xapian_indexer.rb
See redmine_dmsf/extra/xapian_indexer.rb for help.
#### Searching
If you want to use fulltext search abilities, install xapian packages. In case of using of Bitnami
stack or Ruby installed via RVM it might be necessary to install Xapian bindings from sources. See https://xapian.org
for details.
To index some files with omega you may have to install some other packages like
xpdf, antiword, ...
From Omega documentation:
* HTML (.html, .htm, .shtml, .shtm, .xhtml, .xhtm)
* PHP (.php) - our HTML parser knows to ignore PHP code
* text files (.txt, .text)
* SVG (.svg)
* CSV (Comma-Separated Values) files (.csv)
* PDF (.pdf) if pdftotext is available (comes with poppler or xpdf)
* PostScript (.ps, .eps, .ai) if ps2pdf (from ghostscript) and pdftotext (comes with poppler or xpdf) are available
* OpenOffice/StarOffice documents (.sxc, .stc, .sxd, .std, .sxi, .sti, .sxm, .sxw, .sxg, .stw) if unzip is available
* OpenDocument format documents (.odt, .ods, .odp, .odg, .odc, .odf, .odb, .odi, .odm, .ott, .ots, .otp, .otg, .otc, .otf, .oti, .oth) if unzip is available
* MS Word documents (.dot) if antiword is available (.doc files are left to libmagic, as they may actually be RTF (AbiWord saves RTF when asked to save as .doc, and Microsoft Word quietly loads RTF files with a .doc extension), or plain-text).
* MS Excel documents (.xls, .xlb, .xlt, .xlr, .xla) if xls2csv is available (comes with catdoc)
* MS Powerpoint documents (.ppt, .pps) if catppt is available (comes with catdoc)
* MS Office 2007 documents (.docx, .docm, .dotx, .dotm, .xlsx, .xlsm, .xltx, .xltm, .pptx, .pptm, .potx, .potm, .ppsx, .ppsm) if unzip is available
* Wordperfect documents (.wpd) if wpd2text is available (comes with libwpd)
* MS Works documents (.wps, .wpt) if wps2text is available (comes with libwps)
* MS Outlook message (.msg) if perl with Email::Outlook::Message and HTML::Parser modules is available
* MS Publisher documents (.pub) if pub2xhtml is available (comes with libmspub)
* AbiWord documents (.abw)
* Compressed AbiWord documents (.zabw)
* Rich Text Format documents (.rtf) if unrtf is available
* Perl POD documentation (.pl, .pm, .pod) if pod2text is available
* reStructured text (.rst, .rest) if rst2html is available (comes with docutils)
* Markdown (.md, .markdown) if markdown is available
* TeX DVI files (.dvi) if catdvi is available
* DjVu files (.djv, .djvu) if djvutxt is available
* XPS files (.xps) if unzip is available
* Debian packages (.deb, .udeb) if dpkg-deb is available
* RPM packages (.rpm) if rpm is available
* Atom feeds (.atom)
* MAFF (.maff) if unzip is available
* MHTML (.mhtml, .mht) if perl with MIME::Tools is available
* MIME email messages (.eml) and USENET articles if perl with MIME::Tools and HTML::Parser is available
* vCard files (.vcf, .vcard) if perl with Text::vCard is available
You can use following commands to install some of the required indexing tools:
On Debian use:
```
sudo apt-get install xapian-omega ruby-xapian libxapian-dev poppler-utils antiword unzip catdoc libwpd-tools \
libwps-tools gzip unrtf catdvi djview djview3 uuid uuid-dev xz-utils libemail-outlook-message-perl
```
On Ubuntu use:
```
sudo apt-get install xapian-omega ruby-xapian libxapian-dev poppler-utils antiword unzip catdoc libwpd-tools \
libwps-tools gzip unrtf catdvi djview djview3 uuid uuid-dev xz-utils libemail-outlook-message-perl
```
On CentOS use:
```
sudo yum install xapian-core xapian-bindings-ruby libxapian-dev poppler-utils antiword unzip catdoc libwpd-tools \
libwps-tools gzip unrtf catdvi djview djview3 uuid uuid-dev xz libemail-outlook-message-perl
```
## Inline displaying of office documents (optional)
If LibreOffice binary `libreoffice` is present in the server, office documents (.odt, .ods,...) are displayed inline.
The command must be runable by the web app's user. Test it in advance, e.g:
`sudo -u www-data libreoffice --convert-to pdf my_document.odt`
`libreoffice` package is available in the most of Linux distributions, e.g. on Debain based systems:
```
sudo apt install libreoffice liblibreoffice-java
```
## Usage
DMSF is designed to act as project module, so it must be checked as an enabled module within the project settings.
Search will now automatically search DMSF content when a Redmine search is performed, additionally a "Documents" and "Folders" check box will be visible, allowing you to search DMSF content exclusively.
## Linking DMSF object from Wiki entries (macros)
You can link DMSF object from Wikis using a macro tag `{{ }}`. List of available macros with their description is
available from the wiki's toolbar.
## Hooks
You can implement these hooks in your plugin and extend DMSF functionality in certain events.
E.g.
class DmsfUploadControllerHooks < Redmine::Hook::Listener
def dmsf_upload_controller_after_commit(context={})
context[:controller].flash[:info] = 'Okay'
end
end
**dmsf_upload_controller_after_commit**
Called after all uploaded files are committed.
parameters: *files*
**dmsf_helper_upload_after_commit**
Called after an individual file is committed. The controller is not available.
Parameters: *file*
**dmsf_workflow_controller_before_approval**
Called before an approval. If the hook returns false, the approval is not recorded.
parameters: *revision*, *step_action*
**dmsf_files_controller_before_view**
Allows a preview of the file by an external plugin. If the hook returns true, the file is not sent by DMSF. It is
expected that the file is sent by the hook.
parameters: *file*
## Setup / Upgrade
You can either clone the master branch or download the latest zipped version. Before installing ensure that the Redmine
instance is stopped.
git clone git@github.com:danmunn/redmine_dmsf.git
wget https://github.com/danmunn/redmine_dmsf/archive/master.zip
1. In case of upgrade **BACKUP YOUR DATABASE, ORIGINAL PLUGIN AND THE FOLDER WITH DOCUMENTS** first!!!
2. Put redmine_dmsf plugin directory into plugins. The plugins sub-directory must be named just **redmine_dmsf**. In case
of need rename _redmine_dmsf-x.y.z_ to *redmine_dmsf*.
3. **Go to the redmine directory**
`cd redmine`
4. Install dependencies:
`bundle install`
4.1 In production environment
bundle config set --local without 'development test'
bundle install
4.2 Without Xapian fulltext search (on Windows)
bundle config set --local without 'xapian'
bundle install
5. Initialize/Update database:
`RAILS_ENV=production bundle exec rake redmine:plugins:migrate NAME=redmine_dmsf`
6. Install assets
`RAILS_ENV="production" bundle exec rake assets:precompile`
7. The access rights must be set for web server, e.g.:
`chown -R www-data:www-data plugins/redmine_dmsf`
8. Restart the web server, e.g.:
`systemctl restart apache2`
9. You should configure the plugin via Redmine interface: Administration -> Plugins -> DMSF -> Configure. (You should check and then save the plugin's configuration after each upgrade.)
10. Don't forget to grant permissions for DMSF in Administration -> Roles and permissions
11. Assign DMSF permissions to appropriate roles.
12. There are a few rake tasks:
I) To convert documents from the standard Redmine document module
Available options:
* project - id or identifier of a project (default to all projects)
* dry_run - perform just a check without any conversion
* issues - Convert also files attached to issues
Example:
rake redmine:dmsf_convert_documents project=test RAILS_ENV="production"
(If you don't run the rake task as the web server user, don't forget to change the ownership of the imported files, e.g.
chown -R www-data:www-data /redmine/files/dmsf
afterwards)
II) To alert all users who are expected to do an approval in the current approval steps
Example:
rake redmine:dmsf_alert_approvals RAILS_ENV="production"
III) To create missing checksums for all document revisions
Available options:
* dry_run - test, no changes to the database
* forceSHA256 - replace old MD5 with SHA256
Example:
bundle exec rake redmine:dmsf_create_digests RAILS_ENV="production"
bundle exec rake redmine:dmsf_create_digests forceSHA256=1 RAILS_ENV="production"
bundle exec rake redmine:dmsf_create_digests dry_run=1 RAILS_ENV="production"
IV) To maintain DMSF
* Remove all files with no database record from the document directory
* Remove all links project_id = -1 (added links to an issue which hasn't been created)
Available options:
* dry_run - No physical deletion but to list of all unused files only
Example:
rake redmine:dmsf_maintenance RAILS_ENV="production"
rake redmine:dmsf_maintenance dry_run=1 RAILS_ENV="production"
### WebDAV
In order to enable WebDAV module, it is necessary to put the following code into yor `config/additional_environment.rb`
```ruby
# Redmine DMSF's WebDAV
require File.dirname(__FILE__) + '/plugins/redmine_dmsf/lib/redmine_dmsf/webdav/custom_middleware'
config.middleware.insert_before ActionDispatch::Cookies, RedmineDmsf::Webdav::CustomMiddleware
```
### Installation in a sub-uri
In order to documents and folders are available via WebDAV in case that the Redmine is configured to be run in a sub-uri
it's necessary to add the following configuration option into your `config/additional_environment.rb`:
```ruby
config.relative_url_root = '/redmine'
```
## Uninstalling DMSF
Before uninstalling the DMSF plugin, please ensure that the Redmine instance is stopped.
1. `cd [redmine-install-dir]`
2. `rake redmine:plugins:migrate NAME=redmine_dmsf VERSION=0 RAILS_ENV=production`
3. `rm plugins/redmine_dmsf -Rf`
After these steps re-start your instance of Redmine.
## Contributing
If you've added something, why not share it. Fork the repository (github.com/danmunn/redmine_dmsf),
make the changes and send a pull request to the maintainers.
Changes with tests, and full documentation are preferred.
## Additional Documentation
[CHANGELOG.md](CHANGELOG.md) - Project changelog
---
Special thanks to <a href="https://jetbrains.com"><img src="jetbrains-variant-3.svg" alt="JetBrains logo" width="59" height="68"></a> for providing an excellent IDE.

View File

@ -1,156 +0,0 @@
# frozen_string_literal: true
# Redmine plugin for Document Management System "Features"
#
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
#
# 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.
require 'redmine'
require 'zip'
require "#{File.dirname(__FILE__)}/lib/redmine_dmsf"
def dmsf_init
# Administration menu extension
Redmine::MenuManager.map :admin_menu do |menu|
menu.push :dmsf_approvalworkflows, :dmsf_workflows_path,
caption: :label_dmsf_workflow_plural,
icon: 'workflows',
html: { class: 'icon icon-workflows' },
if: proc { |_| User.current.admin? }
end
# Project menu extension
Redmine::MenuManager.map :project_menu do |menu|
menu.push :dmsf, { controller: 'dmsf', action: 'show' },
caption: :menu_dmsf,
before: :documents,
param: :id,
html: { class: 'icon icon-dmsf' }
# New menu extension
next if defined?(EasyExtensions)
menu.push :dmsf_file, { controller: 'dmsf_upload', action: 'multi_upload' },
caption: :label_dmsf_new_top_level_document, parent: :new_object
menu.push :dmsf_folder, { controller: 'dmsf', action: 'new' },
caption: :label_dmsf_new_top_level_folder,
parent: :new_object
end
# Main menu extension
Redmine::MenuManager.map :top_menu do |menu|
menu.push :dmsf, { controller: 'dmsf', action: 'index' },
caption: :menu_dmsf,
html: { class: 'icon-dmsf', category: :rest_extension_modules },
if: proc {
User.current.allowed_to?(:view_dmsf_folders, nil, global: true) &&
ActiveRecord::Base.connection.data_source_exists?('settings') &&
!RedmineDmsf.dmsf_global_menu_disabled?
}
end
Redmine::AccessControl.map do |map|
map.project_module :dmsf do |pmap|
pmap.permission :view_dmsf_file_revision_accesses, {}, read: true
pmap.permission :view_dmsf_file_revisions, {}, read: true
pmap.permission :view_dmsf_folders, { dmsf: %i[show index] }, read: true
pmap.permission :user_preferences, { dmsf_state: [:user_pref_save] }, require: :member
pmap.permission(:view_dmsf_files,
{ dmsf: %i[entries_operation entries_email download_email_entries add_email append_email
autocomplete_for_user],
dmsf_files: %i[show view thumbnail],
dmsf_workflows: [:log] },
read: true)
pmap.permission :email_documents,
{ dmsf_public_urls: [:create] }
pmap.permission :folder_manipulation,
{ dmsf: %i[new create delete edit save edit_root save_root lock unlock notify_activate
notify_deactivate restore drop copymove],
dmsf_folder_permissions: %i[new append autocomplete_for_user],
dmsf_context_menus: [:dmsf] }
pmap.permission :file_manipulation,
{ dmsf_files: %i[create_revision lock unlock delete_revision obsolete_revision
notify_activate notify_deactivate restore],
dmsf_upload: %i[upload_files upload commit_files commit delete_dmsf_attachment
delete_dmsf_link_attachment multi_upload],
dmsf_links: %i[new create destroy restore autocomplete_for_project autocomplete_for_folder],
dmsf_context_menus: [:dmsf] }
pmap.permission :file_delete,
{ dmsf: %i[trash delete_entries empty_trash],
dmsf_files: [:delete],
dmsf_trash_context_menus: [:trash] }
pmap.permission :force_file_unlock, {}
pmap.permission :file_approval,
{ dmsf_workflows: %i[action new_action autocomplete_for_user start assign assignment] }
pmap.permission :manage_workflows,
{ dmsf_workflows: %i[index new create destroy show new_step add_step remove_step
reorder_steps update update_step delete_step edit] }
pmap.permission :display_system_folders, {}, read: true
# Watchers
pmap.permission :view_dmsf_file_watchers, {}, read: true
pmap.permission :add_dmsf_file_watchers, { watchers: %i[new create append autocomplete_for_user] }
pmap.permission :delete_dmsf_file_watchers, { watchers: :destroy }
pmap.permission :view_dmsf_folder_watchers, {}, read: true
pmap.permission :add_dmsf_folder_watchers, { watchers: %i[new create append autocomplete_for_user] }
pmap.permission :delete_dmsf_folder_watchers, { watchers: :destroy }
pmap.permission :view_project_watchers, {}, read: true
pmap.permission :add_project_watchers, { watchers: %i[new create append autocomplete_for_user] }
pmap.permission :delete_project_watchers, { watchers: :destroy }
end
end
# DMSF WebDAV digest token
Token.add_action :dmsf_webdav_digest, max_instances: 1, validity_time: nil
end
if defined?(EasyExtensions)
Rails.application.config.after_initialize do
dmsf_init
# Register panels for My page
EpmDmsfLockedDocuments.register_to_scope :user, plugin: :redmine_dmsf
EpmDmsfOpenApprovals.register_to_scope :user, plugin: :redmine_dmsf
EpmDmsfWatchedDocuments.register_to_scope :user, plugin: :redmine_dmsf
end
else
dmsf_init
end
Rails.application.configure do
# Rubyzip configuration
Zip.unicode_names = true
# DMS custom fields
after_easy_init do
CustomFieldsHelper::CUSTOM_FIELDS_TABS << { name: 'DmsfFileRevisionCustomField', partial: 'custom_fields/index',
label: :dmsf }
end
# Searchable modules
after_easy_init do
Redmine::Search.map do |search|
search.register :dmsf_files
search.register :dmsf_folders
end
end
# Activities
after_easy_init do
Redmine::Activity.register :dmsf_file_revision_accesses, default: false
Redmine::Activity.register :dmsf_file_revisions
end
if defined?(EasyExtensions)
require "#{File.dirname(__FILE__)}/lib/redmine_dmsf/webdav/custom_middleware"
config.middleware.insert_before ActionDispatch::Cookies, RedmineDmsf::Webdav::CustomMiddleware
end
end

View File

@ -4,19 +4,20 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
require "#{File.dirname(__FILE__)}/../../lib/redmine_dmsf/preview"
# Context menu controller # Context menu controller
class DmsfContextMenusController < ApplicationController class DmsfContextMenusController < ApplicationController

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
require "#{File.dirname(__FILE__)}/../../lib/redmine_dmsf/dmsf_zip" require "#{File.dirname(__FILE__)}/../../lib/redmine_dmsf/dmsf_zip"
@ -31,7 +30,7 @@ class DmsfController < ApplicationController
except: %i[new create edit_root save_root add_email append_email autocomplete_for_user digest except: %i[new create edit_root save_root add_email append_email autocomplete_for_user digest
reset_digest] reset_digest]
before_action :find_parent, only: %i[new create delete] before_action :find_parent, only: %i[new create delete]
before_action :permissions before_action :permissions?
# Also try to lookup folder by title if this is an API call # Also try to lookup folder by title if this is an API call
before_action :find_folder_by_title, only: [:show] before_action :find_folder_by_title, only: [:show]
before_action :query, only: %i[expand_folder show trash empty_trash index] before_action :query, only: %i[expand_folder show trash empty_trash index]
@ -51,7 +50,7 @@ class DmsfController < ApplicationController
helper :context_menus helper :context_menus
helper :watchers helper :watchers
def permissions def permissions?
if !DmsfFolder.permissions?(@folder, allow_system: false) if !DmsfFolder.permissions?(@folder, allow_system: false)
render_403 render_403
elsif @folder && @project && (@folder.project != @project) elsif @folder && @project && (@folder.project != @project)
@ -83,7 +82,7 @@ class DmsfController < ApplicationController
@file_manipulation_allowed = User.current.allowed_to?(:file_manipulation, @project) @file_manipulation_allowed = User.current.allowed_to?(:file_manipulation, @project)
@trash_enabled = @folder_manipulation_allowed && @file_manipulation_allowed @trash_enabled = @folder_manipulation_allowed && @file_manipulation_allowed
@notifications = Setting.notified_events.include?('dmsf_legacy_notifications') @notifications = Setting.notified_events.include?('dmsf_legacy_notifications')
@query.dmsf_folder_id = @folder ? @folder.id : nil @query.dmsf_folder_id = @folder&.id
@query.deleted = false @query.deleted = false
@query.sub_projects |= RedmineDmsf.dmsf_projects_as_subfolders? @query.sub_projects |= RedmineDmsf.dmsf_projects_as_subfolders?
if @folder&.deleted? || (params[:folder_title].present? && !@folder) if @folder&.deleted? || (params[:folder_title].present? && !@folder)
@ -93,6 +92,10 @@ class DmsfController < ApplicationController
if @query.valid? if @query.valid?
respond_to do |format| respond_to do |format|
format.html do format.html do
# Warn about searching in sub-folders
if @folder && params['set_filter'].present? && params['f'].present?
flash.now[:warning] = l(:notice_search_in_subfolders)
end
@dmsf_count = @query.dmsf_count @dmsf_count = @query.dmsf_count
@dmsf_pages = Paginator.new @dmsf_count, per_page_option, params['page'] @dmsf_pages = Paginator.new @dmsf_count, per_page_option, params['page']
render layout: !request.xhr? render layout: !request.xhr?
@ -130,14 +133,19 @@ class DmsfController < ApplicationController
end end
def download_email_entries def download_email_entries
# IE has got a tendency to cache files file_path = helpers.email_entry_tmp_file_path(params[:entry])
expires_in 0.years, 'must-revalidate' => true if File.exist?(file_path)
send_file( # IE has got a tendency to cache files
params[:path], expires_in 0.years, 'must-revalidate' => true
filename: 'Documents.zip', send_file(
type: 'application/zip', file_path,
disposition: 'attachment' filename: 'Documents.zip',
) type: 'application/zip',
disposition: 'attachment'
)
else
render_404
end
rescue StandardError => e rescue StandardError => e
flash[:error] = e.message flash[:error] = e.message
end end
@ -164,11 +172,11 @@ class DmsfController < ApplicationController
end end
if @selected_dir_links.present? && (params[:email_entries].present? || params[:download_entries].present?) if @selected_dir_links.present? && (params[:email_entries].present? || params[:download_entries].present?)
@selected_folders = DmsfLink.where(id: selected_dir_links).pluck(:target_id) | @selected_folders @selected_folders = DmsfLink.where(id: @selected_dir_links).pluck(:target_id) | @selected_folders
end end
if @selected_file_links.present? && (params[:email_entries].present? || params[:download_entries].present?) if @selected_file_links.present? && (params[:email_entries].present? || params[:download_entries].present?)
@selected_files = DmsfLink.where(id: selected_file_links).pluck(:target_id) | @selected_files @selected_files = DmsfLink.where(id: @selected_file_links).pluck(:target_id) | @selected_files
end end
begin begin
@ -204,12 +212,14 @@ class DmsfController < ApplicationController
end end
def entries_email def entries_email
file_path = helpers.email_entry_tmp_file_path(params[:email][:zipped_content])
params[:email][:zipped_content] = file_path
if params[:email][:to].strip.blank? if params[:email][:to].strip.blank?
flash[:error] = l(:error_email_to_must_be_entered) flash[:error] = l(:error_email_to_must_be_entered)
else else
DmsfMailer.deliver_send_documents @project, params[:email].permit!, User.current DmsfMailer.deliver_send_documents @project, params[:email].permit!, User.current
if File.exist?(params[:email][:zipped_content]) if File.exist?(file_path)
File.delete(params[:email][:zipped_content]) File.delete(file_path)
else else
flash[:error] = l(:header_minimum_filesize) flash[:error] = l(:header_minimum_filesize)
end end
@ -353,7 +363,7 @@ class DmsfController < ApplicationController
def lock def lock
if @folder.nil? if @folder.nil?
flash[:warning] = l(:warning_foler_unlockable) flash[:warning] = l(:warning_folder_unlockable)
elsif @folder.locked? elsif @folder.locked?
flash[:warning] = l(:warning_folder_already_locked) flash[:warning] = l(:warning_folder_already_locked)
else else
@ -365,7 +375,7 @@ class DmsfController < ApplicationController
def unlock def unlock
if @folder.nil? if @folder.nil?
flash[:warning] = l(:warning_foler_unlockable) flash[:warning] = l(:warning_folder_unlockable)
elsif !@folder.locked? elsif !@folder.locked?
flash[:warning] = l(:warning_folder_not_locked) flash[:warning] = l(:warning_folder_not_locked)
elsif @folder.locks[0].user == User.current || User.current.allowed_to?(:force_file_unlock, @project) elsif @folder.locks[0].user == User.current || User.current.allowed_to?(:force_file_unlock, @project)
@ -523,7 +533,7 @@ class DmsfController < ApplicationController
end end
@email_params = { @email_params = {
zipped_content: zipped_content, zipped_content: helpers.tmp_entry_identifier(zipped_content),
folders: selected_folders, folders: selected_folders,
files: selected_files, files: selected_files,
subject: "#{@project.name} #{l(:label_dmsf_file_plural).downcase}", subject: "#{@project.name} #{l(:label_dmsf_file_plural).downcase}",
@ -749,11 +759,7 @@ class DmsfController < ApplicationController
def query def query
retrieve_default_query true retrieve_default_query true
@query = if defined?(EasyExtensions) @query = retrieve_query DmsfQuery, true
retrieve_query_without_easy_extensions DmsfQuery, true
else
retrieve_query DmsfQuery, true
end
end end
def retrieve_default_query(use_session) def retrieve_default_query(use_session)

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Files controller # Files controller
class DmsfFilesController < ApplicationController class DmsfFilesController < ApplicationController
@ -26,7 +25,7 @@ class DmsfFilesController < ApplicationController
before_action :find_revision, only: %i[delete_revision obsolete_revision] before_action :find_revision, only: %i[delete_revision obsolete_revision]
before_action :find_folder, only: %i[delete create_revision] before_action :find_folder, only: %i[delete create_revision]
before_action :authorize before_action :authorize
before_action :permissions before_action :permissions?
accept_api_auth :show, :view, :delete, :create_revision accept_api_auth :show, :view, :delete, :create_revision
@ -39,7 +38,7 @@ class DmsfFilesController < ApplicationController
include QueriesHelper include QueriesHelper
def permissions def permissions?
render_403 if @file && !DmsfFolder.permissions?(@file.dmsf_folder, allow_system: true, file: true) render_403 if @file && !DmsfFolder.permissions?(@file.dmsf_folder, allow_system: true, file: true)
true true
end end
@ -82,7 +81,7 @@ class DmsfFilesController < ApplicationController
send_file pdf_preview, filename: "#{basename}.pdf", type: 'application/pdf', disposition: 'inline' send_file pdf_preview, filename: "#{basename}.pdf", type: 'application/pdf', disposition: 'inline'
# Text preview # Text preview
elsif !api_request? && params[:download].blank? && (@file.size <= Setting.file_max_size_displayed.to_i.kilobyte) && elsif !api_request? && params[:download].blank? && (@file.size <= Setting.file_max_size_displayed.to_i.kilobyte) &&
(@file.text? || @file.markdown? || @file.textile?) && !@file.html? (@file.text? || @file.markdown? || @file.textile?) && !@file.html? && formats.include?(:html)
@content = File.read(@revision.disk_file, mode: 'rb') @content = File.read(@revision.disk_file, mode: 'rb')
render action: 'document' render action: 'document'
# Offer the file for download # Offer the file for download
@ -335,17 +334,13 @@ class DmsfFilesController < ApplicationController
end end
def thumbnail def thumbnail
if @file.image? tbnail = @file.thumbnail(size: params[:size])
tbnail = @file.thumbnail(size: params[:size]) if tbnail
if tbnail if stale?(etag: tbnail)
if stale?(etag: tbnail) send_file tbnail,
send_file tbnail, filename: filename_for_content_disposition(@file.last_revision.disk_file),
filename: filename_for_content_disposition(@file.last_revision.disk_file), type: @file.last_revision.detect_content_type,
type: @file.last_revision.detect_content_type, disposition: 'inline'
disposition: 'inline'
end
else
head :not_found
end end
else else
head :not_found head :not_found

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Folder permissions controller # Folder permissions controller
class DmsfFolderPermissionsController < ApplicationController class DmsfFolderPermissionsController < ApplicationController
@ -25,11 +24,11 @@ class DmsfFolderPermissionsController < ApplicationController
if: -> { params[:dmsf_folder_id].present? } if: -> { params[:dmsf_folder_id].present? }
before_action :find_project before_action :find_project
before_action :authorize before_action :authorize
before_action :permissions before_action :permissions?
helper :dmsf helper :dmsf
def permissions def permissions?
render_403 unless DmsfFolder.permissions?(@dmsf_folder) render_403 unless DmsfFolder.permissions?(@dmsf_folder)
true true
end end

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Help controller # Help controller
class DmsfHelpController < ApplicationController class DmsfHelpController < ApplicationController

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Links controller # Links controller
class DmsfLinksController < ApplicationController class DmsfLinksController < ApplicationController
@ -26,7 +25,7 @@ class DmsfLinksController < ApplicationController
before_action :find_link_project before_action :find_link_project
before_action :find_folder, only: [:destroy] before_action :find_folder, only: [:destroy]
before_action :authorize before_action :authorize
before_action :permissions before_action :permissions?
protect_from_forgery except: :new protect_from_forgery except: :new
@ -34,7 +33,7 @@ class DmsfLinksController < ApplicationController
helper :dmsf helper :dmsf
def permissions def permissions?
render_403 if @dmsf_link && !DmsfFolder.permissions?(@dmsf_link.dmsf_folder) render_403 if @dmsf_link && !DmsfFolder.permissions?(@dmsf_link.dmsf_folder)
true true
end end

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Public URL controller # Public URL controller
class DmsfPublicUrlsController < ApplicationController class DmsfPublicUrlsController < ApplicationController

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# State controller # State controller
class DmsfStateController < ApplicationController class DmsfStateController < ApplicationController

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Upload controller # Upload controller
class DmsfUploadController < ApplicationController class DmsfUploadController < ApplicationController
@ -26,7 +25,7 @@ class DmsfUploadController < ApplicationController
before_action :authorize, except: %i[upload delete_dmsf_attachment delete_dmsf_link_attachment] before_action :authorize, except: %i[upload delete_dmsf_attachment delete_dmsf_link_attachment]
before_action :authorize_global, only: %i[upload delete_dmsf_attachment delete_dmsf_link_attachment] before_action :authorize_global, only: %i[upload delete_dmsf_attachment delete_dmsf_link_attachment]
before_action :find_folder, except: %i[upload commit delete_dmsf_attachment delete_dmsf_link_attachment] before_action :find_folder, except: %i[upload commit delete_dmsf_attachment delete_dmsf_link_attachment]
before_action :permissions, except: %i[upload commit delete_dmsf_attachment delete_dmsf_link_attachment] before_action :permissions?, except: %i[upload commit delete_dmsf_attachment delete_dmsf_link_attachment]
helper :custom_fields helper :custom_fields
helper :dmsf_workflows helper :dmsf_workflows
@ -34,7 +33,7 @@ class DmsfUploadController < ApplicationController
accept_api_auth :upload, :commit accept_api_auth :upload, :commit
def permissions def permissions?
render_403 unless DmsfFolder.permissions?(@folder) render_403 unless DmsfFolder.permissions?(@folder)
true true
end end
@ -76,7 +75,6 @@ class DmsfUploadController < ApplicationController
@attachment.author = User.current @attachment.author = User.current
@attachment.filename = params[:filename].presence || Redmine::Utils.random_hex(16) @attachment.filename = params[:filename].presence || Redmine::Utils.random_hex(16)
@attachment.content_type = params[:content_type].presence @attachment.content_type = params[:content_type].presence
@attachment.skip_description_required = true if defined?(EasyExtensions)
begin begin
Attachment.skip_callback(:commit, :after, :reuse_existing_file_if_possible, raise: false) Attachment.skip_callback(:commit, :after, :reuse_existing_file_if_possible, raise: false)
saved = @attachment.save saved = @attachment.save
@ -108,7 +106,7 @@ class DmsfUploadController < ApplicationController
@folder = DmsfFolder.visible.find_by(id: attachments[:folder_id]) if attachments[:folder_id].present? @folder = DmsfFolder.visible.find_by(id: attachments[:folder_id]) if attachments[:folder_id].present?
# standard file input uploads # standard file input uploads
uploaded_files = attachments.select { |key, _| key == 'uploaded_file' } uploaded_files = attachments.slice('uploaded_file')
uploaded_files.each_value do |uploaded_file| uploaded_files.each_value do |uploaded_file|
upload = DmsfUpload.create_from_uploaded_attachment(@project, @folder, uploaded_file) upload = DmsfUpload.create_from_uploaded_attachment(@project, @folder, uploaded_file)
next unless upload next unless upload

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# WorkflowsController # WorkflowsController
class DmsfWorkflowsController < ApplicationController class DmsfWorkflowsController < ApplicationController
@ -27,7 +26,7 @@ class DmsfWorkflowsController < ApplicationController
before_action :find_model_object, except: %i[create new index assign assignment] before_action :find_model_object, except: %i[create new index assign assignment]
before_action :find_project before_action :find_project
before_action :authorize_custom before_action :authorize_custom
before_action :permissions, only: %i[new_action assignment start] before_action :permissions?, only: %i[new_action assignment start]
before_action :approver_candidates, only: %i[remove_step show reorder_steps add_step] before_action :approver_candidates, only: %i[remove_step show reorder_steps add_step]
before_action :prevent_from_editing, only: %i[destroy remove_step update add_step update_step reorder_steps] before_action :prevent_from_editing, only: %i[destroy remove_step update add_step update_step reorder_steps]
@ -35,7 +34,7 @@ class DmsfWorkflowsController < ApplicationController
helper :dmsf helper :dmsf
def permissions def permissions?
revision = DmsfFileRevision.find_by(id: params[:dmsf_file_revision_id]) if params[:dmsf_file_revision_id].present? revision = DmsfFileRevision.find_by(id: params[:dmsf_file_revision_id]) if params[:dmsf_file_revision_id].present?
render_403 unless revision&.dmsf_file || DmsfFolder.permissions?(revision&.dmsf_file&.dmsf_folder) render_403 unless revision&.dmsf_file || DmsfFolder.permissions?(revision&.dmsf_file&.dmsf_folder)
true true
@ -77,7 +76,7 @@ class DmsfWorkflowsController < ApplicationController
{ dmsf_file_revision: revision, step_action: params[:step_action] }) { dmsf_file_revision: revision, step_action: params[:step_action] })
if (result.blank? || result.first) && action.save if (result.blank? || result.first) && action.save
if revision if revision
if @dmsf_workflow.try_finish revision, action, (params[:step_action].to_i / 10) if @dmsf_workflow.try_finish? revision, action, (params[:step_action].to_i / 10)
if revision.dmsf_file if revision.dmsf_file
begin begin
revision.dmsf_file.unlock!(force_file_unlock_allowed: true) unless RedmineDmsf.dmsf_keep_documents_locked? revision.dmsf_file.unlock!(force_file_unlock_allowed: true) unless RedmineDmsf.dmsf_keep_documents_locked?
@ -217,6 +216,7 @@ class DmsfWorkflowsController < ApplicationController
revision = DmsfFileRevision.find_by(id: params[:dmsf_file_revision_id]) revision = DmsfFileRevision.find_by(id: params[:dmsf_file_revision_id])
begin begin
if revision if revision
@project ||= revision.dmsf_file.project
revision.set_workflow(params[:dmsf_workflow_id], params[:action]) revision.set_workflow(params[:dmsf_workflow_id], params[:action])
revision.assign_workflow(params[:dmsf_workflow_id]) revision.assign_workflow(params[:dmsf_workflow_id])
if request.post? if request.post?
@ -414,8 +414,8 @@ class DmsfWorkflowsController < ApplicationController
if request.put? if request.put?
if @assigned if @assigned
flash[:error] = l(:error_dmsf_workflow_assigned) flash[:error] = l(:error_dmsf_workflow_assigned)
elsif !@dmsf_workflow.reorder_steps(params[:step].to_i, params[:dmsf_workflow][:position].to_i) else
flash[:error] = l(:notice_cannot_renumber_steps) @dmsf_workflow.reorder_steps params[:step].to_i, params[:dmsf_workflow][:position].to_i
end end
end end
respond_to do |format| respond_to do |format|

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Access error # Access error
class DmsfAccessError < StandardError class DmsfAccessError < StandardError

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Max file size error # Max file size error
class DmsfEmailMaxFileSizeError < StandardError class DmsfEmailMaxFileSizeError < StandardError

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Not found error # Not found error
class DmsfFileNotFoundError < StandardError class DmsfFileNotFoundError < StandardError

View File

@ -4,19 +4,18 @@
# #
# Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Lock error # Lock error
class DmsfLockError < StandardError class DmsfLockError < StandardError

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Parent error # Parent error
class DmsfParentError < StandardError class DmsfParentError < StandardError

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# File count exceeded # File count exceeded
class DmsfZipMaxFilesError < StandardError class DmsfZipMaxFilesError < StandardError

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Files helper # Files helper
module DmsfFilesHelper module DmsfFilesHelper

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Folders permissions helper # Folders permissions helper
module DmsfFolderPermissionsHelper module DmsfFolderPermissionsHelper

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
require 'tmpdir' require 'tmpdir'
require 'csv' require 'csv'
@ -25,14 +24,6 @@ require 'csv'
module DmsfHelper module DmsfHelper
include Redmine::I18n include Redmine::I18n
unless defined?(EasyExtensions)
def late_javascript_tag(content_or_options_with_block = nil, html_options = {}, &block)
javascript_tag content_or_options_with_block, html_options, &block
end
end
def self.temp_filename(filename) def self.temp_filename(filename)
filename = sanitize_filename(filename) filename = sanitize_filename(filename)
timestamp = DateTime.current.strftime('%y%m%d%H%M%S') timestamp = DateTime.current.strftime('%y%m%d%H%M%S')
@ -79,4 +70,22 @@ module DmsfHelper
url << '' url << ''
url.join '/' url.join '/'
end end
# Downloads zipped files securely by sanitizing the params[:entry]. Characters considered unsafe
# are replaced with a underscore. The file_path is joined with File.join instead of Rails.root.join to eliminate
# the risk of overriding the absolute path (Rails.root/tmp) with file_name when given as absoulte path too. This
# makes the path double secure.
def email_entry_tmp_file_path(entry)
sanitized_entry = DmsfHelper.sanitize_filename(entry)
file_name = "#{RedmineDmsf::DmsfZip::FILE_PREFIX}#{sanitized_entry}.zip"
Rails.root.join 'tmp', file_name
end
# Extracts the variable part of the temp file name to be used as identifier in the
# download email entries route.
def tmp_entry_identifier(zipped_content)
path = Pathname.new(zipped_content)
zipped_file = path.basename(path.extname).to_s
zipped_file.delete_prefix RedmineDmsf::DmsfZip::FILE_PREFIX
end
end end

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Links helper # Links helper
module DmsfLinksHelper module DmsfLinksHelper

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Queries helper # Queries helper
module DmsfQueriesHelper module DmsfQueriesHelper
@ -31,54 +30,61 @@ module DmsfQueriesHelper
case item.type case item.type
when 'file' when 'file'
file = DmsfFile.find_by(id: item.id) file = DmsfFile.find_by(id: item.id)
if file&.locked? if !item.deleted? && file&.locked?
return content_tag(:span, val) + return content_tag(:span, val) +
content_tag('span', sprite_icon('unlock', nil, icon_only: true, size: '12'), link_to(sprite_icon('unlock', nil, icon_only: true, size: '12'),
title: l(:title_locked_by_user, user: file.locked_by)) unlock_dmsf_files_path(id: file,
back_url: dmsf_folder_path(id: file.project,
folder_id: file.dmsf_folder)),
title: l(:title_locked_by_user, user: file.locked_by), class: 'icon icon-unlock')
end end
when 'folder' when 'folder'
folder = DmsfFolder.find_by(id: item.id) folder = DmsfFolder.find_by(id: item.id)
if folder&.locked? if !item.deleted? && folder&.locked?
return content_tag(:span, val) + return content_tag(:span, val) +
content_tag('span', sprite_icon('unlock', nil, icon_only: true, size: '12'), link_to(sprite_icon('unlock', nil, icon_only: true, size: '12'),
title: l(:title_locked_by_user, user: folder.locked_by)) unlock_dmsf_path(id: folder.project,
folder_id: folder.id,
back_url: dmsf_folder_path(id: folder.project,
folder_id: folder.dmsf_folder)),
title: l(:title_locked_by_user, user: folder.locked_by), class: 'icon icon-unlock')
end end
end end
content_tag(:span, val) + content_tag(:span, '', class: 'icon icon-none') content_tag(:span, val) + content_tag(:span, '', class: 'icon icon-none')
when :id when :id
case item.type case item.type
when 'file' when 'file'
if item&.deleted&.positive? if item.deleted?
h(value) h(value)
else else
link_to h(value), dmsf_file_path(id: item.id) link_to h(value), dmsf_file_path(id: item.id)
end end
when 'file-link' when 'file-link'
if item&.deleted&.positive? if item.deleted?
h(item.revision_id) h(item.revision_id)
else else
link_to h(item.revision_id), dmsf_file_path(id: item.revision_id) link_to h(item.revision_id), dmsf_file_path(id: item.revision_id)
end end
when 'folder' when 'folder'
if item.id if item.id
if item&.deleted&.positive? if item.deleted?
h(value) h(value)
else else
link_to h(value), edit_dmsf_path(id: item.project_id, folder_id: item.id) link_to h(value), edit_dmsf_path(id: item.project_id, folder_id: item.id)
end end
elsif item&.deleted&.positive? elsif item.deleted?
h(item.project_id) h(item.project_id)
else else
link_to h(item.project_id), edit_root_dmsf_path(id: item.project_id) link_to h(item.project_id), edit_root_dmsf_path(id: item.project_id)
end end
when 'folder-link' when 'folder-link'
if item.id if item.id
if item&.deleted&.positive? if item.deleted?
h(item.revision_id) h(item.revision_id)
else else
link_to h(item.revision_id), edit_dmsf_path(id: item.project_id, folder_id: item.revision_id) link_to h(item.revision_id), edit_dmsf_path(id: item.project_id, folder_id: item.revision_id)
end end
elsif item&.deleted&.positive? elsif item.deleted?
h(item.project_id) h(item.project_id)
else else
link_to h(item.project_id), edit_root_dmsf_path(id: item.project_id) link_to h(item.project_id), edit_root_dmsf_path(id: item.project_id)
@ -104,7 +110,8 @@ module DmsfQueriesHelper
when 'project' when 'project'
tag = h("[#{value}]") tag = h("[#{value}]")
tag = if item.project.module_enabled?(:dmsf) tag = if item.project.module_enabled?(:dmsf)
link_to(sprite_icon('folder', nil, icon_only: true), dmsf_folder_path(id: item.project)) + link_to(sprite_icon('folder', nil, icon_only: true), dmsf_folder_path(id: item.project),
class: 'icon icon-folder') +
link_to(tag, dmsf_folder_path(id: item.project), class: 'dmsf-label') link_to(tag, dmsf_folder_path(id: item.project), class: 'dmsf-label')
else else
sprite_icon 'folder', tag sprite_icon 'folder', tag
@ -124,9 +131,9 @@ module DmsfQueriesHelper
) + tag ) + tag
tag = content_tag('div', tag, class: 'row-control dmsf-row-control') tag = content_tag('div', tag, class: 'row-control dmsf-row-control')
end end
tag += content_tag('div', item.filename, class: 'dmsf-filename', title: l(:title_filename_for_download)) tag += content_tag('div', item.filename, class: 'dmsf-filename')
if item.project.watched_by?(User.current) if item.project.watched_by?(User.current)
tag += link_to(sprite_icon('fav', nil, icon_only: true, size: '12'), tag += link_to(sprite_icon('unwatch', nil, icon_only: true, size: '12'),
watch_path(object_type: 'project', object_id: item.project.id), watch_path(object_type: 'project', object_id: item.project.id),
title: l(:button_unwatch), title: l(:button_unwatch),
method: 'delete', method: 'delete',
@ -135,12 +142,12 @@ module DmsfQueriesHelper
tag tag
when 'folder' when 'folder'
if item&.deleted? if item&.deleted?
tag = sprite_icon('folder', h(value)) tag = content_tag(:span, sprite_icon('folder', h(value)), class: 'icon icon-folder')
else else
tag = link_to(sprite_icon('folder', nil, tag = link_to(sprite_icon('folder', nil,
icon_only: true, icon_only: true,
css_class: item.system ? 'dmsf-system' : ''), css_class: item.system ? 'dmsf-system' : ''),
dmsf_folder_path(id: item.project, folder_id: item.id)) dmsf_folder_path(id: item.project, folder_id: item.id), class: 'icon icon-folder')
tag += link_to(h(value), dmsf_folder_path(id: item.project, folder_id: item.id), class: 'dmsf-label') tag += link_to(h(value), dmsf_folder_path(id: item.project, folder_id: item.id), class: 'dmsf-label')
unless filter_any? unless filter_any?
path = expand_folder_dmsf_path path = expand_folder_dmsf_path
@ -160,7 +167,7 @@ module DmsfQueriesHelper
end end
tag += content_tag('div', item.filename, class: 'dmsf-filename', title: l(:title_filename_for_download)) tag += content_tag('div', item.filename, class: 'dmsf-filename', title: l(:title_filename_for_download))
if !item&.deleted? && item.watched_by?(User.current) if !item&.deleted? && item.watched_by?(User.current)
tag += link_to(sprite_icon('fav', nil, icon_only: true, size: '12'), tag += link_to(sprite_icon('unwatch', nil, icon_only: true, size: '12'),
watch_path(object_type: 'dmsf_folder', object_id: item.id), watch_path(object_type: 'dmsf_folder', object_id: item.id),
title: l(:button_unwatch), title: l(:button_unwatch),
method: 'delete', method: 'delete',
@ -169,19 +176,20 @@ module DmsfQueriesHelper
tag tag
when 'folder-link' when 'folder-link'
if item&.deleted? if item&.deleted?
tag = sprite_icon('folder', h(value)) tag = content_tag(:span, sprite_icon('folder', h(value)), class: 'icon icon-folder')
else else
# For links, we use revision_id containing dmsf_folder.id in fact # For links, we use revision_id containing dmsf_folder.id in fact
tag = link_to(sprite_icon('folder', nil, icon_only: true, css_class: 'dmsf-gray'), tag = link_to(sprite_icon('folder', nil, icon_only: true, css_class: 'dmsf-gray'),
dmsf_folder_path(id: item.project, folder_id: item.revision_id)) dmsf_folder_path(id: item.project, folder_id: item.revision_id), class: 'icon icon-folder')
tag += link_to(h(value), dmsf_folder_path(id: item.project, folder_id: item.revision_id), class: 'dmsf-label') tag += link_to(h(value), dmsf_folder_path(id: item.project, folder_id: item.revision_id), class: 'dmsf-label')
tag = content_tag('span', '', class: 'dmsf-expander') + tag unless filter_any? tag = content_tag('span', '', class: 'dmsf-expander') + tag unless filter_any?
end end
tag + content_tag('div', item.filename, class: 'dmsf-filename', title: l(:label_target_folder)) tag + content_tag('div', item.filename, class: 'dmsf-filename', title: l(:label_target_folder))
when 'file', 'file-link' when 'file', 'file-link'
icon_name = icon_for_mime_type(Redmine::MimeType.css_class_of(item.filename)) icon_name = icon_for_mime_type(Redmine::MimeType.css_class_of(item.filename))
icon_class = icon_class_for_mime_type(item.filename)
if item&.deleted? if item&.deleted?
tag = sprite_icon(icon_name, h(value)) tag = content_tag(:span, sprite_icon(icon_name, h(value)), class: "icon #{icon_class}")
else else
# For links, we use revision_id containing dmsf_file.id in fact # For links, we use revision_id containing dmsf_file.id in fact
file_view_url = url_for( file_view_url = url_for(
@ -189,7 +197,8 @@ module DmsfQueriesHelper
) )
content_type = Redmine::MimeType.of(item.filename) content_type = Redmine::MimeType.of(item.filename)
content_type = 'application/octet-stream' if content_type.blank? content_type = 'application/octet-stream' if content_type.blank?
options = { class: 'dmsf-label', 'data-downloadurl': "#{content_type}:#{h(value)}:#{file_view_url}" } options = { class: "dmsf-label icon #{icon_class}",
'data-downloadurl': "#{content_type}:#{h(value)}:#{file_view_url}" }
unless previewable?(item.filename, content_type) unless previewable?(item.filename, content_type)
options[:target] = '_blank' options[:target] = '_blank'
options[:rel] = 'noopener' options[:rel] = 'noopener'
@ -200,6 +209,7 @@ module DmsfQueriesHelper
css_class: item.type == 'file-link' ? 'dmsf-gray' : ''), css_class: item.type == 'file-link' ? 'dmsf-gray' : ''),
file_view_url, file_view_url,
options) options)
options[:class] = 'dmsf-label'
tag += link_to(h(value), file_view_url, options) tag += link_to(h(value), file_view_url, options)
tag = content_tag('span', '', class: 'dmsf-expander') + tag unless filter_any? tag = content_tag('span', '', class: 'dmsf-expander') + tag unless filter_any?
end end
@ -208,7 +218,7 @@ module DmsfQueriesHelper
filename = revision ? revision.formatted_name(member) : item.filename filename = revision ? revision.formatted_name(member) : item.filename
tag += content_tag('div', filename, class: 'dmsf-filename', title: l(:title_filename_for_download)) tag += content_tag('div', filename, class: 'dmsf-filename', title: l(:title_filename_for_download))
if (item.type == 'file') && !item&.deleted? && revision.dmsf_file&.watched_by?(User.current) if (item.type == 'file') && !item&.deleted? && revision.dmsf_file&.watched_by?(User.current)
tag += link_to(sprite_icon('fav', nil, icon_only: true, size: '12'), tag += link_to(sprite_icon('unwatch', nil, icon_only: true, size: '12'),
watch_path(object_type: 'dmsf_file', object_id: item.id), watch_path(object_type: 'dmsf_file', object_id: item.id),
title: l(:button_unwatch), title: l(:button_unwatch),
method: 'delete', method: 'delete',
@ -217,12 +227,13 @@ module DmsfQueriesHelper
tag tag
when 'url-link' when 'url-link'
if item&.deleted? if item&.deleted?
tag = sprite_icon('link', h(value)) tag = content_tag(:span, sprite_icon('link', h(value)), class: 'icon icon-link')
else else
tag = link_to(sprite_icon('link', nil, icon_only: true, css_class: 'dmsf-gray'), tag = link_to(sprite_icon('link', nil, icon_only: true, css_class: 'dmsf-gray'),
item.filename, item.filename,
target: '_blank', target: '_blank',
rel: 'noopener') rel: 'noopener',
class: 'icon icon-link')
tag += link_to(h(value), item.filename, target: '_blank', rel: 'noopener') tag += link_to(h(value), item.filename, target: '_blank', rel: 'noopener')
tag = content_tag('span', '', class: 'dmsf-expander') + tag unless filter_any? tag = content_tag('span', '', class: 'dmsf-expander') + tag unless filter_any?
end end
@ -240,7 +251,7 @@ module DmsfQueriesHelper
else else
log_dmsf_workflow_path project_id: item.project_id, id: item.workflow_id, dmsf_link_id: item.id log_dmsf_workflow_path project_id: item.project_id, id: item.workflow_id, dmsf_link_id: item.id
end end
text, names = DmsfWorkflow.workflow_info(item.workflow, item.workflow_id, item.revision_id) text, names = DmsfWorkflow.workflow_info(item.workflow, item.workflow_id, item.customized_id)
link_to h(text), url, remote: true, title: names link_to h(text), url, remote: true, title: names
else else
h(DmsfWorkflow.workflow_str(value.to_i)) h(DmsfWorkflow.workflow_str(value.to_i))
@ -301,4 +312,15 @@ module DmsfQueriesHelper
Redmine::MimeType.is_type?('text', filename) || Redmine::SyntaxHighlighting.filename_supported?(filename) Redmine::MimeType.is_type?('text', filename) || Redmine::SyntaxHighlighting.filename_supported?(filename)
end end
end end
def icon_class_for_mime_type(mime)
case Redmine::MimeType.of(mime)
when 'application/pdf'
'icon-pdf'
when 'text/plain'
'icon-txt'
else
'icon-file'
end
end
end end

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Upload helper # Upload helper
module DmsfUploadHelper module DmsfUploadHelper
@ -99,10 +98,6 @@ module DmsfUploadHelper
end end
FileUtils.mv committed_file[:tempfile_path], new_revision.disk_file(search_if_not_exists: false) FileUtils.mv committed_file[:tempfile_path], new_revision.disk_file(search_if_not_exists: false)
FileUtils.chmod 'u=wr,g=r', new_revision.disk_file(search_if_not_exists: false) FileUtils.chmod 'u=wr,g=r', new_revision.disk_file(search_if_not_exists: false)
if defined?(EasyExtensions)
# We need to trigger Xapian indexing after the file is moved to its target destination
file.touch
end
file.last_revision = new_revision file.last_revision = new_revision
files.push file files.push file
container.dmsf_file_added file if container && !new_object container.dmsf_file_added file if container && !new_object

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Workflows helper # Workflows helper
module DmsfWorkflowsHelper module DmsfWorkflowsHelper
@ -62,7 +61,7 @@ module DmsfWorkflowsHelper
def dmsf_workflows_for_select(project, dmsf_workflow_id) def dmsf_workflows_for_select(project, dmsf_workflow_id)
options = [['', -1]] options = [['', -1]]
DmsfWorkflow.active.sorted.where(['project_id = ? OR project_id IS NULL', project.id]).find_each do |wf| DmsfWorkflow.active.sorted.where(['project_id = ? OR project_id IS NULL', project&.id]).find_each do |wf|
options << if wf.project_id options << if wf.project_id
[wf.name, wf.id] [wf.name, wf.id]
else else

View File

@ -4,20 +4,21 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
require "#{File.dirname(__FILE__)}/../../lib/redmine_dmsf/lockable" require "#{File.dirname(__FILE__)}/../../lib/redmine_dmsf/lockable"
require "#{File.dirname(__FILE__)}/../../lib/redmine_dmsf/plugin"
require 'English' require 'English'
# File # File
@ -50,22 +51,56 @@ class DmsfFile < ApplicationRecord
case_sensitive: true case_sensitive: true
} }
acts_as_event title: proc { |o| o.name }, acts_as_event(
description: proc { |o| title: proc { |o|
desc = Redmine::Search.cache_store.fetch("DmsfFile-#{o.id}") @searched_revision = nil
if desc o.dmsf_file_revisions.visible.each do |r|
Redmine::Search.cache_store.delete("DmsfFile-#{o.id}") key = "DmsfFile-#{o.id}-#{r.id}"
else @desc = Redmine::Search.cache_store.fetch(key)
# Set desc to an empty string if o.description is nil next unless @desc
desc = o.description.nil? ? +'' : +o.description
desc += ' / ' if o.description.present? && o.last_revision.comment.present? Redmine::Search.cache_store.delete key
desc += o.last_revision.comment if o.last_revision.comment.present? @searched_revision = r
end break
desc end
}, if @searched_revision && (@searched_revision != o.last_revision)
url: proc { |o| { controller: 'dmsf_files', action: 'view', id: o } }, "#{o.name} (r#{@searched_revision.id})"
datetime: proc { |o| o.updated_at }, else
author: proc { |o| o.last_revision.user } o.name
end
},
description: proc { |o|
unless @desc
# Set desc to an empty string if o.description is nil
@desc = o.description.nil? ? +'' : +o.description
@desc += ' / ' if o.description.present? && o.last_revision.comment.present?
@desc += o.last_revision.comment if o.last_revision.comment.present?
end
@desc
},
url: proc { |o|
if @searched_revision
{ controller: 'dmsf_files', action: 'view', id: o.id, download: @searched_revision.id,
filename: o.name }
else
{ controller: 'dmsf_files', action: 'view', id: o.id, filename: o.name }
end
},
datetime: proc { |o|
if @searched_revision
@searched_revision.updated_at
else
o.updated_at
end
},
author: proc { |o|
if @searched_revision
@searched_revision.user
else
o.last_revision.user
end
}
)
acts_as_watchable acts_as_watchable
acts_as_searchable( acts_as_searchable(
columns: [ columns: [
@ -362,7 +397,7 @@ class DmsfFile < ApplicationRecord
results = scope.where(find_options).uniq.to_a results = scope.where(find_options).uniq.to_a
results.delete_if { |x| !DmsfFolder.permissions?(x.dmsf_folder) } results.delete_if { |x| !DmsfFolder.permissions?(x.dmsf_folder) }
if !options[:titles_only] && RedmineDmsf::Plugin.xapian_available? if !options[:titles_only] && RedmineDmsf::Plugin.lib_available?('xapian')
database = nil database = nil
begin begin
lang = RedmineDmsf.dmsf_stemming_lang lang = RedmineDmsf.dmsf_stemming_lang
@ -414,20 +449,21 @@ class DmsfFile < ApplicationRecord
filename = dochash['url'] filename = dochash['url']
next unless filename next unless filename
dmsf_attrs = filename.scan(%r{^([^/]+/[^_]+)_(\d+)_(.*)$}) dmsf_attrs = filename.scan(%r{^\d{4}/\d{2}/(\d{12}_(\d+)_.*)$})
id_attribute = 0 id_attribute = 0
id_attribute = dmsf_attrs[0][1] if dmsf_attrs.length.positive? id_attribute = dmsf_attrs[0][1] if dmsf_attrs.length.positive?
next if dmsf_attrs.empty? || id_attribute.to_i.zero? next if dmsf_attrs.empty? || id_attribute.to_i.zero?
next unless results.none? { |f| f.id.to_s == id_attribute }
dmsf_file = DmsfFile.visible.where(limit_options).find_by(id: id_attribute) dmsf_file = DmsfFile.visible.where(limit_options).find_by(id: id_attribute)
next unless dmsf_file && DmsfFolder.permissions?(dmsf_file.dmsf_folder) && next unless dmsf_file && DmsfFolder.permissions?(dmsf_file.dmsf_folder) &&
user.allowed_to?(:view_dmsf_files, dmsf_file.project) && user.allowed_to?(:view_dmsf_files, dmsf_file.project) &&
(project_ids.blank? || project_ids.include?(dmsf_file.project_id)) (project_ids.blank? || project_ids.include?(dmsf_file.project_id))
rev_id = DmsfFileRevision.where(dmsf_file_id: dmsf_file.id, disk_filename: dmsf_attrs[0][0])
.pick(:id)
if dochash['sample'] if dochash['sample']
Redmine::Search.cache_store.write("DmsfFile-#{dmsf_file.id}", dochash['sample'].force_encoding('UTF-8')) Redmine::Search.cache_store.write("DmsfFile-#{dmsf_file.id}-#{rev_id}",
dochash['sample'].force_encoding('UTF-8'))
end end
break if options[:limit].present? && results.count >= options[:limit] break if options[:limit].present? && results.count >= options[:limit]
@ -498,7 +534,7 @@ class DmsfFile < ApplicationRecord
end end
def thumbnailable? def thumbnailable?
image? && Redmine::Thumbnail.convert_available? Redmine::Thumbnail.convert_available? && (image? || (pdf? && Redmine::Thumbnail.gs_available?))
end end
def previewable? def previewable?
@ -569,15 +605,17 @@ class DmsfFile < ApplicationRecord
end end
def assigned?(user) def assigned?(user)
if last_revision&.dmsf_workflow return false unless last_revision&.dmsf_workflow
last_revision.dmsf_workflow.next_assignments(last_revision.id).each do |assignment|
return true if assignment.user == user last_revision.dmsf_workflow.next_assignments(last_revision.id).each do |assignment|
end return true if assignment.user == user
end end
false false
end end
def custom_value(custom_field) def custom_value(custom_field)
return nill unless last_revision
last_revision.custom_field_values.each do |cv| last_revision.custom_field_values.each do |cv|
return cv if cv.custom_field == custom_field return cv if cv.custom_field == custom_field
end end
@ -589,8 +627,6 @@ class DmsfFile < ApplicationRecord
end end
def thumbnail(options = {}) def thumbnail(options = {})
return unless image?
size = options[:size].to_i size = options[:size].to_i
if size.positive? if size.positive?
# Limit the number of thumbnails per image # Limit the number of thumbnails per image
@ -603,7 +639,7 @@ class DmsfFile < ApplicationRecord
size = 100 unless size.positive? size = 100 unless size.positive?
target = File.join(Attachment.thumbnails_storage_path, "#{id}_#{last_revision.digest}_#{size}.thumb") target = File.join(Attachment.thumbnails_storage_path, "#{id}_#{last_revision.digest}_#{size}.thumb")
begin begin
Redmine::Thumbnail.generate last_revision.disk_file.to_s, target, size Redmine::Thumbnail.generate last_revision.disk_file.to_s, target, size, pdf?
rescue StandardError => e rescue StandardError => e
Rails.logger.error do Rails.logger.error do
%(An error occured while generating thumbnail for #{last_revision.disk_file} to #{target}\n %(An error occured while generating thumbnail for #{last_revision.disk_file} to #{target}\n
@ -625,61 +661,10 @@ class DmsfFile < ApplicationRecord
def container def container
return unless dmsf_folder&.system && dmsf_folder.title&.match(/(^\d+)/) return unless dmsf_folder&.system && dmsf_folder.title&.match(/(^\d+)/)
issue_id = Regexp.last_match(1) id = Regexp.last_match(1).to_i
parent = dmsf_folder.dmsf_folder case dmsf_folder.dmsf_folder&.title
Regexp.last_match(1).constantize.visible.find_by(id: issue_id) if parent&.title&.match(/^\.(.+)s/) when '.Issues'
end Issue.visible.find_by id: id
if defined?(EasyExtensions)
include Redmine::Utils::Shell
def sheet?
case File.extname(last_revision&.disk_filename)
when '.ods', # LibreOffice
'.xls', '.xlsx', '.xlsm' # MS Office
true
else
false
end
end
def content
if File.exist?(last_revision.disk_file)
if File.size?(last_revision.disk_file) < 5.megabytes
tmp = Rails.root.join('tmp')
if sheet?
cmd = "#{shell_quote(RedmineDmsf::Preview::OFFICE_BIN)} --convert-to 'csv' \
--outdir #{shell_quote(tmp.to_s)} #{shell_quote(last_revision.disk_file)}"
text_file = tmp.join(last_revision.disk_filename).sub_ext('.csv')
elsif office_doc?
cmd = "#{shell_quote(RedmineDmsf::Preview::OFFICE_BIN)} --convert-to 'txt:Text (encoded):UTF8' \
--outdir #{shell_quote(tmp.to_s)} #{shell_quote(last_revision.disk_file)}"
text_file = tmp.join(last_revision.disk_filename).sub_ext('.txt')
elsif pdf?
text_file = tmp.join(last_revision.disk_filename).sub_ext('.txt')
cmd = "pdftotext -q #{shell_quote(last_revision.disk_file)} #{shell_quote(text_file.to_s)}"
elsif text?
return File.read(last_revision.disk_file)
end
if cmd
if system(cmd) && File.exist?(text_file)
text = File.read(text_file)
FileUtils.rm_f text_file
return text
else
Rails.logger.error "Conversion to text failed (#{$CHILD_STATUS}):\nCommand: #{cmd}"
end
end
else
Rails.logger.warn "File #{last_revision.disk_file} is to big to be indexed (>5MB)"
end
end
description
rescue StandardError => e
Rails.logger.warn e.message
''
ensure
FileUtils.rm_f(text_file) if text_file.present?
end end
end end

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# File revision # File revision
class DmsfFileRevision < ApplicationRecord class DmsfFileRevision < ApplicationRecord
@ -119,16 +118,12 @@ class DmsfFileRevision < ApplicationRecord
remove_extension(filename).gsub(/_+/, ' ') remove_extension(filename).gsub(/_+/, ' ')
end end
def self.easy_activity_custom_project_scope(scope, options, _)
scope.where(dmsf_files: { project_id: options[:project_ids] })
end
def delete(commit: false, force: true) def delete(commit: false, force: true)
if dmsf_file.locked_for_user? if dmsf_file.locked_for_user?
errors.add :base, l(:error_file_is_locked) errors.add :base, l(:error_file_is_locked)
return false return false
end end
if !commit && (!force && (dmsf_file.dmsf_file_revisions.length <= 1)) if !commit && !force && (dmsf_file.dmsf_file_revisions.length <= 1)
errors.add :base, l(:error_at_least_one_revision_must_be_present) errors.add :base, l(:error_at_least_one_revision_must_be_present)
return false return false
end end
@ -270,6 +265,15 @@ class DmsfFileRevision < ApplicationRecord
wf.assign(id) if wf && id wf.assign(id) if wf && id
end end
def reset_workflow
self.workflow = nil
self.dmsf_workflow_id = nil
self.dmsf_workflow_assigned_by_user_id = nil
self.dmsf_workflow_assigned_at = nil
self.dmsf_workflow_started_by_user_id = nil
self.dmsf_workflow_started_at = nil
end
def increase_version(version_to_increase) def increase_version(version_to_increase)
# Patch version # Patch version
self.patch_version = case version_to_increase self.patch_version = case version_to_increase

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# File revision access # File revision access
class DmsfFileRevisionAccess < ApplicationRecord class DmsfFileRevisionAccess < ApplicationRecord

View File

@ -5,20 +5,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
# #
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# File revision access query # File revision access query
class DmsfFileRevisionAccessQuery < Query class DmsfFileRevisionAccessQuery < Query

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Custom field # Custom field
class DmsfFileRevisionCustomField < CustomField class DmsfFileRevisionCustomField < CustomField

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
require "#{File.dirname(__FILE__)}/../../lib/redmine_dmsf/lockable" require "#{File.dirname(__FILE__)}/../../lib/redmine_dmsf/lockable"
@ -117,27 +116,20 @@ class DmsfFolder < ApplicationRecord
# System folder? # System folder?
if folder&.system if folder&.system
return false unless allow_system || User.current.allowed_to?(:display_system_folders, folder.project) return false unless allow_system || User.current.allowed_to?(:display_system_folders, folder.project)
return false if folder.title != '.Issues' && !folder.issue&.visible?(User.current)
return false if (folder.title != '.Issues') && !folder.issue&.visible?(User.current)
end end
# Permissions to the folder? # Permissions to the folder?
if folder.dmsf_folder_permissions.any? if folder.dmsf_folder_permissions.any?
role_ids = User.current.roles_for_project(folder.project).map(&:id) role_ids = User.current.roles_for_project(folder.project).map(&:id)
role_permission_ids = folder.dmsf_folder_permissions.roles.map(&:object_id) role_permission_ids = folder.dmsf_folder_permissions.roles.map(&:object_id)
if RUBY_VERSION < '3.1' # intersect? method added in Ruby 3.1, though we support 2.7 too return true if role_ids.intersect?(role_permission_ids)
return true if role_ids.intersection(role_permission_ids).any?
elsif role_ids.intersect?(role_permission_ids)
return true
end
principal_ids = folder.dmsf_folder_permissions.users.map(&:object_id) principal_ids = folder.dmsf_folder_permissions.users.map(&:object_id)
return true if principal_ids.include?(User.current.id) return true if principal_ids.include?(User.current.id)
user_group_ids = User.current.groups.map(&:id) user_group_ids = User.current.groups.map(&:id)
if RUBY_VERSION < '3.1' # intersect? method added in Ruby 3.1, though we support 2.7 too principal_ids.intersect? user_group_ids
principal_ids.intersection(user_group_ids).any?
else
principal_ids.intersect?(user_group_ids)
end
else else
DmsfFolder.permissions? folder.dmsf_folder, allow_system: allow_system, file: file DmsfFolder.permissions? folder.dmsf_folder, allow_system: allow_system, file: file
end end

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Folder permission # Folder permission
class DmsfFolderPermission < ApplicationRecord class DmsfFolderPermission < ApplicationRecord

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Link class # Link class
class DmsfLink < ApplicationRecord class DmsfLink < ApplicationRecord
@ -111,7 +110,7 @@ class DmsfLink < ApplicationRecord
link.name = name link.name = name
link.external_url = external_url link.external_url = external_url
link.project_id = project.id link.project_id = project.id
link.dmsf_folder_id = folder ? folder.id : nil link.dmsf_folder_id = folder&.id
link.user = User.current link.user = User.current
link.save! link.save!
link link

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
require 'simple_enum' require 'simple_enum'

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
require 'mailer' require 'mailer'

View File

@ -5,19 +5,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Public URL # Public URL
class DmsfPublicUrl < ApplicationRecord class DmsfPublicUrl < ApplicationRecord

View File

@ -4,20 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
# #
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Query # Query
class DmsfQuery < Query class DmsfQuery < Query
@ -28,7 +26,7 @@ class DmsfQuery < Query
# Standard columns # Standard columns
self.available_columns = [ self.available_columns = [
QueryColumn.new(:id, sortable: 'id', caption: +'#'), QueryColumn.new(:id, sortable: 'id', caption: :label_column_id),
DmsfQueryTitleColumn.new(:title, sortable: 'title', frozen: true, caption: :label_column_title), DmsfQueryTitleColumn.new(:title, sortable: 'title', frozen: true, caption: :label_column_title),
QueryColumn.new(:size, sortable: 'size', caption: :label_column_size), QueryColumn.new(:size, sortable: 'size', caption: :label_column_size),
DmsfQueryModifiedColumn.new(:modified, sortable: 'updated', caption: :label_column_modified), DmsfQueryModifiedColumn.new(:modified, sortable: 'updated', caption: :label_column_modified),

View File

@ -4,20 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
# #
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
require 'query' require 'query'

View File

@ -4,20 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
# #
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
require 'query' require 'query'

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
require 'query' require 'query'

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Upload # Upload
class DmsfUpload class DmsfUpload

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Workflow # Workflow
class DmsfWorkflow < ApplicationRecord class DmsfWorkflow < ApplicationRecord
@ -110,7 +109,6 @@ class DmsfWorkflow < ApplicationRecord
end end
end end
end end
true
end end
def delegates(query, dmsf_workflow_step_assignment_id, dmsf_file_revision_id) def delegates(query, dmsf_workflow_step_assignment_id, dmsf_file_revision_id)
@ -187,7 +185,7 @@ class DmsfWorkflow < ApplicationRecord
end end
end end
def try_finish(revision, action, user_id) def try_finish?(revision, action, user_id)
case action.action case action.action
when DmsfWorkflowStepAction::ACTION_APPROVE when DmsfWorkflowStepAction::ACTION_APPROVE
assignments = next_assignments(revision.id) assignments = next_assignments(revision.id)
@ -217,7 +215,7 @@ class DmsfWorkflow < ApplicationRecord
def copy_to(project, name = nil) def copy_to(project, name = nil)
new_wf = dup new_wf = dup
new_wf.name = name if name new_wf.name = name if name
new_wf.project_id = project ? project.id : nil new_wf.project_id = project&.id
new_wf.author = User.current new_wf.author = User.current
if new_wf.save if new_wf.save
dmsf_workflow_steps.each do |step| dmsf_workflow_steps.each do |step|

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Workflow step # Workflow step
class DmsfWorkflowStep < ApplicationRecord class DmsfWorkflowStep < ApplicationRecord

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Workflow step action # Workflow step action
class DmsfWorkflowStepAction < ApplicationRecord class DmsfWorkflowStepAction < ApplicationRecord

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Workflow step assignment # Workflow step assignment
class DmsfWorkflowStepAssignment < ApplicationRecord class DmsfWorkflowStepAssignment < ApplicationRecord

View File

@ -1,38 +0,0 @@
# frozen_string_literal: true
# Redmine plugin for Document Management System "Features"
#
# Karel Pičman <karel.picman@kontron.com>
#
# 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.
# My locked documents - My page panel
class EpmDmsfLockedDocuments < EasyPageModule
def category_name
@category_name ||= 'easy_dms'
end
def get_show_data(_settings, _user, _page_context = {})
{}
end
def get_edit_data(_settings, _user, _page_context = {})
{}
end
def registered_in_plugin
'redmine_dmsf'
end
end

View File

@ -1,38 +0,0 @@
# frozen_string_literal: true
# Redmine plugin for Document Management System "Features"
#
# Karel Pičman <karel.picman@kontron.com>
#
# 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.
# My open approvals - My page panel
class EpmDmsfOpenApprovals < EasyPageModule
def category_name
@category_name ||= 'easy_dms'
end
def get_show_data(_settings, _user, _page_context = {})
{}
end
def get_edit_data(_settings, _user, _page_context = {})
{}
end
def registered_in_plugin
'redmine_dmsf'
end
end

View File

@ -1,38 +0,0 @@
# frozen_string_literal: true
# Redmine plugin for Document Management System "Features"
#
# Karel Pičman <karel.picman@kontron.com>
#
# 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.
# My open approvals - My page panel
class EpmDmsfWatchedDocuments < EasyPageModule
def category_name
@category_name ||= 'easy_dms'
end
def get_show_data(_settings, _user, _page_context = {})
{}
end
def get_edit_data(_settings, _user, _page_context = {})
{}
end
def registered_in_plugin
'redmine_dmsf'
end
end

View File

@ -4,29 +4,28 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# File extension validator according to the Redmine whitelist and blacklist for file upload. # File extension validator according to the Redmine whitelist and blacklist for file upload.
class DmsfFileExtensionValidator < ActiveModel::EachValidator class DmsfFileExtensionValidator < ActiveModel::EachValidator
include Redmine::I18n include Redmine::I18n
def validate_each(record, attribute, value) def validate_each(record, attribute, value)
return true unless attribute.to_s == 'name' return unless attribute.to_s == 'name'
extension = File.extname(value) extension = File.extname(value)
return true if Attachment.valid_extension?(extension) return if Attachment.valid_extension?(extension)
record.errors.add(:base, l(:error_attachment_extension_not_allowed, extension: extension)) record.errors.add(:base, l(:error_attachment_extension_not_allowed, extension: extension))
end end

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# File name validator # File name validator
class DmsfFileNameValidator < ActiveModel::EachValidator class DmsfFileNameValidator < ActiveModel::EachValidator

View File

@ -4,19 +4,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Folder parent validator # Folder parent validator
class DmsfFolderParentValidator < ActiveModel::EachValidator class DmsfFolderParentValidator < ActiveModel::EachValidator
@ -26,10 +25,9 @@ class DmsfFolderParentValidator < ActiveModel::EachValidator
while folder while folder
if folder == record if folder == record
record.errors.add attribute, :invalid record.errors.add attribute, :invalid
return false return
end end
folder = folder.dmsf_folder folder = folder.dmsf_folder
end end
true
end end
end end

View File

@ -4,33 +4,29 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Max file size validator # Max file size validator
class DmsfMaxFileSizeValidator < ActiveModel::EachValidator class DmsfMaxFileSizeValidator < ActiveModel::EachValidator
include Redmine::I18n include Redmine::I18n
def validate_each(record, attribute, value) def validate_each(record, attribute, value)
if value && (value > Setting.attachment_max_size.to_i.kilobytes) return unless value && (value > Setting.attachment_max_size.to_i.kilobytes)
record.errors.add attribute,
l(:error_attachment_too_big, max_size: ActiveSupport::NumberHelper.number_to_human_size( record.errors.add attribute,
Setting.attachment_max_size.to_i.kilobytes l(:error_attachment_too_big, max_size: ActiveSupport::NumberHelper.number_to_human_size(
)) Setting.attachment_max_size.to_i.kilobytes
false ))
else
true
end
end end
end end

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# URL validator # URL validator
class DmsfUrlValidator < ActiveModel::EachValidator class DmsfUrlValidator < ActiveModel::EachValidator

View File

@ -4,19 +4,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
# Workflow name validator # Workflow name validator
class DmsfWorkflowNameValidator < ActiveModel::EachValidator class DmsfWorkflowNameValidator < ActiveModel::EachValidator

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<h3 class="title"><%= l(:label_email_address_add) %></h3> <h3 class="title"><%= l(:label_email_address_add) %></h3>
@ -23,7 +22,7 @@
<%= form_tag(append_email_dmsf_path(id: @project), remote: true, method: :post, id: 'new-user-form') do %> <%= form_tag(append_email_dmsf_path(id: @project), remote: true, method: :post, id: 'new-user-form') do %>
<%= hidden_field_tag :project_id, @project.id %> <%= hidden_field_tag :project_id, @project.id %>
<p><%= label_tag 'user_search', l(:label_user_search) %><%= text_field_tag 'user_search', nil %></p> <p><%= label_tag 'user_search', l(:label_user_search) %><%= text_field_tag 'user_search', nil %></p>
<%= late_javascript_tag "observeSearchfield('user_search', 'users_for_users', '#{ escape_javascript url_for( <%= javascript_tag "observeSearchfield('user_search', 'users_for_users', '#{ escape_javascript url_for(
controller: 'dmsf', action: 'autocomplete_for_user') }')" %> controller: 'dmsf', action: 'autocomplete_for_user') }')" %>
<div id="users_for_watcher"> <div id="users_for_watcher">
<%= render_principals_for_new_email @principals %> <%= render_principals_for_new_email @principals %>

View File

@ -3,19 +3,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% if object %> <% if object %>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% if @project %> <% if @project %>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<p> <p>

View File

@ -3,19 +3,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% html_title l(:dmsf) %> <% html_title l(:dmsf) %>
@ -32,7 +31,7 @@
class: 'icon icon-add', data: { cy: 'button__create-folder--dmsf' } %> class: 'icon icon-add', data: { cy: 'button__create-folder--dmsf' } %>
<% end %> <% end %>
<% end %> <% end %>
<% if defined?(EasyExtensions) %> <%= actions_dropdown do %>
<%= render partial: 'dmsf_context_menus/main', locals: { <%= render partial: 'dmsf_context_menus/main', locals: {
folder_manipulation_allowed: @folder_manipulation_allowed, folder_manipulation_allowed: @folder_manipulation_allowed,
system_folder: @system_folder, system_folder: @system_folder,
@ -41,19 +40,7 @@
locked: @locked, locked: @locked,
file_manipulation_allowed: @file_manipulation_allowed, file_manipulation_allowed: @file_manipulation_allowed,
trash_enabled: @trash_enabled, trash_enabled: @trash_enabled,
notifications: @notifications } %> notifications: @notifications} %>
<% else %>
<%= actions_dropdown do %>
<%= render partial: 'dmsf_context_menus/main', locals: {
folder_manipulation_allowed: @folder_manipulation_allowed,
system_folder: @system_folder,
folder: @folder,
project: @project,
locked: @locked,
file_manipulation_allowed: @file_manipulation_allowed,
trash_enabled: @trash_enabled,
notifications: @notifications} %>
<% end %>
<% end %> <% end %>
</div> </div>
<% end %> <% end %>
@ -104,24 +91,6 @@
<% end %> <% end %>
<% end %> <% end %>
<% if defined?(EasyExtensions) %> <% javascript_tag do %>
<%= late_javascript_tag do %>
$(function() {
$("p.buttons").addClass("filter-buttons form-actions");
let buttonApply = $("p.filter-buttons > a.icon-checked");
buttonApply.addClass("button-positive");
buttonApply.text("<%= l('easy_query.button_apply.issue') %>");
let buttonClear = $("p.filter-buttons > a.icon-reload");
buttonClear.addClass("button-negative");
buttonClear.text("<%= l('easy_query.label.default_filters') %>");
$("p.filter-buttons > a.icon-save").addClass("button");
$("p.filter-buttons > a.icon-edit").addClass("button");
$("p.filter-buttons > a.icon-del").addClass("button");
$("#query_form_with_buttons > p.buttons").show();
});
<% end %>
<% end %>
<% late_javascript_tag do %>
"$('#ajax-indicator').hide();" "$('#ajax-indicator').hide();"
<% end %> <% end %>

View File

@ -3,29 +3,28 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<h2> <h2 class="dmsf-header">
<% if folder %> <% if folder %>
<%= link_to l(:link_documents), dmsf_folder_path(id: @project) %> <%= link_to l(:link_documents), dmsf_folder_path(id: @project) %>
<% folder.dmsf_path.each do |path_element| %> <% folder.dmsf_path.each do |path_element| %>
/ /
<% if filename.blank? && (path_element == folder.dmsf_path.last) %> <% if filename.blank? && (path_element == folder.dmsf_path.last) %>
<%= h(path_element.title) %> <%= h(path_element.title) %>
<% else %> <% else %>
<%= link_to h(path_element.title), dmsf_folder_path(id: @project, folder_id: path_element) %> <%= link_to h(path_element.title), dmsf_folder_path(id: @project, folder_id: path_element) %>
<% end %> <% end %>
<% end %> <% end %>
@ -47,4 +46,4 @@
<% if title %> <% if title %>
&#187; <%= title %> &#187; <%= title %>
<% end %> <% end %>
</h2> </h2>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% query_options = nil unless defined?(query_options) %> <% query_options = nil unless defined?(query_options) %>
@ -28,15 +27,9 @@
<table class="list dmsf odd-even <%= query.css_classes %> context-menu-container" data-hascontextmenu="true"> <table class="list dmsf odd-even <%= query.css_classes %> context-menu-container" data-hascontextmenu="true">
<thead> <thead>
<tr> <tr>
<% if defined?(EasyExtensions) %> <th class="checkbox hide-when-print">
<%# Easy checkbox %> <%= check_box_tag 'check_all', '', false, class: 'toggle-selection', title: "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
<%= content_tag :th, link_to_function('', 'EASY.contextMenu.toggleIssuesSelection($(this))', </th>
title: "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", class: 'icon icon-checked') %>
<% else %>
<th class="checkbox hide-when-print">
<%= check_box_tag 'check_all', '', false, class: 'toggle-selection', title: "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
</th>
<% end %>
<% query.inline_columns.each do |column| %> <% query.inline_columns.each do |column| %>
<%= column_header(query, column, query_options) %> <%= column_header(query, column, query_options) %>
<% end %> <% end %>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% options = {} %> <% options = {} %>
@ -40,24 +39,21 @@
<%= check_box_tag('ids[]', "#{node.type}-#{node.id}", false, id: nil) unless node.system %> <%= check_box_tag('ids[]', "#{node.type}-#{node.id}", false, id: nil) unless node.system %>
</td> </td>
<% query.inline_columns.each do |column| %> <% query.inline_columns.each do |column| %>
<%= content_tag 'td', column_content(column, node), class: column.css_classes %> <% classes = column.css_classes.to_s.dup %>
<% classes << ' dmsf-gray' if node.type.match?(/link$/) %>
<% classes << ' dmsf-system' if node.system %>
<%= content_tag 'td', column_content(column, node), class: classes %>
<% end %> <% end %>
<td class="buttons"> <td class="buttons">
<% unless node.system %> <% unless node.system %>
<% if defined?(EasyExtensions) %> <%= link_to_context_menu %>
<%= link_to '', '#', title: l(:button_actions),
class: 'icon-only icon-actions js-contextmenu icon-more-horiz',
data: { cy: "icon__more_horiz--#{node.type}_#{node.id}" } %>
<% else %>
<%= link_to_context_menu %>
<% end %>
<% end %> <% end %>
</td> </td>
</tr> </tr>
<% end %> <% end %>
<% unless query.deleted || query&.project.nil? %> <% unless query.deleted || query&.project.nil? %>
<%= late_javascript_tag do %> <%= javascript_tag do %>
$(function() { $(function() {
$("table.dmsf tr").removeClass("ui-draggable-dragging ui-droppable-active ui-droppable-hover ui-draggable-handle"); $("table.dmsf tr").removeClass("ui-draggable-dragging ui-droppable-active ui-droppable-hover ui-draggable-handle");
$(".dmsf-draggable").draggable({ $(".dmsf-draggable").draggable({
@ -111,4 +107,4 @@
}); });
}); });
<% end %> <% end %>
<% end %> <% end %>

View File

@ -3,19 +3,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<%= render_sidebar_queries DmsfQuery, @project %> <%= render_sidebar_queries DmsfQuery, @project %>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# modify it under the terms of the GNU General Public License #
# as published by the Free Software Foundation; either version 2 # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# of the License, or (at your option) any later version. # 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 # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# GNU General Public License for more details. # more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# along with this program; if not, write to the Free Software # <https://www.gnu.org/licenses/>.
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%> %>
var modal = $('#ajax-modal'); var modal = $('#ajax-modal');

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# modify it under the terms of the GNU General Public License #
# as published by the Free Software Foundation; either version 2 # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# of the License, or (at your option) any later version. # 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 # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# GNU General Public License for more details. # more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# along with this program; if not, write to the Free Software # <https://www.gnu.org/licenses/>.
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
%> %>
let to = $('#email_to'); let to = $('#email_to');

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
$('#users_for_watcher').html('<%= escape_javascript(render_principals_for_new_email(@principals)) %>'); $('#users_for_watcher').html('<%= escape_javascript(render_principals_for_new_email(@principals)) %>');

View File

@ -3,19 +3,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<%= render partial: '/dmsf/path', locals: { folder: @folder, filename: nil, title: nil } %> <%= render partial: '/dmsf/path', locals: { folder: @folder, filename: nil, title: nil } %>
@ -57,7 +56,7 @@
<% end %> <% end %>
<% end %> <% end %>
<%= late_javascript_tag do %> <%= javascript_tag do %>
$('#move_button').click(function(event) { $('#move_button').click(function(event) {
$('input#copy_entries').remove() $('input#copy_entries').remove()
}); });

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
$('#ajax-modal').html('<%= escape_javascript render partial: 'digest' %>'); $('#ajax-modal').html('<%= escape_javascript render partial: 'digest' %>');

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
throw new Error("<%= j flash[:error] %>"); throw new Error("<%= j flash[:error] %>");

View File

@ -3,19 +3,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% html_title l(:dmsf) %> <% html_title l(:dmsf) %>
@ -34,7 +33,7 @@
back_url: edit_dmsf_url(id: @project, folder_id: @folder)), back_url: edit_dmsf_url(id: @project, folder_id: @folder)),
title: l(:title_lock_file), class: 'icon icon-lock' %> title: l(:title_lock_file), class: 'icon icon-lock' %>
<% end %> <% end %>
<% if defined?(EasyExtensions) %> <%= actions_dropdown do %>
<%= render partial: 'dmsf_context_menus/folder', <%= render partial: 'dmsf_context_menus/folder',
locals: { dmsf_folder: @folder, locals: { dmsf_folder: @folder,
locked: @folder.locked?, locked: @folder.locked?,
@ -48,22 +47,6 @@
notifications: @notifications, notifications: @notifications,
back_url: edit_dmsf_url(id: @project, folder_id: @folder) back_url: edit_dmsf_url(id: @project, folder_id: @folder)
} %> } %>
<% else %>
<%= actions_dropdown do %>
<%= render partial: 'dmsf_context_menus/folder',
locals: { dmsf_folder: @folder,
locked: @folder.locked?,
allowed: true,
dmsf_link: nil,
project: @project,
folder: @folder.dmsf_folder,
edit: true,
unlockable: @folder.unlockable? && (!@folder.locked_for_user? || User.current.allowed_to?(:force_file_unlock, @project)),
email_allowed: User.current.allowed_to?(:email_documents, @project),
notifications: @notifications,
back_url: edit_dmsf_url(id: @project, folder_id: @folder)
} %>
<% end %>
<% end %> <% end %>
<% end %> <% end %>
</div> </div>

View File

@ -3,19 +3,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% html_title(l(:dmsf)) %> <% html_title(l(:dmsf)) %>

View File

@ -3,19 +3,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% html_title l(:dmsf) %> <% html_title l(:dmsf) %>
@ -53,8 +52,7 @@
<p> <p>
<%= label_tag '', l(:label_email_documents) %> <%= label_tag '', l(:label_email_documents) %>
<span> <span>
<%= link_to 'Documents.zip', download_email_entries_path(id: @project, folder_id: @folder, <%= link_to 'Documents.zip', download_email_entries_path(id: @project, folder_id: @folder, entry: @email_params[:zipped_content]) %>
path: @email_params[:zipped_content]) %>
<%= l(:label_or) %> <%= l(:label_or) %>
<%= check_box_tag('email[links_only]', 1, RedmineDmsf.dmsf_documents_email_links_only?, <%= check_box_tag('email[links_only]', 1, RedmineDmsf.dmsf_documents_email_links_only?,
onchange: "$('#public_url').toggle($('#email_links_only').prop('checked'))") onchange: "$('#public_url').toggle($('#email_links_only').prop('checked'))")

View File

@ -3,19 +3,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<%= render partial: 'main', locals: {} %> <%= render partial: 'main', locals: {} %>

View File

@ -3,19 +3,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
// Add rows // Add rows

View File

@ -1,6 +1,6 @@
api.dmsf do api.dmsf do
api.array :dmsf_nodes, api_meta(total_count: @query.dmsf_nodes(offset: @offset, limit: @limit).count) do api.array :dmsf_nodes, api_meta(total_count: @query.dmsf_nodes().count, limit: @limit, offset: @offset) do
@query.dmsf_nodes(offset: @offset, limit: @limit).each do |node| @query.dmsf_nodes(offset: @offset, limit: @limit).each do |node|
api.node do api.node do
api.id node.id api.id node.id
@ -25,4 +25,4 @@ api.dmsf do
end end
end end
end end

View File

@ -3,19 +3,18 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<%= render partial: 'main', locals: {} %> <%= render partial: 'main', locals: {} %>

View File

@ -3,26 +3,25 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% html_title l(:dmsf) %> <% html_title l(:dmsf) %>
<div class="contextual"> <div class="contextual">
<% if @file_delete_allowed %> <% if @file_delete_allowed %>
<%= delete_link empty_trash_path(id: @project), {}, l(:label_empty_trash_bin) %> <%= link_to sprite_icon('del', l(:label_empty_trash_bin)), empty_trash_path(id: @project), method: :delete %>
<% end %> <% end %>
</div> </div>
@ -41,21 +40,3 @@
<% content_for :sidebar do %> <% content_for :sidebar do %>
<%= render partial: 'dmsf/sidebar' %> <%= render partial: 'dmsf/sidebar' %>
<% end %> <% end %>
<% if defined?(EasyExtensions) %>
<%= late_javascript_tag do %>
$(function() {
$("p.buttons").addClass("filter-buttons form-actions");
let buttonApply = $("p.filter-buttons > a.icon-checked");
buttonApply.addClass("button-positive");
buttonApply.text("<%= l('easy_query.button_apply.issue') %>");
let buttonClear = $("p.filter-buttons > a.icon-reload");
buttonClear.addClass("button-negative");
buttonClear.text("<%= l('easy_query.label.default_filters') %>");
$("p.filter-buttons > a.icon-save").addClass("button");
$("p.filter-buttons > a.icon-edit").addClass("button");
$("p.filter-buttons > a.icon-del").addClass("button");
$("#query_form_with_buttons > p.buttons").show();
});
<% end %>
<% end %>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% workflows_available = DmsfWorkflow.where(['project_id = ? OR project_id IS NULL', project&.id]).exists? %> <% workflows_available = DmsfWorkflow.where(['project_id = ? OR project_id IS NULL', project&.id]).exists? %>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<li> <li>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<li> <li>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% unless edit %> <% unless edit %>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<li> <li>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% if folder_manipulation_allowed && !system_folder %> <% if folder_manipulation_allowed && !system_folder %>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<li> <li>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<li> <li>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<li> <li>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<%= link_to_function sprite_icon('group', l(:title_download_entries)), <%= link_to_function sprite_icon('group', l(:title_download_entries)),

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% if notifications %> <% if notifications %>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<li> <li>

View File

@ -3,26 +3,24 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
# #
# Watch/unwatch menu's item # You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% watched = object.watched_by?(User.current) %> <% watched = object.watched_by?(User.current) %>
<% css = [watcher_css([object]), watched ? 'icon icon-fav' : 'icon icon-fav-off'].join(' ') %> <% css = [watcher_css([object]), watched ? 'icon icon-fav' : 'icon icon-fav-off'].join(' ') %>
<% text = sprite_icon('fav', watched ? l(:button_unwatch) : l(:button_watch)) %> <% icon = watched ? 'unwatch' : 'watch' %>
<% text = watched ? l(:button_unwatch) : l(:button_watch) %>
<% url = watch_path(object_type: object.class.to_s.underscore, object_id: object.id) %> <% url = watch_path(object_type: object.class.to_s.underscore, object_id: object.id) %>
<% method = watched ? 'delete' : 'post' %> <% method = watched ? 'delete' : 'post' %>
<%= context_menu_link text, url, method: method, class: css, disabled: !User.current.logged? %> <%= context_menu_link sprite_icon(icon, text), url, method: method, class: css, disabled: !User.current.logged? %>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<ul> <ul>
@ -39,7 +38,7 @@
<% end %> <% end %>
</ul> </ul>
<%= late_javascript_tag do %> <%= javascript_tag do %>
$('#dmsf-cm-delete').click(function (event) { $('#dmsf-cm-delete').click(function (event) {
$('#context-menu').hide(); $('#context-menu').hide();
}); });

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<ul> <ul>
@ -32,7 +31,7 @@
allowed_restore: @allowed_restore }) %> allowed_restore: @allowed_restore }) %>
<% end %> <% end %>
</ul> </ul>
<%= late_javascript_tag do %> <%= javascript_tag do %>
$('#dmsf-cm-delete').click(function (event) { $('#dmsf-cm-delete').click(function (event) {
$('#context-menu').hide(); $('#context-menu').hide();
}); });

View File

@ -3,22 +3,21 @@
# #
# Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com> # Vít Jonáš <vit.jonas@gmail.com>, Daniel Munn <dan.munn@munnster.co.uk>, Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<div class="box tabular"> <div id="dmsf_new_revision" class="box tabular">
<strong><%= l(:heading_new_revision) %> <strong><%= l(:heading_new_revision) %>
<a href="#" id="new_revision_form_content_toggle" data-cy="toggle__new_revision_from_content--dmsf">[+]</a> <a href="#" id="new_revision_form_content_toggle" data-cy="toggle__new_revision_from_content--dmsf">[+]</a>
</strong> </strong>
@ -68,7 +67,7 @@
<%= label_tag 'file_upload', l(:label_new_content) %> <%= label_tag 'file_upload', l(:label_new_content) %>
<span class="dmsf-uploader"> <span class="dmsf-uploader">
<%= render partial: 'dmsf_upload/form', <%= render partial: 'dmsf_upload/form',
locals: { multiple: false, container: nil, description: false, awf: false } %> locals: { multiple: false, container: nil, awf: false } %>
</span> </span>
</p> </p>
<p> <p>
@ -78,8 +77,8 @@
<%= f.submit l(:button_create), class: 'button-positive', data: { cy: "button__submit--file_dmsf"} %> <%= f.submit l(:button_create), class: 'button-positive', data: { cy: "button__submit--file_dmsf"} %>
</div> </div>
<% end %> <% end %>
<% end %> <% end %>
</div> </div>
</div> </div>
<%= wikitoolbar_for 'dmsf_file_revision_description' %> <%= wikitoolbar_for 'dmsf_file_revision_description' %>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% cls = link ? 'dmsf-gray' : '' %> <% cls = link ? 'dmsf-gray' : '' %>
@ -27,7 +26,6 @@
file_view_url, file_view_url,
target: '_blank', target: '_blank',
rel: 'noopener', rel: 'noopener',
class: 'icon icon-file',
title: h(dmsf_file.last_revision.try(:tooltip)), title: h(dmsf_file.last_revision.try(:tooltip)),
'data-downloadurl' => "#{dmsf_file.last_revision.detect_content_type}:#{h(dmsf_file.name)}:#{file_view_url}" %> 'data-downloadurl' => "#{dmsf_file.last_revision.detect_content_type}:#{h(dmsf_file.name)}:#{file_view_url}" %>
</td> </td>
@ -93,7 +91,7 @@
else else
dmsf_file_path(id: dmsf_file, commit: 'yes', back_url: issue_path(@issue)) dmsf_file_path(id: dmsf_file, commit: 'yes', back_url: issue_path(@issue))
end %> end %>
<%= delete_link url %> <%= delete_link url, {}, '' %>
<% end %> <% end %>
<% # Approval workflow %> <% # Approval workflow %>
<% wf = DmsfWorkflow.find_by(id: dmsf_file.last_revision.dmsf_workflow_id) if dmsf_file.last_revision.dmsf_workflow_id %> <% wf = DmsfWorkflow.find_by(id: dmsf_file.last_revision.dmsf_workflow_id) if dmsf_file.last_revision.dmsf_workflow_id %>

View File

@ -3,19 +3,18 @@
# #
# Karel Pičman <karel.picman@kontron.com> # Karel Pičman <karel.picman@kontron.com>
# #
# This program is free software; you can redistribute it and/or # This file is part of Redmine DMSF plugin.
# 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, # Redmine DMSF plugin is free software: you can redistribute it and/or modify it under the terms of the GNU General
# but WITHOUT ANY WARRANTY; without even the implied warranty of # Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # later version.
# GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # Redmine DMSF plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
# along with this program; if not, write to the Free Software # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # more details.
#
# You should have received a copy of the GNU General Public License along with Redmine DMSF plugin. If not, see
# <https://www.gnu.org/licenses/>.
%> %>
<% if links.present? %> <% if links.present? %>

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