Add release notes for version 3.0. Fix documentation formatting. Add upload wizard step chapter. Improve and add additional diagrams. Change documenation theme to rtd.

Signed-off-by: Michael Price <loneviking72@gmail.com>
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Michael Price
2018-03-19 21:34:49 -04:00
committed by Roberto Rosario
parent a9e8076abe
commit 57325bc6ad
25 changed files with 837 additions and 44 deletions

View File

@@ -1,4 +1,4 @@
Next (2018-XX-XX) Next (2018-03-19)
================= =================
- Fix permission filtering when performing document page searching. - Fix permission filtering when performing document page searching.
- Fix cabinet detail view pagination. - Fix cabinet detail view pagination.
@@ -54,6 +54,10 @@ Next (2018-XX-XX)
- Add new WizardStep class to decouple the wizard step configuration. - Add new WizardStep class to decouple the wizard step configuration.
- Add support for deregister upload wizard steps. - Add support for deregister upload wizard steps.
- Add wizard step to insert the document being uploaded to a cabinet. - Add wizard step to insert the document being uploaded to a cabinet.
- Fix documentation formatting.
- Add upload wizard step chapte.
- Improve and add additional diagrams.
- Change documenation theme to rtd.
2.8 (2018-02-27) 2.8 (2018-02-27)
================ ================

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

114
docs/_static/mayan-pyramid.svg vendored Normal file
View File

