Version 3.2
Released: June 13, 2019
Work on version 4.0 continues along. Version 4.0 brings so many changes that it missed its release schedule. Therefore we decided to release an interim version, this one. This version includes bug fixes and back-ports many improvements already in the 4.0 development version. It also helps bridge the gap between the internal code and interfaces between the 3.x and 4.x code branches. The minor increment means that user-facing backward incompatible changes are minimal. Most of the changes are internal and of notice for developers.
That doesn’t mean there are no changes important to users. This release brings about one third (1/3) of the user interface changes that have already landed in the 4.0 version.
Besides the usual template and style tweaks, this version adds a new contextual navigation bar. This bar is a hybrid between a list menu bar and a sidebar menu. Icons in this menu object will show in the object list view and when the object is the main object in the template. This reduces substantial mouse travel and clicks, as most views of the object now remain “open” in the sidebar instead of being hidden inside the “Actions” drop down.
The “Actions” drop-down will now divide the available actions links depending on the menu that defines them (“action”, “secondary”) and the object that they act upon. This is useful on views that can display more than one object at a time such as the setup views. During the workflow setup view, now the action links will be split between action for the workflow, for the state, and for the transition making setup navigation much faster and requiring less mental effort as the user no longer need to remember which link affects which view object.
Another big user interface change that landed on this version is the ability to sort lists of objects by column fields. Sortable fields will have their column heading displayed as an HTML link. Clicking on a column heading link will sort the list by the values of the column. Clicking the heading again will invert the sort order. A small arrow icon will show the sort order.
A new app was added to the core. The app is named “File metadata” and allows extracting file information. The app includes a driver by default to extract EXIF field information. This file field includes camera information for photos, authors for office documents and PDFs and other information that can now be used to search or index documents. This app was previously a separate app called Mayan-EXIF (https://gitlab.com/mayan-edms/exif). The app was generalized and is now part of the core group of apps.
This is a “minor” release only in version number scheme since it includes a big number of code changes. The minor number increase means that it will be as backward compatible with version 3.1.10 as possible.
Changes
API
The API documentation generation code was moved from the root module where it was out of place to the REST API app. The published URLs however remain the same and backwards compatible.
Apps
Dependencies app: A new app was added to handle all dependencies. Previously, the code to handle JavaScript dependencies and license text collection, was contained in the common app. This new app, called “dependencies” now handles both tasks. In addition, it provides checks for binary dependencies. This app’s main view will allow users to know which dependencies are not being recognized and help debug installation issues faster and easier. The app supports Python, JavaScript, and binary dependencies.
The JavaScript library download and installation code was updated to provide faster hash verification using block hashing. During tests the this change cut verification time to just 28% of the previous time. Additionally, the JavaScript downloader can now detect existing installations of JavaScript libraries and skip them for even faster upgrade or startup times.
With the exception of the jQuery.ScrollView library there are no JavaScript libraries of packages in the git repository of the code anymore. All JavaScript are now downloaded at install time.
The dependencies app also has the ability to introspect packages and extract copyright and license information. This removes the need to include such texts explicitly in the code for all packages.
Dashboard app: All the code to defined and generate the dashboard was moved from the common app into its own app called “dashboards”. The functionality remains the same but along with the formalized interface, the move will allow future planned improvements to the dashboard functionality to be rolled out. While only one dashboard will still be displayed, it is possible to define in code more than one dashboard using the Dashboard class.
Autoadmin app: The autoadmin app which is in charge of creating the initial admin user after the installation, has been included in the core. This app is made by the same author of Mayan EDMS and at one time in the past was part of the core apps.
File metadata: Allows extracting file information. The app includes a driver by default to extract EXIF field information (https://en.wikipedia.org/wiki/Exif). This is mostly multimedia information but the default driver can also extract information from authorship from PDF and office files. The information extracted by this app can be used to search or index documents.
Deprecations
Internally many interfaces and calls have been deprecated in other to move the code closer to 4.0’s standard. The only feature deprecated on the user facing side is the convertdb management command. This command was added to allow existing installation using SQLite as the database manager to convert their database to one of the recommended database managers.
After many reports the consensus was reached that this functionality is not meant to be provided in the project. Software projects have little or no control of the aspects upon which they rely. Framework, environment, platform, OS, databases are such examples.
Database conversion is a task best suited for operations oriented software and professional and no Mayan’s end users. For these reason the database conversion command has been deprecated and will be removed in the next major version.
Docker image
Docker image updated to use Debian 9.8.
The size of the Docker image was reduced from 1.25 GB to 1.09 GB.
Support was added for setting the Docker container user’s UID and GUID.
The Docker image now includes all static media like JavaScript libraries and themes. This make the initial startup of the image faster as only the database migration is execute and the restart of the image almost instant.
Events
The events system received many updates. Now more apps register and record events. Some new events recorded are:
Document link mailing.
Users creation, modification, log in and log out.
Groups creation, modification.
Roles creation, modification.
Indexes creation, modification.
ACLs creation, modification.
Workflows creation, modification.
Smart links creation, modification.
Smart links creation, modification.
A new link was added under the User menu to show all the events of the currently logged user.
Incompatible changes
Existing config.yml files need to be updated manually. The prefix ‘mayan.apps’ must be added to any reference of an app.
All the Internet Explorer specific HTML markup was removed from the templates.
Installation
Installation seems to be the most error-prone stage of the process in getting to use Mayan EDMS. Just like configuration, installation, and dependency management are other areas where the underlying framework and language don’t provide tools and it is up to the project to come up with an alternative to bridge the functionality gap.
This version includes a new dependency manager that is able to track the dependencies of each app. The dependency manager supports JavaScript, Python, and binary dependencies. This allows the dependency manager to also provide users with a centralized view to diagnose their installations for missing dependencies that may be affecting the functionality.
The dependency manager also includes improvements that will allow reusing downloaded JavaScript packages and can perform hash verification faster.
Besides the dependency check view in the Tools menu, a management command was
added to show the same information from the command line. This command is called
checkdependencies
.
Developers can also use the new generaterequirements
command to generate the
Python requirement files from the dependencies declared in the apps of the
project, keeping all dependency files synchronized with ease.
Internals
Big or complex app modules were split into separate modules. This includes models, views, and tests. A star (*) was added to keep current imports working but it is encourage to import from the module itself.
For example: The document apps models.py module was split into:
documents/models/document_models.py
documents/models/document_page_models.py
documents/models/document_type_models.py
documents/models/document_version_models.py
documents/models/misc_models.py
The module documents/models/__init__.py include them all using a start import so that any import to the path mayan.apps.documents.models still works.
Other modules that were split were:
Workflow views and tests.
Trashed document views.
Favorite document views.
Development URL definitions were removed from the main URL definition file.
Instead, the top level urls.py
file was converted into a module folder holding
several URL pattern definition files. Each URL pattern definition file can be
specified independently by changing the value of the ROOT_URLCONF
setting.
Instead of inserting the path of the apps into the Python path, the apps are
now referenced by their full import path. For example: Instead of referencing
the Documents app using the string documents
, the full dotted path must be
used, mayan.apps.documents
. This change namespaces all apps under a module
folder and solves name clashes with external or native Python libraries. Once
example of such name clash: The statistics app was called “statistics” and
it clashed with Python’s new statistics library of the same name. The solution
at the time was to rename Mayan’s to “mayan_statistics”. With this change
solutions like this won’t be necessary.
This means that any reference to an app, either in the code or from a
configuration file must now be prefixed with mayan.apps
. Existing
config.yml
files need to be updated manually.
For developers, a new test mixin was added called SilenceLoggerTestCaseMixin
.
It allows lowering the level of loggers during tests. To use this mixin call
self._silence_logger()
and provide the dotted path to the module whose message
level will be lowered. By default the new level will be set to critical.
Support was added for link icon path imports. Instead of importing all icons,
a link can reference the dotted path of the icon. The link argument for this is
called icon_class_path
.
Support for link icon strings was removed. Only icon classes are allowed now.
This keeps all icon definitions encapsulated in the icons.py
modules.
Middleware were updated to support both, Django’s old and new style middleware.
A new class named FormOptions
was added to reduce the boilerplate code needed
to add Meta options to custom Form classes. This class is used to create a new
reusable form that will filter a selection field based on a permission. This
reusable form is called FilteredSelectionForm
. This class is used to simplify
and unify the TagMultipleSelectionForm
, CabinetListForm
, ACLCreateForm
,
IndexTemplateFilteredForm
, and DocumentVersionSignatureCreateForm
subclasses.
Support was added for help text on extra fields of the DetailForm
.
Language choices generation was moved to documents.utils
.
The TwoStateWidget
class was converted to work as a template widget. It is
also now compatible with SourceColumn
and don’t need to be evaluated using
lambdas.
The SourceColumn
class received many updates to make is more versatile and
reduce the boilerplate code to define model columns. It now supports related
attributes using a double underscore separator. This eliminates the need of
functions or lambdas for related fields. Also added was support displaying a
placeholder text for empty attribute values. This eliminates the need to
create a model or class method to capture empty or None values and display a
translatable text. Support was added to enable an instance’s absolute URL for a
column removing the need to add and define a single use link for a clickable
column. The SourceColumn
class now supports keyword arguments via
kwargs
to pass to the column function.
The star import was removed from the ACL and Common app’s __init__.py
module. All acls.classes.ModelPermission
, common.generics
, and
common.mixins
imports have to done explicitly.
The authentication function views were updated to use Django’s new class based authentication views.
The current user views were moved from the common app to the user management app. And vice versa the user and current user password change views were moved to the authentication app from the user management app. Now everything related to accounts resides in the user management app and anything relating to passwords and authentication resides exclusively in the authentication app.
The custom email form widget provided by common.widget
was removed as Django
now includes one.
All file related utilities were moved from the common.utils.py
module to the
to the storage app’s utils.py
module.
The navigation and authentication templates were moved to their respective apps. They are no longer found in the appearance app’s templates folder.
General queryset slicing of the Document list view was removed and added to the only subclass view that uses it which is the Recently Added Document view.
A new view called AddRemove
was added which replaces AssignRemove
. All
views were updated and AssignRemove
removed from the code. This class
offers a much cleaner design and more functionality like adding or removing
multiple items from a single post request. This is achieve by passing a
queryset of the selection instead of calling the add or remove methods for
each item of the selection.
A new test case mixin was added to provide ephemeral test models. These are memory only model classes that allow tests to be performed much faster while testing all aspects as if it were any other statically defined model. Several test views that used documents models were converted for speed increases of several order of magnitude. Along with ephemeral models, ephemeral test permissions were added removing the need to use static permission for generic permission compliance tests.
Move stub filtering to the Document model manager. All subclasses of the
DocumentListView
class were updated to simplify their document queryset
generation.
The transformation manager methods were renamed from add_for_model
to
add_to_object
, and get_for_model
to get_for_object
, to reflect the
fact that they can only operate only models.
The title calculation was converted from a template markup to a template tag.
The permission inherited computation was improved and now operates mostly at the database layer instead of being mostly a Python computation. A similar improvement was done to the ACL calculation system. The ACL calculation now operates mostly on the database layer freeing many resources and scaling better. The access checking method was updated to be a wrapper for the new ACL queryset calculation, reducing the amount of code and benefiting from the ACL queryset calculation improvements.
Related to the ACL calculation updates is the fact that views will now operate
of a filtered queryset as returned by restrict_queryset
instead of directly
checking the access of the action being performed by the view. The update
process of the views to this new methodology was started and will be completed
in the next versions. Eventually the .check_access
method will be either
removed of used for special cases.
A small change with big repercussions is the rename of get_object_list
to
get_source_queryset
. This change represents a shift in the way views will
filter their queryset in the entire project. Since Django doesn’t provide hooks
for transforming a queryset before usage by the view, instead of being passed
a model or a queryset directly, views will be passed a source queryset via
get_source_queryset
which will be filtered by restrict_queryset
and this
final queryset will be passed to the view as if from its normal get_queryset
method. This allows using views as they are normally provided by Django and add
Mayan’s access control with minimal changes.
Uniqueness validation was added SingleObjectCreateView
.
MultipleInstanceActionMixin
was removed, MultipleObjectFormActionView
or MultipleObjectConfirmActionView
must be used instead. These two classes
provide action handling for single (using pk
) or multiple model instances (
using id_list
) from the single view definition.
MultipleObjectMixin
improvements were back ported. Selections are passed
using get_object_list
or self.object_list
.
ObjectListPermissionFilterMixin
was removed.
The license.py
module in apps was removed, licenses are now defined in
dependencies.py
for the ones that the dependency app can’t introspect
automatically.
Model permission proxy models support were removed. The permission system can now
detect inherited permission from multiple levels. Related to this change the
related
access control argument to check_access
, links, API views
mayan_permission_attribute_check
was removed. This is all now handled by the
related field registration.
The permissions system now supports nested access control checking. Self
referencing models like Cabinets
, must provide a custom function to filter
their permission checking.
An optimization was added which removed the exception catch for the
permissions
argument of the check_access
method. permissions
argument must now be an iterable.
Signal handlers must now be prefixed with handler
.
Remove .filter_by_access
. Replaced by .restrict_queryset
.
Rename the form template form_class
to form_css_classes
to
differentiate it from Python form classes.
All views now redirect to the common
app’s home view instead of the
REDIRECT_URL
setting.
The project was updated to PyYAML version 5.1. The use of safe_load
and
safe_dump
was changed to load
and dump
using the CSafeLoader
and SafeLoader
as fallback. This makes YAML handling faster and safer.
Mailing
Mailing profiles were updated to allow specifying the email sender address. This change closes GitLab issue #522.
If an existing mailer profile specified a backend that is now invalid instead
of showing an error it will be replaced by a new NullMailer
class.
Due to the change of using the entire dotted path of apps, the backend of existing mailing profiles will be invalid and must be re-created.
The document link URL when mailed is now composed of the COMMON_PROJECT_URL
setting plus the document’s URL instead of Django Site
domain. This was
the only use of Django’s Site
model and was removed to an easier to configure
setup.
MERCs
Two new Mayan EDMS Requests for Comments were approved during version 4.0 development and applied to this release too.
MERC 5 now requires all callables to use explicit keyword arguments. This MERC is effect makes positional arguments obsolete. These are only retained for Python modules and callables that don’t support named or keyword arguments.
MERC 6 introduces a security and privacy policy. This policy is a preemptive information disclosure reduction. This means that code and views in general will disclose less information than they used to when the user doesn’t have the required access for an object, view, or action. Instead of displaying an “Access denied” or “Forbidden” error, a “Not found” or 404 error will be raised. This way the user will not have any information about the existence of a resource for which access has not been granted. To keep the API compatible for this minor release, MERC 6 was put into place for the views only.
If you are developing a third party app, update your non-access view tests to expect a 404 and not a 403 error.
Memory usage
The code audit performed during the development of version 4.0 revealed many areas where optimizations were possible. All the backward compatible optimizations were backported to this version. These are:
Block reading for document hash instead of loading the entire document’s file into memory.
A temporary file is used for mime type detection instead of reading the entire file into memory or just reading the first bytes of the file.
Converter class is now initialization only when needed this allows more effective garbage collection.
Use of file-like objects instead of buffers.
The change to file-like objects allowed the use of Python’s
copyfileobj
in several places.Only one language is loaded in the document properties form.
Improved ACL system which moves computation of the access control to the database instead of doing the filtering in Python code.
The language list was converted into a function instead of being used as a list in all instances.
Use of context manager for all creation of file-like objects.
Extensive use of temporary files for office document conversion instead of relying on easier to use but more wasteful memory buffers.
As a result, the memory footprint and CPU usage were lowered substantially. Memory usage was lowered to 700MB of RAM under full load. This is great news for all user but of special importance for restricted environments like low tier virtual hosts, container deployments, and single board computers like the Odroid or the Raspberry Pi.
OCR
Add new and default Tesseract OCR backend was added to avoid Tesseract bug 1670 (https://github.com/tesseract-ocr/tesseract/issues/1670, https://gitlab.gnome.org/World/OpenPaperwork/pyocr/issues/104). This bug make it impossible to use Tesseract via PyOCR under Python 3.
Permissions
The role permission grant and revoke permissions were removed. Instead only the role edit permission is required to grant or revoke permissions to a role.
Dual permissions are now required for some objects. For example, when adding or removing users to and from a group, the edit permission must be granted to the user and the group. These permission changes are minimal for this version but will be rolled out to be the norm on the entire system.
Python 3
Long awaited Python 3 support is here. To ensure a smooth transition only the Python package will be release supporting Python 2.7 and 3. For the next release, the Docker image will be converted to work on Python 3. And finally, on the release of the next major version, version 4.0, Python 3 will be the only Python version support. This version of Mayan EDMS, as well as future versions of the same series (3.x) will be the last version supporting python 2.7.
To recap:
Version 3.2 = Python 2.7 & Python 3, Docker with Python 2.7.
Version 3.3 = Python 2.7 & Python 3, Docker with Python 3.
Future versions 3.x = Python 2.7 & Python 3, Docker with Python 3.
Version 4.0 = Python 3 only, Docker with Python 3.
If important security issues are found subsequent series 3.x releases will be done for users that can’t for some reason upgrade to a version using only Python 3.
Reliability
Database transaction handling was added in many more places to ensure data integrity even in extreme situations.
Removals
For each version, we identify functionality or requirements that can be removed. For this version, Django suit was removed from requirements as well as support for generating documents images in base 64 format.
Settings
The HOME_VIEW
setting was defined without a namespace and as a top level
setting. This configuration is reserved for native Django setting and the
HOME_VIEW
setting is now namespaced to the COMMON app where it is defined.
The setting global name therefore changes from HOME_VIEW
to
COMMON_HOME_VIEW
.
More Django settings were exposed and can now be modified:
AUTH_PASSWORD_VALIDATORS
DEFAULT_FROM_EMAIL
EMAIL_TIMEOUT
INTERNAL_IPS
LANGUAGES
LANGUAGE_CODE
LOGOUT_REDIRECT_URL
STATIC_URL
STATICFILES_STORAGE
TIME_ZONE
WSGI_APPLICATION
New default value of 65535 for the DOCUMENTS_HASH_BLOCK_SIZE
setting. This
means that new documents will be read and process in blocks of 65K to determine
their SHA256 hash instead of being read entirely in memory.
Removal of the MIMETYPE_FILE_READ_SIZE
setting. A new method was implemented
to reduce memory usage of the MIME
type inspection code. Instead of limiting
the number of bytes read as specified by the MIMETYPE_FILE_READ_SIZE
setting,
now the entire file is saved to a temporary file and the MIME
type library
called with the temporary file reference. This approach while minimally slower
provides the benefits of lower memory usage without sacrificing MIME
type
detection accuracy which was a downside of the MIMETYPE_FILE_READ_SIZE
setting
approach.
Several improvements were back ported to the search app. One of this allows
returning the search result as a queryset. Queryset are “lazy” and not
evaluated until accessed. This means a queryset can represent a vast number
of documents with consuming the entire memory that would be required to hold
all the documents instances as a list would. This change make the memory
limiting setting SEARCH_LIMIT
obsolete and was removed.
Additionally the search time elapsed calculation was removed. This code stopped being used from the code several version ago.
The default value for the recently added, recently accessed, and favorite documents settings was increased from 40 to 400. Using the default pagination size of 40 documents per page than means a total of 10 pages of documents for each of one of these views instead of just one page.
The setting COMMON_TEMPORARY_DIRECTORY
was moved to the storage app.
The setting is now called STORAGE_TEMPORARY_DIRECTORY
.
User interface
Many user interface updates were back ported some very noticeable others less so but still have a big impact on usability and navigation.
New icons classes and templates were added which allow many icon manipulations like icon composition. This allow for a more unified visual language.
The right side menu, called the “sidebar” is now a separate unit in both markup and code. This new side bar is implemented independently of the main view. This change allows for independent scrolling and more usable screen area.
Support was added for sortable columns. These allow sorting the results of a list by clicking on the column heading label. Clicking on the label again reverses the sorting order.
select2 widget is used in more places reducing data entry and providing quick search capabilities.
The markup for the invalid document image was converted into a server side template for easier customization and reuse.
The sidebar
menu instance was removed. The secondary
menu now perform
the same function.
For every function that involved two types of objects, two views were added. For example: Associating a workflow to a document type can now be done from the workflow edit view or from the document type edit view. This eliminates jump over from the view of one object type to the other.
Form can be submitted by pressing the Enter key or by double clicking.
The full name field was removed from the user list. Instead the first name and last name fields are shows which are sortable.
Completion level and initial workflow state are now shown in the workflow proxy instance menu.
Fix translation of the source upload forms using the drag and drop dropzone.js widget.
Bootstrap and Bootswatch were updated to version 3.4.1.
Support was added for attaching form button aside from the default submit and cancel. The new add and remove views use this allow adding all or removing all with a single click.
CSS updates were added to maximize usable width of the screen.
Navigation error messages display was improved for easier debugging.
The permission list was removed from the ACL list view. This reduces clutter and unpredictable column size. The permission list can be accesses by pressing the “Permissions” button.
The default title truncation length was increased to 120 characters. Even when truncated, hovering over the title will now show the entire title as a pop over.
Widgets
Previously form widgets and HTML widgets resided in the same .widgets.py module. The .widgets.py module is now reserved for form widgets and HTML widgets will be found in a new module called html_widgets for each app.
The interface for Mayan’s HTML widget has been formalized and these can be used
with the SourceColumn
class without having to use a lambda. The widget argument
was added to the SourceColumn
was for this purpose.
The tag selection form widget uses some specialize JavaScript to support rendering the tag during selection. This code used to live in the main template and was loaded even when not in use. The JavaScript code was move to the tags app and is now loaded only when used. This will cause a slight visual artifact when the form is loaded. Aside from this visual side effect it continues to work as before.
Other changes
Convert the document tags widget to use HTML templates.
Update
ChoiceForm
to be full height.Commit user edit event when an user is added or removed from a group.
Commit the group edit event when a group is added or remove from an user.
Commit the group event in conjunction with the role event when a group is added or remove from role.
Monkeypatch group and user models to make their fields translatable.
Add outline links CSS for facets.
Add a bottom margin to list links.
Fix multiple tag selection wizard step.
Update tag document list and the document tag list views to require the view permissions for both objects.
Install and server static content to and from the image. Remove installation of static content from the setup and upgrade stages.
Add support for editing document comments.
Fix optional metadata remove when mixed with required metadata.
Create intermediate file cache folder. Fixes preview errors when the first document uploaded is an office file.
Move queue and task registration to the
CeleryQueue
class. The.queues.py
module is now loaded automatically.Add task dotted path validation.
Increase dropzone upload file size limit to 2GB
Add cabinet created and edited events.
Chart updates: Show last update date and time in list view and details view. Change color scheme to match rest of project. Increase size of data points. Improve responsive settings. Redirect to the current view after queuing.
Split document type retention policies into it own view.
Place deletion policies units before periods for clarity.
Remove the included Lato font. The font is now downloaded at install time.
Add support for Google Fonts dependencies.
Add support for patching dependency files using rewriting rules.
Allow searching documents by UUID.
Improve search negation logic. Only dashes at the start of terms and outside of quotes are now interpreted as negation.
Add support for search field transformations.
Disable hiding page navigation on idle.
Display namespace in the transition trigger view.
Sort events list in the transition trigger view.
Add support for form media to DynamicFormMixin.
Fix tag attach and remove action form media.
Sort content type list of the access grant and remove action.
Use select2 for the content type filed of the access grant and remove action.
Add Latvian translation.
Support search model selection.
Support passing a queryset factory to the search model.
Add workflow actions to grant or remove permissions to a document.
Add support for locked files for watchfolder.
Removals
Django suit third party app.
Upgrading from a previous version
If installed via Python’s PIP
Remove deprecated requirements:
$ curl https://gitlab.com/mayan-edms/mayan-edms/raw/master/removals.txt | pip uninstall -r /dev/stdin
Type in the console:
$ pip install mayan-edms==3.2
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.
Remove deprecated requirements:
$ pip uninstall -y -r removals.txt
Next upgrade/add the new requirements:
$ pip install --upgrade -r requirements.txt
Common steps
Perform these steps after updating the code from either step above.
Make a backup of your supervisord file:
sudo cp /etc/supervisor/conf.d/mayan.conf /etc/supervisor/conf.d/mayan.conf.bck
Update the supervisord configuration file. Replace the environment variables values show here with your respective settings. This step will refresh the supervisord configuration file with the new queues and the latest recommended layout:
MAYAN_DATABASE_ENGINE=django.db.backends.postgresql MAYAN_DATABASE_NAME=mayan \
MAYAN_DATABASE_PASSWORD=mayanuserpass MAYAN_DATABASE_USER=mayan \
MAYAN_DATABASE_HOST=127.0.0.1 MAYAN_MEDIA_ROOT=/opt/mayan-edms/media \
/opt/mayan-edms/bin/mayan-edms.py platformtemplate supervisord > /etc/supervisor/conf.d/mayan.conf
Edit the supervisord configuration file and update any setting the template generator missed:
vi /etc/supervisor/conf.d/mayan.conf
Migrate existing database schema with:
$ mayan-edms.py performupgrade
Add new static media:
$ mayan-edms.py preparestatic --noinput
The upgrade procedure is now complete.
Backward incompatible changes
Due to the change of using the entire dotted path of apps, the backend of existing mailing profiles will be invalid and must be re-created.
Paths to apps must be updated in existing
config.yml
files. Add the prefixmayan.apps.
to any app reference. Some instances:LOCK_MANAGER_BACKEND: lock_manager.backends.file_lock.FileLock
to
LOCK_MANAGER_BACKEND: mayan.apps.lock_manager.backends.file_lock.FileLock
OCR_BACKEND: ocr.backends.pyocr.PyOCR
to
OCR_BACKEND: mayan.apps.ocr.backends.pyocr.PyOCR
CONVERTER_GRAPHICS_BACKEND: converter.backends.python.Python
to
CONVERTER_GRAPHICS_BACKEND: mayan.apps.converter.backends.python.Python
Check the supervisord logs at
/var/log/supervisor
for additional errors in the form:ImportError: No module named ocr.backends.pyocr
To collect and compress the static media files, use the new
preparestatic
command instead of the traditionalcollectstatic
. Both work the same way, butpreparestatic
has a default blacklist to avoid collecting files from tests, development setup, and demos.
Bugs fixed or issues closed
GitLab issue #475 Finish converting all views to class based views.
GitLab issue #498 Can’t scan sub directories
GitLab issue #522 Office 365 SMTP
GitLab issue #539 Setting for default email sender is missing
GitLab issue #543 Docker: Support PGID/PUID Usage
GitLab issue #549 Clean docker installation does not create documents_cache folder
GitLab issue #550 Document content does not appear for non-PDF files
GitLab issue #553 Python 3
GitLab issue #563 Recursive Watch Folder
GitLab issue #579 Untranslated items
GitLab issue #589 Document {{ link }} send via Email contains example.com as domain
GitLab issue #595 Remove dependency to fonts.googleapis.com