@@ -0,0 +1,114 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512.001 512.001" style="enable-background:new 0 0 512.001 512.001;" xml:space="preserve">
<circle style="fill:#00A2FF;" cx="255.997" cy="255.996" r="255.996"/>
<path style="fill:#0084FF;" d="M512.001,256.001c0-13.179-0.999-26.124-2.919-38.767l-35.697-35.697
c-1.638-3.888-5.492-6.636-9.958-6.636h-12.142l-11.498-11.394c-1.638-3.888-5.492-6.636-9.958-6.636h-58.637l-52.15-55.774h-77.123
l-28.404-27.869c-1.764-3.974-5.747-6.767-10.356-6.767H141.39c-6.231,0-11.328,5.097-11.328,11.328
c0,2.914,1.124,5.571,2.949,7.584h-26.863c-6.231,0-11.328,5.097-11.328,11.328c0,4.609,2.793,8.591,6.767,10.355l71.313,72.34
v14.579h-20.32v32.546h-20.115v32.546h-19.733v32.546H92.507v32.546h-22.45v32.546H47.966v33.866l95.337,95.337
c34.007,16.701,72.253,26.095,112.698,26.095C397.385,512,512.001,397.385,512.001,256.001z"/>
<g>
<path style="fill:#FFFFFF;" d="M106.146,85.372h26.863c-1.824-2.012-2.949-4.671-2.949-7.584c0-6.231,5.098-11.328,11.328-11.328
h61.769c6.231,0,11.328,5.097,11.328,11.328c0,6.231-5.097,11.328-11.328,11.328h-26.863c1.824,2.012,2.949,4.67,2.949,7.584l0,0
c0,6.231-5.097,11.328-11.328,11.328h-61.769c-6.231,0-11.328-5.097-11.328-11.328l0,0C94.818,90.469,99.916,85.372,106.146,85.372
z"/>
<path style="fill:#FFFFFF;" d="M463.426,174.9h-25.61c1.74-1.918,2.812-4.452,2.812-7.231c0-5.94-4.86-10.799-10.8-10.799h-58.889
c-5.94,0-10.799,4.86-10.799,10.799s4.86,10.8,10.799,10.8h25.61c-1.74,1.918-2.812,4.452-2.812,7.231l0,0
c0,5.94,4.86,10.8,10.8,10.8h58.889c5.939,0,10.799-4.86,10.799-10.8l0,0C474.225,179.76,469.365,174.9,463.426,174.9z"/>
</g>
<rect x="196.48" y="103.976" style="fill:#87858E;" width="119.044" height="59.078"/>
<rect x="255.997" y="103.976" style="fill:#78777F;" width="59.524" height="59.078"/>
<rect x="244.994" y="137.287" style="fill:#57555C;" width="22.005" height="25.771"/>
<rect x="255.997" y="137.287" style="fill:#3C3B41;" width="11.004" height="25.771"/>
<rect x="192.959" y="119.284" style="fill:#D4D4D6;" width="126.076" height="5.758"/>
<rect x="255.997" y="119.284" style="fill:#AAA9AF;" width="63.038" height="5.758"/>
<rect x="172.897" y="161.424" style="fill:#87858E;" width="166.199" height="33.866"/>
<rect x="255.997" y="161.424" style="fill:#78777F;" width="83.1" height="33.866"/>
<rect x="172.897" y="161.424" style="fill:#C4C2C8;" width="166.199" height="12.19"/>
<rect x="255.997" y="161.424" style="fill:#AAA9AF;" width="83.1" height="12.19"/>
<rect x="152.574" y="193.972" style="fill:#87858E;" width="206.845" height="33.866"/>
<rect x="255.997" y="193.972" style="fill:#78777F;" width="103.423" height="33.866"/>
<rect x="152.574" y="193.972" style="fill:#C4C2C8;" width="206.845" height="12.189"/>
<rect x="255.997" y="193.972" style="fill:#AAA9AF;" width="103.423" height="12.189"/>
<rect x="132.46" y="226.52" style="fill:#87858E;" width="247.073" height="33.866"/>
<rect x="255.997" y="226.52" style="fill:#78777F;" width="123.537" height="33.866"/>
<rect x="132.46" y="226.52" style="fill:#C4C2C8;" width="247.073" height="12.19"/>
<rect x="255.997" y="226.52" style="fill:#AAA9AF;" width="123.537" height="12.19"/>
<rect x="112.733" y="259.068" style="fill:#87858E;" width="286.538" height="33.866"/>
<rect x="255.997" y="259.068" style="fill:#78777F;" width="143.274" height="33.866"/>
<rect x="112.733" y="259.068" style="fill:#C4C2C8;" width="286.538" height="12.189"/>
<rect x="255.997" y="259.068" style="fill:#AAA9AF;" width="143.274" height="12.189"/>
<rect x="92.504" y="291.606" style="fill:#87858E;" width="326.986" height="33.866"/>
<rect x="255.997" y="291.606" style="fill:#78777F;" width="163.493" height="33.866"/>
<rect x="92.504" y="291.606" style="fill:#C4C2C8;" width="326.986" height="12.19"/>
<rect x="255.997" y="291.606" style="fill:#AAA9AF;" width="163.493" height="12.19"/>
<rect x="70.06" y="324.154" style="fill:#87858E;" width="371.884" height="33.866"/>
<rect x="255.997" y="324.154" style="fill:#78777F;" width="185.947" height="33.866"/>
<rect x="70.06" y="324.154" style="fill:#C4C2C8;" width="371.884" height="12.19"/>
<rect x="255.997" y="324.154" style="fill:#AAA9AF;" width="185.947" height="12.19"/>
<rect x="47.966" y="356.702" style="fill:#87858E;" width="416.072" height="33.866"/>
<rect x="255.997" y="356.702" style="fill:#78777F;" width="208.036" height="33.866"/>
<rect x="47.966" y="356.702" style="fill:#C4C2C8;" width="416.072" height="12.19"/>
<rect x="255.997" y="356.702" style="fill:#AAA9AF;" width="208.036" height="12.19"/>
<rect x="192.959" y="101.092" style="fill:#D4D4D6;" width="126.076" height="5.758"/>
<g>
<rect x="255.997" y="101.092" style="fill:#AAA9AF;" width="63.038" height="5.758"/>
<polygon style="fill:#AAA9AF;" points="211.746,161.428 189.714,390.569 322.287,390.569 300.255,161.428 "/>
</g>
<polygon style="fill:#87858E;" points="322.287,390.569 300.255,161.428 256,161.428 256,390.569 "/>
<polygon style="fill:#DDDDDF;" points="206.354,390.569 189.714,390.569 211.746,161.428 228.387,161.428 "/>
<polygon style="fill:#C4C2C8;" points="305.647,390.569 322.287,390.569 300.255,161.428 283.614,161.428 "/>
<path style="fill:#00B764;" d="M256,512c92.101,0,172.83-48.647,217.928-121.637H38.072C83.17,463.353,163.899,512,256,512z"/>
<g>
<rect x="98.941" y="422.216" style="fill:#008849;" width="68.262" height="12.809"/>
<rect x="194.62" y="439.77" style="fill:#008849;" width="49.611" height="12.808"/>
<rect x="169.815" y="467.512" style="fill:#008849;" width="49.611" height="12.808"/>
</g>
<path style="fill:#00884A;" d="M473.932,390.362c-0.888,1.431-1.776,2.842-2.696,4.253c-0.408,0.658-0.836,1.306-1.275,1.954
c-0.439,0.679-0.888,1.348-1.337,2.017c-0.543,0.805-1.087,1.609-1.64,2.414c-0.637,0.919-1.275,1.839-1.923,2.758
c-1.139,1.588-2.288,3.176-3.448,4.744c-0.136,0.188-0.282,0.376-0.418,0.564c-0.554,0.731-1.108,1.463-1.661,2.194
c-46.759,61.23-120.527,100.737-203.533,100.737V390.362L473.932,390.362L473.932,390.362z"/>
<g>
<rect x="347.623" y="422.216" style="fill:#007539;" width="68.262" height="12.809"/>
<rect x="294.25" y="464.2" style="fill:#007539;" width="49.611" height="12.808"/>
<rect x="271.994" y="436.991" style="fill:#007539;" width="49.611" height="12.808"/>
</g>
<path style="fill:#36C98C;" d="M38.072,390.363c4.456,7.213,9.266,14.183,14.394,20.897h407.068
c5.128-6.713,9.938-13.684,14.394-20.897H38.072z"/>
<path style="fill:#00B764;" d="M473.932,390.362c-0.888,1.431-1.776,2.842-2.696,4.253c-0.408,0.658-0.836,1.306-1.275,1.954
c-0.439,0.679-0.888,1.348-1.337,2.017c-0.543,0.805-1.087,1.609-1.64,2.414c-0.637,0.919-1.275,1.839-1.923,2.758
c-1.139,1.588-2.288,3.176-3.448,4.744c-0.136,0.188-0.282,0.376-0.418,0.564c-0.554,0.731-1.108,1.463-1.661,2.194H256.001v-20.898
L473.932,390.362L473.932,390.362z"/>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -33,7 +33,7 @@ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "_ext"))
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
#extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode'] #extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode']
#extensions = ["djangodocs", "sphinx.ext.intersphinx"] #extensions = ["djangodocs", "sphinx.ext.intersphinx"]
extensions = ['djangodocs', 'sphinxcontrib.blockdiag'] extensions = ['sphinxcontrib.blockdiag']
blockdiag_antialias = True blockdiag_antialias = True
blockdiag_html_image_format = "SVG" blockdiag_html_image_format = "SVG"
@@ -224,28 +224,8 @@ latex_documents = [
# One entry per manual page. List of tuples # One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section). # (source start file, name, description, authors, manual section).
man_pages = [ man_pages = [
('index', 'mayanedms', 'Mayan EDMS Documentation', ('index', 'mayanedms', '{} Documentation'.format(mayan.__title__),
[mayan.__author__], 1) [mayan.__author__], 1)
] ]
html_theme = 'sphinx_rtd_theme'
# -- Custom options
import alabaster
html_theme_path = [alabaster.get_path()]
extensions.append('alabaster')
html_theme = 'alabaster'
html_sidebars = {
'**': [
'about.html', 'donate.html', 'navigation.html', 'searchbox.html',
]
}
html_theme_options = {
'description': mayan.__description__,
'github_button': False,
'travis_button': False,
'gratipay_user': 'rosarior',
'github_banner': False,
}
html_logo = '_static/logo_pyramid_only.png'

View File

@@ -1,5 +1,14 @@
Welcome to Mayan EDMS! Welcome to Mayan EDMS NG!
====================== =========================
Mayan EDMS NG is a modern fork of Mayan EDMS focused on stability,
perfomance and new features.
.. image:: /_static/mayan-pyramid.svg
:alt: Icons made by Freepik (http://www.freepik.com) from www.flaticon.com is licensed by CC 3.0 BY (http://creativecommons.org/licenses/by/3.0/)
:align: center
:width: 30%
Mayan EDMS is a `Free Open Source`_ `Electronic Document Management System`_, Mayan EDMS is a `Free Open Source`_ `Electronic Document Management System`_,
coded in the Python language using the Django_ web application framework and coded in the Python language using the Django_ web application framework and
@@ -26,6 +35,7 @@ repository for electronic documents.
FAQ <topics/faq> FAQ <topics/faq>
Contact <topics/contact> Contact <topics/contact>
MERCs <mercs/index> MERCs <mercs/index>
Pending tasks <topics/pending_tasks>
.. _Docker: https://www.docker.com/ .. _Docker: https://www.docker.com/
.. _Django: http://www.djangoproject.com/ .. _Django: http://www.djangoproject.com/

View File

@@ -57,11 +57,11 @@ Specification
Changes needed: Changes needed:
1- Data migration to convert existing roles to groups. 1. Data migration to convert existing roles to groups.
2- Prepend or append an identifier to the migrated roles. 2. Prepend or append an identifier to the migrated roles.
3- Intermediate model to map permissions to a group. This will substitute 3. Intermediate model to map permissions to a group. This will substitute
the Role model's permissions many to many field. the Role model's permissions many to many field.
4- Update the ``AccessControlList`` models roles field to point to the group 4. Update the ``AccessControlList`` models roles field to point to the group
models. models.
5- Update the role checks in the ``check_access`` and ``filter_by_access`` 5. Update the role checks in the ``check_access`` and ``filter_by_access``
``AccessControlList`` model manager methods. ``AccessControlList`` model manager methods.

View File

@@ -58,13 +58,14 @@ Specification
Changes needed: Changes needed:
1- Python based javascript package manager. Alternatively a Python wrapper 1. Python based javascript package manager. Alternatively a Python wrapper
for a javascript package manager could be used. for a javascript package manager could be used.
2- Package manifest for the javascript libraries used. 2. Package manifest for the javascript libraries used.
3- Installation pipeline to install the javascript libraries during the 3. Installation pipeline to install the javascript libraries during the
installation and setup of the project. installation and setup of the project.
References: References:
- https://github.com/JDeuce/powser - https://github.com/JDeuce/powser
- https://github.com/javrasya/version-manager - https://github.com/javrasya/version-manager
- https://github.com/inveniosoftware-attic/setuptools-bower - https://github.com/inveniosoftware-attic/setuptools-bower

View File

@@ -63,8 +63,6 @@ Backward incompatible changes
Bugs fixed or issues closed Bugs fixed or issues closed
=========================== ===========================
* None
=======
* `GitLab issue #378 <https://gitlab.com/mayan-edms/mayan-edms/issues/378>`_ Add metadata widget changes from @Macrobb * `GitLab issue #378 <https://gitlab.com/mayan-edms/mayan-edms/issues/378>`_ Add metadata widget changes from @Macrobb
* `GitLab issue #379 <https://gitlab.com/mayan-edms/mayan-edms/issues/379>`_ Add new document version list view permission. * `GitLab issue #379 <https://gitlab.com/mayan-edms/mayan-edms/issues/379>`_ Add new document version list view permission.

439
docs/releases/3.0.rst Normal file
View File

@@ -0,0 +1,439 @@
================================
Mayan EDMS NG v3.0 release notes
================================
Released: March 19, 2018
What's new
==========
Turning Mayan EDMS into a single page app
-----------------------------------------
Historically, Mayan EDMS has steered away from adding too much Javascript
in its code. Roberto, the main developer, often explains his rationale
for this decision. His goal has been to maintain a robust, backend-based
page rendering method that will be as future-proof as possible.
This approach comes at the cost of some page loading speed, and reduced
user interface interactivity.
The Javascript ecosystem is an untamed jungle of competing “standards”.
Between JQuery, Angular, React, Ember, CoffeeScript, ES2015, ES2017,
Babel, Grunt, Gulp, Bower, Webpack, Vue, Webpack, Rollup, Parcel,
among many others, is easy to see why that approach was the correct
one at the time. Luckily things have improved thanks to HTML5 and CCS3.
The browser can now do many things that often required convoluted
Javascript code to achieve.
One of the most common complains about the user interface is that it
is slow, heavy, requires users to move around too much. That it
requires “too many clicks” to achieve things.
Single Page Applications (SPAs) rewrite the current page dynamically
rather than loading the entire page on each click of the mouse. This
makes the web application feel and behave more like a desktop
application. Because the majority of the styling and Javascript code
is loaded only once, there is also the added benefit of less data down
the wire. Thus the application becomes lighter and provides a faster
response time to user events. Because the style is loaded and
interpreted at the beginning, the browser is also able to apply it to
the new content faster.
In order to strike a balance with Robertos backend heavy philosophy,
we stuck to using just HTML5 and jQuery. Aside from two additional
jQuery libraries, there are no extra framework dependencies. With the
conversion to an SPA, many other petitions for user interface
improvements are now possible. We will work on these once the community
confirms that all the user interface changes made to create the SPA are
working as expected.
Upgrading to Django 1.11
------------------------
The move to Django 1.11 proved to be a real challenge. Even though
Django 1.11 is a minor release, it breaks compatibility and interfaces
in several key areas. Among these were templates and form widgets.
Mayan EDMS uses a complex template, form and widget system. The system
mimics object-oriented concepts like inheritance at the rendering stage.
This allows the more than 300 views to be serviced with just a handful
of forms classes and base templates. Testing and auditing all the views
and forms after the upgrade was a lot of work. If any member of the
Django project is reading this, please adopt stricter version numbering
convention, something like Semantic Versioning.
Along with the upgrade to Django 1.11, we fixed many deprecations
warning in preparation for an eventual upgrade to Django 2.0.
Notification improvements
-------------------------
In version 2.8 we introduced event notifications. These work by allowing
users to subscribe to a particular event like Document Uploads or to an
event of a particular document like when an invoice is edited. If
these events occur, the user gets a reminder next to the bell icon in
the main menu bar. This feature had one important limitation. The
notification reminder would only update if the main page updated. That
meant that if the user didnt interact with the user interface they
would not get a notification reminder.
We implemented a simple mechanism that checks for notifications
periodically without user intervention. We avoided the use of webworkers,
websockets and push notifications. The result is almost instant
notifications without user interaction and without adding any extra
dependencies.
Notification improvements
-------------------------
In version 2.8 we introduced event notifications. These work by allowing
users to subscribe to a particular event like Document Uploads or to an
event of a particular document like when an invoice is edited. If these
events occur, the user gets a reminder next to the bell icon in the main
menu bar. This feature had one important limitation. The notification
reminder would only update if the main page updated. That meant that if
the user didnt interact with the user interface they would not get a
notification reminder.
We implemented a simple mechanism that checks for notifications
periodically without user intervention. We avoided the use of webworkers,
websockets and push notifications. The result is almost instant
notifications without user interaction and without adding any extra
dependencies.
Migration squashing
-------------------
Database base migrations are a must to ensure your data remains coherent
after each upgrade. They need to be committed sequentially to simulate
the evolution of the database structures over time. This is true even
for new installations with no existing data. As Mayan EDMS matures and
adds features it also adds migrations. Each of these migration add up
to the amount of times it takes to install Mayan EDMS.
Django recently added support for merging migrations. Because migrations
are sometimes interdependencies between each other, this is a delicate
procedure. Instead of getting wild with merges, we used the feature in
moderation. We merged the migrations that have proven to be stable over
the course of months or years. Additionally, these merged or “squashed”
migrations are only used for new installations. Any upgrade of an
existing installation will use the normal migrations. After some time,
if not issues are reported with the merged migrations, the individual
migrations will be removed and the merged migrations will take their place.
These are the apps for which migrations were merged:
- acls (ACLs): 1 and 2
- checkouts (Checkouts): 1 and 2
- common (Not shown in UI): 1 to 8
- converter (Not shown in UI): from 1 to 12
- django_gpg (Keys): from 1 to 6
- document_indexing (Indexing): from 1 to 5
- document_parsing (Parsing, “Content”): 1 and 2
- document_signatures (Signatures): from 1 to 6
- document_states (Workflows): 1 and 2
- dynamic_search (Search): from 1 to 3
- events (Event): from 1 to 4
- linking (Smart links): from 1 to 5
- lock_manager (Not shown in UI): 1 and 2
- mailer (Mailing): from 1 to 5
- metadata (Metadata): from 1 to 8
- motd (Message of the day): from 1 to 5
- permissions (Permissions): from 1 to 3
- sources (Sources): from 1 to 16
Dependencies upgrades
---------------------
Most of the requirements, dependencies and libraries were upgraded to
their latest release.
- Pillow: 5.0.0
- django-activity-stream: 0.6.5
- django-compressor: 2.2
- django-cors-headers: 2.2.0
- django-formtools: 2.1
- django-qsstats-magic: 1.0.0
- django-stronghold: 0.3.0
- django-suit: 0.2.26
- furl: 1.0.1
- graphviz: 0.8.2
- pyocr: 0.5.1
- python-dateutil: 2.6.1
- python-magic: 0.4.15
- pytz: 2018.3
- sh: 1.12.14
- rest_framework_swagger replaced with drf-yasg: 1.5.0
- FancyBox was upgraded to version 3, Font Awesome to version 5, jQuery to version 3.3.1. ajaxForm version 4.2.2, URI.js 1.19.1 and pace 0.7.8 were added as part of the conversion to single page app.
Search syntax
-------------
Searching without using a specialized search database is difficult.
Most software just take the lazy route and force the user to install a
dedicated search engine. Early on we noticed Mayans design called for
avoiding a separate search engine at the cost of some missing search
syntax. The OR and the negative term support is our first attempt at
adding special syntax to Mayans search code. If we get good feedback,
we plan to add more.
By default now, search terms are routed to an “AND” query. That means
that a search for:
``Tag1 Tag2``
will only return documents with both tags attached. To offer the
opposite choice we added an “OR” syntax. Searching for:
``Tag1 OR Tag2``
will return documents with either tag attached.
We also added support for literals terms.
Searching for:
``blue car``
will return documents with the words “blue” and “car”, even if they are
not together. That means getting documents with the phrases “blue sky”
and “slow car”. To search for exact terms enclose them in quotes:
``“blue car”``
This will return only documents with the exact phrase “blue car”.
Running multiple instances of Mayan EDMS NG
-------------------------------------------
If you've ever tried running two instances of Mayan EDMS NG, you would
have noticed that they both try to create a lock file in the /tmp
directory with the same name. Only the first instance will be able to run.
The lock filename needs to be unique to each instance, yet predictable
so that the workers of an instance can also access the same lock file.
We solved this issues by using a hexadecimal hash representation of the
installations unique SECRET_KEY setting. The use of a hash makes
reversing the value in order to obtain the SECRET_KEY impossible for
all practical purposes.
Display resolution settings
---------------------------
During the template work required to upgrade the version of Django, we
noticed that display sizes (display, preview, thumbnail) were specified
as a string that included the horizontal and the vertical resolution
separated by the character “x”. Using an “x” character to separate
resolution elements is not standard and didn't felt as well planned as
the rest of the project. The converter in Mayan EDMS NG also allows
specifying only the horizontal resolution. This design created some
ambiguities in the code. We decided to split the settings for specifying
resolutions into two settings for each size. One setting for
horizontal resolution and another for vertical resolution.
The settings are now:
``DOCUMENTS_DISPLAY_WIDTH``, ``DOCUMENTS_DISPLAY_HEIGHT``, ``DOCUMENTS_PREVIEW_WIDTH``,
``DOCUMENTS_PREVIEW_HEIGHT``, ``DOCUMENTS_PRINT_WIDTH``, ``DOCUMENTS_PRINT_HEIGHT``,
``DOCUMENTS_THUMBNAIL_WIDTH``, ``DOCUMENTS_THUMBNAIL_HEIGHT``
Dynamic upload wizard steps
---------------------------
The steps needed to upgrade a document using form-tools' SessionWizard
were hardcoded in the source app. This made it very difficult to add or remove
wizard steps.
The steps of the wizard are now defined by a new class called
``sources.wizard.WizardStep``. The existing steps to select a document type,
enter metadata and tag the document, have been converted to function as
WizardSteps subclasses. The converted steps now live in
``sources.wizards.WizardStepDocumentType``, ``tag.wizard_steps.WizardStepTags``,
and ``metadata.wizard_steps.WizardStepMetadata``.
The steps need to define the following methods:
- ``done``: This method is execute when the wizard finished the last step
an enter the step where the actual file are uploaded. This steps is used
to encode form data into the URL query string that will be passed to the
document upload view for each file uploaded.
- ``condition``: This method is used to display the step conditionally.
If this method return True it will be displayed during the upload wizard
execution. To skip the step, return False or None.
- ``get_form_initial``: This method is used to return the initial data
for the step form. Use this method to set up initial values for the step's
form fields.
- ``step_post_upload_process``: This method will be executed once the
document finishes uploading. Use this method to process the information
encoded in the URL querystring by the step's `done`` method.
Once the ``WizardStep`` subclass is defined, it needs to be registered. This
is done by calling the ``.register`` method of the ``WizardStep`` class with
the subclass as the argument. Example::
WizardStep.register(WizardStepMetadata)
This statement must be located after the subclass definition. Finally,
the module defining the wizard step must be imported so that it is loaded
with the rest of the code and enabled. The best place to do this is in the
``.ready`` method of the apps' ``apps.py`` module. Example::
class TagsApp(MayanAppConfig):
has_rest_api = True
has_tests = True
name = 'tags'
verbose_name = _('Tags')
def ready(self):
super(TagsApp, self).ready()
from actstream import registry
from .wizard_steps import WizardStepTags # NOQA
The WizardStep class also allows for unregistering existing steps. This
is accomplished by calling the ``.deregister`` method of the ``WizardStep``
class and passing the subclass as the argument. This method should
also be called inside the ``.ready`` method of an apps' ``apps.py``
module. Example::
class TagsApp(MayanAppConfig):
has_rest_api = True
has_tests = True
name = 'tags'
verbose_name = _('Tags')
def ready(self):
super(TagsApp, self).ready()
from actstream import registry
from metadata.wizard_steps import WizardStepMetadata # NOQA
from sources.wizards import WizardStep # NOQA
from .wizard_steps import WizardStepTags # NOQA
WizardStep.deregister(WizardStepTags)
This will cause the tags assigment step to not be assigned to the upload
wizard anymore.
Repository location
-------------------
The code repository for Mayan EDMS NG now lives at:
https://gitlab.com/Mayan-EDMS-NG/mayan-edms-ng
A GitLab group was also created and all projects will now live under
that unit.
New upload step
---------------
Using the new ``WizardStep`` class a new upload wizard step was added
to assign documents being uploaded to any number of cabinets while
being uploaded. This step was been assigned number 4 in the order of
step for uploading a file.
Other changes worth mentioning
------------------------------
- Fix permission filtering when performing document page searching
- base.js was splitted into mayan_app.js, mayan_image.js, and partial_navigation.js.
- Cabinet detail view pagination was fixed.
- Improve permission handling in the workflow app.
- The checkedout detail view permission is now required for the checked out document detail API view.
- Add missing services for the checkout API.
- Fix existing checkout APIs.
- Update API views and serializers for the latest Django REST framework version.
- Update to the latest version the packages for building, development, documentation and testing.
- Add statistics script to produce a report of the views, APIs and test for each app.
- Merge base64 filename patch from Cornelius Ludmann.
- SearchModel return interface changed. The class no longer returns the result_set value. Use the queryset returned instead.
- Remove the unused scrollable_content internal feature.
- Remove unused animate.css package.
- Add the MERC specifying javascript library usage.
- Documents without at least a version are not scanned for duplicates.
- Convert document thumbnails, preview, image preview and staging files to template base widgets.
- Unify all document widgets.
- Printed pages are now full width.
- Move the invalid document markup to a separate HTML template.
- Move transfomations to their own module.
- Split documents.tests.test_views into:
- base.py
- test_deleted_document_views.py
- test_document_page_views.py
- test_document_type_views.py
- test_document_version_views.py
- test_document_views.py
- test_duplicated_document_views.py
- Sort smart links by label.
- Rename the internal name of the document type permissions namespace. Existing permissions will need to be updated.
- Removed redundant permissions checks.
Removals
--------
* None
Upgrading from a previous version
---------------------------------
Using PIP
~~~~~~~~~
Type in the console::
$ pip install mayan-edms-ng==3.0
the requirements will also be updated automatically.
Using Git
~~~~~~~~~
If you installed Mayan EDMS by cloning the Git repository issue the commands::
$ git reset --hard HEAD
$ git pull
otherwise download the compressed archived and uncompress it overriding the
existing installation.
Next upgrade/add the new requirements::
$ pip install --upgrade -r requirements.txt
Common steps
~~~~~~~~~~~~
Migrate existing database schema with::
$ mayan-edms.py performupgrade
Add new static media::
$ mayan-edms.py collectstatic --noinput
The upgrade procedure is now complete.
Backward incompatible changes
=============================
* None
Bugs fixed or issues closed
===========================
* None
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/

View File

@@ -17,11 +17,20 @@ Final releases
Below are release notes through Mayan EDMS |version| and its minor releases. Newer Below are release notes through Mayan EDMS |version| and its minor releases. Newer
versions of the documentation contain the release notes for any later releases. versions of the documentation contain the release notes for any later releases.
3.0 series
----------
.. toctree::
:maxdepth: 1
3.0
2.0 series 2.0 series
---------- ----------
.. toctree:: .. toctree::
:maxdepth: 1 :maxdepth: 1
2.8
2.7.3 2.7.3
2.7.2 2.7.2
2.7.1 2.7.1

View File

@@ -11,11 +11,13 @@ system-wide.
.. blockdiag:: .. blockdiag::
blockdiag { blockdiag {
default_shape = roundedbox
document [ label = 'Document' ]; document [ label = 'Document' ];
role [ label = 'Role' ]; role [ label = 'Role' ];
permission [ label = 'Permission' ]; permission [ label = 'Permission' ];
role -> document <- permission; role -> permission -> document;
} }
Example: Example:
@@ -23,11 +25,13 @@ Example:
.. blockdiag:: .. blockdiag::
blockdiag { blockdiag {
default_shape = roundedbox
document [ label = '2015 Payroll report.txt', width=200 ]; document [ label = '2015 Payroll report.txt', width=200 ];
role [ label = 'Accountants' ]; role [ label = 'Accountants' ];
permission [ label = 'View document' ]; permission [ label = 'View document' ];
role -> document <- permission; role -> permission -> document;
} }
In this scenario only users in groups belonging to the ``Accountants`` role In this scenario only users in groups belonging to the ``Accountants`` role
@@ -43,11 +47,14 @@ permission for all documents of that type.
.. blockdiag:: .. blockdiag::
blockdiag { blockdiag {
default_shape = roundedbox
document_type [ label = 'Document type' ]; document_type [ label = 'Document type' ];
role [ label = 'Role' ]; role [ label = 'Role' ];
permission [ label = 'Permission' ]; permission [ label = 'Permission' ];
documents [shape = "note", stacked];
role -> document_type <- permission; role -> permission -> document_type ;
document_type -> documents [folded, label = "inherit" ];
} }
Example: Example:
@@ -55,11 +62,14 @@ Example:
.. blockdiag:: .. blockdiag::
blockdiag { blockdiag {
default_shape = roundedbox
document_type [ label = 'Payroll reports', width=200 ]; document_type [ label = 'Payroll reports', width=200 ];
role [ label = 'Accountants' ]; role [ label = 'Accountants' ];
permission [ label = 'View document' ]; permission [ label = 'View document' ];
documents [shape = "note", stacked, label="payroll_report*.pdf" ];
role -> document_type <- permission; role -> permission -> document_type ;
document_type -> documents [folded, label = "inherit" ];
} }
The role ``Accountants`` is given the permission ``document view`` for the The role ``Accountants`` is given the permission ``document view`` for the

View File

@@ -9,6 +9,46 @@ uploaded. It is not possible to upload documents without assigning them a
document type. Examples of document type: **invoices**, **blueprints**, document type. Examples of document type: **invoices**, **blueprints**,
**receipts**. **receipts**.
.. blockdiag::
blockdiag {
default_shape = roundedbox
document_type [ label = 'Document type' ];
documents [ label = 'Documents' ];
document_type -> documents;
}
Examples:
.. blockdiag::
blockdiag {
default_shape = roundedbox
document_type [ label = 'Invoice' ];
documents_1 [ label = 'invoice_001.pdf', width=200 ];
documents_2 [ label = 'invoice_032.pdf', width=200 ];
document_type -> documents_1, documents_2;
}
.. blockdiag::
blockdiag {
default_shape = roundedbox
document_type [ label = 'Receipts' ];
documents_1 [ label = 'groceries_18-01-11.pdf', width=200 ];
documents_2 [ label = 'car_payment-17-01-02.png', width=200 ];
document_type -> documents_1, documents_2;
}
Settings and attributes are applied to document types and documents will Settings and attributes are applied to document types and documents will
inherit those settings and attributes based on the document type they were inherit those settings and attributes based on the document type they were
assigned when uploaded into Mayan EDMS. A document can only be of one assigned when uploaded into Mayan EDMS. A document can only be of one

View File

@@ -9,6 +9,7 @@ without extension, and stored in a simple flat arrangement in a directory.
.. blockdiag:: .. blockdiag::
blockdiag { blockdiag {
default_shape = roundedbox
file [ label = 'mayan_1-1.pdf', width=120]; file [ label = 'mayan_1-1.pdf', width=120];
document [ label = 'mayan/media/document_storage/ab6c1cfe-8a8f-4a30-96c9-f54f606b9248', width=450]; document [ label = 'mayan/media/document_storage/ab6c1cfe-8a8f-4a30-96c9-f54f606b9248', width=450];
file -> document [label = "upload"]; file -> document [label = "upload"];

View File

@@ -24,5 +24,6 @@ Introductions to all the key parts of Mayan EDMS you'll need to know:
settings settings
file_storage file_storage
backups backups
upload_wizard
pending_work pending_work
code_statistics code_statistics

View File

@@ -23,6 +23,9 @@ Example:
.. blockdiag:: .. blockdiag::
blockdiag { blockdiag {
default_shape = roundedbox
span_width = 30;
index [ label = 'Product sheets per year', width=180 ]; index [ label = 'Product sheets per year', width=180 ];
root [ label = 'Root (Has document links? No)', width=450]; root [ label = 'Root (Has document links? No)', width=450];
level_2 [ label = '{{ document.metadata_value_of.product_year }} (Has document links? Yes)', width=450]; level_2 [ label = '{{ document.metadata_value_of.product_year }} (Has document links? Yes)', width=450];
@@ -50,6 +53,8 @@ that will be generate based on the tree template would be as follows:
.. blockdiag:: .. blockdiag::
blockdiag { blockdiag {
default_shape = roundedbox
index [ label = 'Product sheets per year', width=180 ]; index [ label = 'Product sheets per year', width=180 ];
year_1 [ label = '2001', width = 60 ]; year_1 [ label = '2001', width = 60 ];
year_2 [ label = '2002', width = 60 ]; year_2 [ label = '2002', width = 60 ];
@@ -89,5 +94,20 @@ via the network with network file system software like
`Samba <https://www.samba.org/>`_ or `Samba <https://www.samba.org/>`_ or
`NFS <https://en.wikipedia.org/wiki/Network_File_System>`_. `NFS <https://en.wikipedia.org/wiki/Network_File_System>`_.
.. blockdiag::
blockdiag {
orientation = portrait
span_width = 200;
index [ label = 'Product sheets per year', width=180 ];
block_device [ height = 100, label = "Block device\n(Hard drive)", shape = flowchart.database ];
network [ label = "Network", shape = cloud ];
user [ label = "Users", shape = actor ];
index -> block_device [ label = "mirroring", fontsize = 8 ];
block_device -> network -> user;
}
Indexes and mirrored indexes are Read Only as they are generated as a result of Indexes and mirrored indexes are Read Only as they are generated as a result of
prior activities like document uploads, metadata changes. prior activities like document uploads, metadata changes.

View File

@@ -16,7 +16,7 @@ Docker procedure
For the complete set of installation, configuration, upgrade, and backup For the complete set of installation, configuration, upgrade, and backup
instructions visit the Mayan EDMS Docker Hub page at: instructions visit the Mayan EDMS Docker Hub page at:
https://hub.docker.com/r/mayanedms/mayanedms/ https://hub.docker.com/r/mayanedmsng/mayanedmsng/
.. _Docker: https://www.docker.com/ .. _Docker: https://www.docker.com/

View File

@@ -279,7 +279,7 @@ Other
relationship between the documents has to be designed. relationship between the documents has to be designed.
- Manually linking documents. - Manually linking documents.
- Migrate settings/base.py to Django's 1.11 format. - Migrate settings/base.py to Django's 1.11 format.
- Rename model methods to use 'get_' or 'do_' - Rename model methods to use ``get_`` or ``do_``
- Hunt TODO - Hunt TODO
- Hunt FIXME - Hunt FIXME
- Convert SETTING_GPG_BACKEND into a setting option similar to converter and converter options. - Convert SETTING_GPG_BACKEND into a setting option similar to converter and converter options.

View File

@@ -10,6 +10,11 @@ that permission can exercise it throughout the entire system.
.. blockdiag:: .. blockdiag::
blockdiag { blockdiag {
orientation = portrait
default_shape = roundedbox
span_width = 240;
span_height = 100;
user [ label = 'Users' ]; user [ label = 'Users' ];
group [ label = 'Groups' ]; group [ label = 'Groups' ];
role [ label = 'Roles' ]; role [ label = 'Roles' ];

View File

@@ -12,7 +12,7 @@ your browser. This is also a good place to check if your overrided setting
option value in your ``local.py`` file is being interpreted correctly. option value in your ``local.py`` file is being interpreted correctly.
Settings can also be changed via environment variables by prepending the string Settings can also be changed via environment variables by prepending the string
"MAYAN_" to the configuration name. For example, to change the number of documents ``"MAYAN_"`` to the configuration name. For example, to change the number of documents
displayed per page (COMMON_PAGINATE_BY, by default 40), use:: displayed per page (COMMON_PAGINATE_BY, by default 40), use::
MAYAN_COMMON_PAGINATE_BY=10 MAYAN_COMMON_PAGINATE_BY=10

View File

@@ -8,6 +8,25 @@ uploaded, this signature is readily detected as part of the document
inspection step. The status of the signature can be verified by accessing the inspection step. The status of the signature can be verified by accessing the
signatures sections of a document. signatures sections of a document.
.. blockdiag::
blockdiag {
orientation = portrait
span_width = 240;
user [ shape = "actor" ];
key [ shape = flowchart.database, label = "Key" ];
document [ shape = "note", label = "Document" ];
document_signed [ label = "Signed\nDocument" ];
key -> user -> document -> document_signed;
}
Signed documents are tamper-proof. That means that if any part of the document's
file is edited (even just one character or one pixel), the document's
signature becomes invalid alerting that an unathorized change has ocurred.
Existing non signed documents can be signed in one of two ways: Existing non signed documents can be signed in one of two ways:
by downloading the document, signing it, and uploading the signed document by downloading the document, signing it, and uploading the signed document
as a new version of the existing one or by creating a detached signature for as a new version of the existing one or by creating a detached signature for
@@ -21,6 +40,6 @@ keys no longer needed can also be deleted from this menu.
Only `GNU Privacy Guard`_ signatures are support at the moment. Only `GNU Privacy Guard`_ signatures are support at the moment.
Only version 1 of `GNU Privacy Guard`_ is supported for now. Only version 1 of `GNU Privacy Guard`_ is supported at the moment.
.. _`GNU Privacy Guard`: www.gnupg.org/ .. _`GNU Privacy Guard`: www.gnupg.org/

View File

@@ -31,6 +31,27 @@ The current document sources supported are:
when the quality of the scans is irrelevant or when they will be known when the quality of the scans is irrelevant or when they will be known
to be of good quality, such as when receiving e-faxes as PDFs. to be of good quality, such as when receiving e-faxes as PDFs.
.. blockdiag::
blockdiag {
mayan [shape = "roundedbox", label = "Mayan EDMS" ];
email_pop3 [shape = "mail", label = "e-mail (POP3)"];
email_imap [shape = "mail", label = "e-mail (IMAP)"];
staging [shape = "flowchart.database", label = "Staging folder" ];
watch [shape = "flowchart.database", label = "Watch folder" ];
automatic [shape = "box", label = "Automatic\n(via schedule)" ];
manual [shape = "actor", height=60, label = "Manual\n(user interaction)" ];
web [shape = "note", label = "Webform upload" ];
automatic -> mayan;
email_pop3 -> automatic;
email_imap -> automatic;
watch -> automatic;
manual -> mayan;
staging -> manual;
web -> manual;
}
Document source can be configure to allow document bundles to uploaded as Document source can be configure to allow document bundles to uploaded as
compressed files which are decompressed and their content uploaded as separate compressed files which are decompressed and their content uploaded as separate
documents. This feature is useful when migrating from another document documents. This feature is useful when migrating from another document

View File

@@ -0,0 +1,84 @@
=============
Upload wizard
=============
The steps needed to upgrade a document using form-tools' ``SessionWizard``
were hardcoded in the ``source`` app. This made it very difficult to add or remove
wizard steps.
The steps of the wizard are now defined by a new class called
``sources.wizard.WizardStep``. The existing steps to select a document type,
enter metadata and tag the document, have been converted to function as
``WizardSteps`` subclasses. The converted steps now live in
``sources.wizards.WizardStepDocumentType``, ``tag.wizard_steps.WizardStepTags``,
and ``metadata.wizard_steps.WizardStepMetadata``.
The steps need to define the following methods:
- ``done``: This method is execute when the wizard finished the last step
an enter the step where the actual file are uploaded. This steps is used
to encode form data into the URL query string that will be passed to the
document upload view for each file uploaded.
- ``condition``: This method is used to display the step conditionally.
If this method return True it will be displayed during the upload wizard
execution. To skip the step, return False or None.
- ``get_form_initial``: This method is used to return the initial data
for the step form. Use this method to set up initial values for the step's
form fields.
- ``step_post_upload_process``: This method will be executed once the
document finishes uploading. Use this method to process the information
encoded in the URL querystring by the step's `done`` method.
Once the ``WizardStep`` subclass is defined, it needs to be registered. This
is done by calling the ``.register`` method of the ``WizardStep`` class with
the subclass as the argument. Example::
WizardStep.register(WizardStepMetadata)
This statement must be located after the subclass definition. Finally,
the module defining the wizard step must be imported so that it is loaded
with the rest of the code and enabled. The best place to do this is in the
``.ready`` method of the apps' ``apps.py`` module. Example::
class TagsApp(MayanAppConfig):
has_rest_api = True
has_tests = True
name = 'tags'
verbose_name = _('Tags')
def ready(self):
super(TagsApp, self).ready()
from actstream import registry
from .wizard_steps import WizardStepTags # NOQA
The ``WizardStep`` class also allows for unregistering existing steps. This
is accomplished by calling the ``.deregister`` method of the ``WizardStep``
class and passing the subclass as the argument. This method should
also be called inside the ``.ready`` method of an apps' ``apps.py``
module. Example::
class TagsApp(MayanAppConfig):
has_rest_api = True
has_tests = True
name = 'tags'
verbose_name = _('Tags')
def ready(self):
super(TagsApp, self).ready()
from actstream import registry
from metadata.wizard_steps import WizardStepMetadata # NOQA
from sources.wizards import WizardStep # NOQA
from .wizard_steps import WizardStepTags # NOQA
WizardStep.deregister(WizardStepTags)
This will cause the tags assigment step to not be assigned to the upload
wizard anymore.

View File

@@ -8,5 +8,41 @@ version changes in comparison with the previous one. If a new version was
uploaded by mistake or such new version is no longer necessary the option to uploaded by mistake or such new version is no longer necessary the option to
revert to a previous version of the document is provided. revert to a previous version of the document is provided.
.. blockdiag::
blockdiag {
default_shape = roundedbox
orientation = portrait
node_width = 200;
version_1 [ label = "Version 1" ];
version_2 [ label = "Version 2" ];
document_1 [ label = "payroll_report.pdf" ];
document_2 [ label = "payroll_report_fixed.pdf" ];
upload_1 [ label = "payroll_report.pdf" ];
upload_2 [ label = "payroll_report_fixed.pdf" ];
upload_1 -> version_1 -> document_1;
upload_2 -> version_2 -> document_2;
document_1 -> document_2;
}
Only the interactive document sources (:doc:`sources`) (``Web`` and ``Staging folders``) are Only the interactive document sources (:doc:`sources`) (``Web`` and ``Staging folders``) are
available to upload new document versions. available to upload new document versions.
There is no limit to the number of versions a document can have.
.. blockdiag::
blockdiag {
default_shape = roundedbox
orientation = portrait
node_width = 200;
document [ label = "payroll_report.pdf" ];
versions [ label = "Versions", stacked ];
document -> versions;
}
By default, the last version will be showed when working with the document
but any of the versions can be inspected and viewed.

View File

@@ -1,4 +1,5 @@
Sphinx==1.7.1 Sphinx==1.7.1
sphinx-autobuild==0.7.1 sphinx-autobuild==0.7.1
sphinx_rtd_theme==0.2.4
sphinxcontrib-blockdiag==1.5.5 sphinxcontrib-blockdiag==1.5.5