Compare commits

..

345 Commits

Author SHA1 Message Date
Roberto Rosario
971d643759 Merge branch 'feature/multi-tenant' of gitlab.com:mayan-edms/mayan-edms into feature/multi-tenant 2016-06-13 03:14:24 -04:00
Roberto Rosario
ba493cf984 Update document_states app to support organizations. 2016-06-10 19:59:09 -04:00
Roberto Rosario
9ffcfeb49b Use simple password hasher to speed up tests.
Before: Ran 346 tests in 156.928s
After: Ran 346 tests in 144.324s
2016-06-08 19:30:45 -04:00
Roberto Rosario
41f68cf435 Remove unused import. 2016-06-08 19:30:34 -04:00
Roberto Rosario
072bfcf2aa Use organization manager. 2016-06-08 19:30:20 -04:00
Roberto Rosario
6a258e4a02 Remove remarked imports. 2016-06-08 19:30:04 -04:00
Roberto Rosario
59fbe2d409 Turn on all warnings when running tests. 2016-06-08 19:29:45 -04:00
Roberto Rosario
aa0f48b1a0 Update OCR app to use organizations. 2016-06-08 19:29:20 -04:00
Roberto Rosario
a2f8e8b8d8 Finish updating checkouts app to support organizations. 2016-06-08 16:58:57 -04:00
Roberto Rosario
7ae0917564 Fix document app tests. 2016-06-08 02:02:25 -04:00
Roberto Rosario
ff30268a4b Fix folder api tests. 2016-06-08 01:59:32 -04:00
Roberto Rosario
5466dcdad3 Convert metadata app to use organizations. 2016-06-08 01:37:15 -04:00
Roberto Rosario
2035602836 Make the organization and rest api tests cleaner to import from other modules. 2016-06-08 01:26:01 -04:00
Roberto Rosario
326919271a Merge branch 'development' into feature/multi-tenant 2016-06-06 05:20:43 -04:00
Roberto Rosario
043233f79e The UserEditView view add the "user" context variable and confuses the base.html template. Update the base template to use *request.user* instead of just *user* to access the currently logged user. GitLab issue #295. 2016-06-06 05:17:28 -04:00
Roberto Rosario
883e623a15 User self.setdout instead of print as per documentation: https://docs.djangoproject.com/en/1.8/howto/custom-management-commands/#django.core.management.BaseCommand.style 2016-06-06 04:55:07 -04:00
Roberto Rosario
728121b1bb Add help message when initialsetup migration phase fails. GitLab issue #296. 2016-06-06 04:54:05 -04:00
Roberto Rosario
331a4da3b3 Don't create a default organization on each initialization of the organization app. GitLab issue #297. 2016-06-06 02:54:32 -04:00
Roberto Rosario
017dc67d3c Fix trashed document list view url name. 2016-06-01 12:19:41 -04:00
Roberto Rosario
aea00db37e Replace imports of Group for MayanGroup. 2016-05-31 01:23:24 -04:00
Roberto Rosario
629cc24090 Add OrganizationAdminMixin. Enable OrganizationAdminMixin for the tags, folders and user_management apps. 2016-05-31 01:22:15 -04:00
Roberto Rosario
f799d379d1 Remove print statement. 2016-05-30 23:55:25 -04:00
Roberto Rosario
8221f90fd3 Improve tags app organization test. 2016-05-30 23:55:02 -04:00
Roberto Rosario
f6dfff5949 Use the OrganizationTestCase class for the tags app model tests. 2016-05-30 23:54:32 -04:00
Roberto Rosario
38eb65151a Use the GenericAPITestCase for the documents and tags api tests. 2016-05-30 23:52:23 -04:00
Roberto Rosario
8435b8444a Add REST API base test case class. 2016-05-30 23:51:28 -04:00
Roberto Rosario
e5c51749da The return value is an user instance not an username. 2016-05-30 23:50:54 -04:00
Roberto Rosario
132d66fff8 Use the plural form 'required_permissions' to make it all uniform thruough the project. 2016-05-30 23:47:49 -04:00
Roberto Rosario
0a545f4b33 Return the created organization instance when creating the default organization. 2016-05-30 23:46:11 -04:00
Roberto Rosario
305aad0bfa Invalidate caches when creating organization admins. 2016-05-30 23:45:26 -04:00
Roberto Rosario
ccf3795601 Update the acls, common and documents tests to use OrganizationTestCase class. 2016-05-30 19:33:49 -04:00
Roberto Rosario
18bd82ba55 Fix authentication app view tests. 2016-05-30 19:23:27 -04:00
Roberto Rosario
3ebadf763b Add clean up method to OrganizationModelTestCase 2016-05-30 19:18:23 -04:00
Roberto Rosario
f9670ea7c2 Add a base organization test case class. 2016-05-30 19:16:58 -04:00
Roberto Rosario
de40977f5f Convert checkouts app to use organizations. 2016-05-30 19:14:34 -04:00
Roberto Rosario
aca93a0deb Update the Message of the day (motd) app to support organizations. 2016-05-30 17:51:24 -04:00
Roberto Rosario
e943588ba2 Move the OrganizationSourceManager manager to it's own module. Cleanups. 2016-05-30 15:42:33 -04:00
Roberto Rosario
db1673dd0a Convert sources app to use organizations. 2016-05-30 15:37:58 -04:00
Roberto Rosario
2dcad10805 Add missing .objects. 2016-05-30 06:49:52 -04:00
Roberto Rosario
ead86806d4 Add explicit organization deletion to the common generic test. 2016-05-30 06:18:26 -04:00
Roberto Rosario
cc360be4a4 Finish converting the tags app to user organizations. 2016-05-30 06:18:06 -04:00
Roberto Rosario
69bd6cc308 Finish conversion of the folders app to organizations. 2016-05-30 06:12:57 -04:00
Roberto Rosario
395fe0cb98 Finish conversion of the documents app to support organizations. 2016-05-30 06:10:08 -04:00
Roberto Rosario
d9137b4361 Folder model no longer links to the user model. 2016-05-30 06:00:24 -04:00
Roberto Rosario
e5c9e91104 Rename view and models from "deleted document" to "trashed document". Implement document level organization support via custom 'on_organization' manager. Unfilter default 'objects' manager to operate on all documents in the database. 2016-05-30 03:58:30 -04:00
Roberto Rosario
67f88b79c6 Fix queryset filter. 2016-05-27 23:03:52 -04:00
Roberto Rosario
266cf5c8a3 Import from the permissions app, not the permission module. 2016-05-27 18:03:25 -04:00
Roberto Rosario
e228dfc8c5 Add initial organization view tests for the documents app. 2016-05-27 18:01:31 -04:00
Roberto Rosario
fc86abe951 Make generic organization test class inherit from GenericViewTestCase. 2016-05-27 18:00:57 -04:00
Roberto Rosario
bc7682ab8a Trying to create a default organization in the ready() method of the app interfieres the organization app migration. 2016-05-27 00:38:35 -04:00
Roberto Rosario
ba1c5c1b17 Add organization view tests for the tags app. 2016-05-27 00:16:46 -04:00
Roberto Rosario
48d88d39e7 The folder creation is meant to succeed. 2016-05-26 23:52:24 -04:00
Roberto Rosario
de81fc58dd Generalize organization test. Add more organization tests to the folders app. 2016-05-26 21:58:31 -04:00
Roberto Rosario
b71ebe45f9 Initial sample a organization view test. 2016-05-26 14:52:25 -04:00
Roberto Rosario
05a46445d9 Don't use on_organization as we may be operating on an organization that is not our own. Return the username and password to be used for tests. 2016-05-26 14:47:41 -04:00
Roberto Rosario
907744cf18 Document page has to reference to document model. 2016-05-25 03:11:55 -04:00
Roberto Rosario
f7fd9634df Change group->user related_name to 'users'. Update all references. 2016-05-25 03:07:45 -04:00
Roberto Rosario
796e4cea04 Test are completely broken, disable CI for now. 2016-05-25 02:55:46 -04:00
Roberto Rosario
b2304119fc Improve the organization app tests. 2016-05-25 02:51:58 -04:00
Roberto Rosario
07a124187f Organization related improvements to the permissions app tests. 2016-05-25 02:51:32 -04:00
Roberto Rosario
eab5296c7a Organization related improvements to the user management app tests. 2016-05-25 02:51:06 -04:00
Roberto Rosario
ab83e23f27 Use the new group accessor for the user groups. 2016-05-25 02:50:39 -04:00
Roberto Rosario
5e7a62e022 Use MayanGroup in the user management views. Filter user for the current organization. 2016-05-25 02:49:19 -04:00
Roberto Rosario
e34dffb176 Make a hybrid user manager class to allow calling 'create_user' and 'create_superuser' from the on_organization manager. 2016-05-25 02:48:35 -04:00
Roberto Rosario
3a2d8bac33 Use the organization aware group model in the user serializer. Filter users for the current organization. 2016-05-25 02:47:58 -04:00
Roberto Rosario
58d634a395 Organization related improvements for the tags app. 2016-05-25 02:47:26 -04:00
Roberto Rosario
a0df9d260d Organization support improvements in the common app tests. 2016-05-25 02:46:32 -04:00
Roberto Rosario
626cc1cd07 Move the organizations.managment module to .utils to avoid class with /management/ folder. 2016-05-25 02:45:42 -04:00
Roberto Rosario
c49f8b1def Improve organization support for the folders app. 2016-05-25 02:45:20 -04:00
Roberto Rosario
2ca3a67c9c Don't make the default organization name hardcoded. 2016-05-25 02:44:24 -04:00
Roberto Rosario
7be1d76f62 Move import. Improve comment. 2016-05-25 02:44:05 -04:00
Roberto Rosario
c5f64d4805 Make the acls app organizations aware. 2016-05-25 02:43:12 -04:00
Roberto Rosario
27c1a33762 Call the command to create an organization admin during the initial setup stage. 2016-05-25 01:08:20 -04:00
Roberto Rosario
ce0b0a9a79 Add management command to create an organization admin. 2016-05-25 01:08:03 -04:00
Roberto Rosario
90778c709c Style cleanups 2016-05-25 01:07:42 -04:00
Roberto Rosario
6e6a6073d2 Relate roles to organizations 2016-05-25 01:06:57 -04:00
Roberto Rosario
a3a03ec095 Add custom Group model that relates to organization. 2016-05-25 01:06:20 -04:00
Roberto Rosario
433e295d07 Fix folder document list. GitLab issue #273 2016-05-24 18:18:40 -04:00
Roberto Rosario
c37430ff12 Folders no longer have an user field. GitLab issue #272. 2016-05-24 18:09:01 -04:00
Roberto Rosario
0e5521160b Move basic tests from the Site convertion to tests/test_middleware 2016-05-24 18:08:33 -04:00
Roberto Rosario
83046882b1 Remove repeated migrations. 2016-05-24 17:53:33 -04:00
Baptiste GAILLET
56f1a7d537 Add initial tests for organizations 2016-05-24 17:48:29 -04:00
Baptiste GAILLET
fba20b0a91 Fix postgresql organization creation id error after the first migration 2016-05-24 17:47:25 -04:00
Baptiste GAILLET
ab69031662 Add data migration for organizations apps and change documents migration 35 dependencies to this new migration 2016-05-24 17:46:50 -04:00
Roberto Rosario
14bd599387 Merge branch 'development' into feature/multi-tenant 2016-05-22 17:47:12 -04:00
Roberto Rosario
5ba861f4aa Bump version to 2.1.2 2016-05-20 02:41:46 -04:00
Roberto Rosario
c09a237af1 Add development makefile. Update changelog. Add release notes for version 2.1.2 2016-05-20 02:34:18 -04:00
Roberto Rosario
d1c87fe102 Allow MetadataLookup to receive callables. Update the {{ users }} and {{ groups }} metadata lookup options to be callables that return a current list of users and groups and not a queryset. Add integrations test user_managements -> metadata app. Fixes GitLab #290. Thanks to @camiloforero for finding this one. 2016-05-19 19:33:58 -04:00
Roberto Rosario
4de3bb99e2 Add custom ModelForm class that supports field choice sorting. Use the new form class to sort the user profile language field and the document language fields. Thanks to Baptiste GAILLET @bat79a for the original idea. GitLab issue #292. 2016-05-19 18:18:45 -04:00
Roberto Rosario
d71357cf81 Merge branch 'development' into feature/multi-tenant 2016-05-17 17:02:00 -04:00
Roberto Rosario
004b8c9054 Bump version to 2.1.1 2016-05-17 05:08:45 -04:00
Roberto Rosario
8712c6ee37 PEP8 cleanups. 2016-05-17 05:08:21 -04:00
Roberto Rosario
11da303529 Update changelog. 2016-05-17 05:04:27 -04:00
Roberto Rosario
c97208f609 Ensure that the automatic index is created after the default document type is created. 2016-05-17 05:02:57 -04:00
Roberto Rosario
0bebef5ba9 Add documentation chapter on document languages. 2016-05-17 04:07:03 -04:00
Roberto Rosario
27aae995f0 The Tesseract OCR backend now reports if the requested language file is missing. GitLab issue #289. 2016-05-17 03:49:23 -04:00
Roberto Rosario
4e55b28c43 Update build status badge URL. 2016-05-17 01:37:03 -04:00
Roberto Rosario
3d722325ca Fix navigation object column resolution. Fixes GitLab issue #288. 2016-05-17 01:36:12 -04:00
Roberto Rosario
5959e7362d Merge remote-tracking branch 'origin/master' into merge 2016-05-14 01:55:36 -04:00
Roberto Rosario
352457f576 Don't add the current user to the template context to avoid triggering user managment action links. 2016-05-14 01:49:29 -04:00
Roberto Rosario
7a746653da Bump version to 2.1 2016-05-13 21:16:05 -04:00
Roberto Rosario
715d3c6768 Change log updates. 2016-05-13 21:15:54 -04:00
Roberto Rosario
3f9d21167d Update requirements in setup.py 2016-05-13 21:03:12 -04:00
Roberto Rosario
7fc5f24da9 Update release notes. 2016-05-13 21:02:55 -04:00
Roberto Rosario
5a885868f8 Remove unpaper from installation scripts. 2016-05-13 21:02:40 -04:00
Roberto Rosario
fdf4984468 Add jquery plugin matchHeigh and use it for the tools and setup buttons. GitLab issue #274. 2016-05-12 03:12:14 -04:00
Roberto Rosario
7da6408de0 Add second attempt to match a navigation object as an instance of a source. Use for instances from a queryset using .defer() or .only(). 2016-05-12 01:48:42 -04:00
Roberto Rosario
084f6d4b2f Add an aditional step to verify that the update button is checked on required metadata types. 2016-05-12 01:35:08 -04:00
Roberto Rosario
516920f833 Be more explicit about which requied metadata type is missing. 2016-05-12 01:33:10 -04:00
Roberto Rosario
bc79798723 Improve printable ACL representation. 2016-05-11 03:39:07 -04:00
Roberto Rosario
9c22fc9714 Fix link related object ACL resolution. GitLab issue #274. Thanks to Baptiste GAILLET @bat79a. 2016-05-11 03:37:51 -04:00
Roberto Rosario
39ba601074 Fix API endpoint view name in trashed document API tests. 2016-05-11 00:40:42 -04:00
Roberto Rosario
24df09ba71 Fix switch name, fake initial migrations not all. 2016-05-11 00:40:22 -04:00
Roberto Rosario
80e12b2020 Create a sample document index after the initial setup. GitLab issue #275. 2016-05-10 19:56:20 -04:00
Roberto Rosario
6dcbd62c15 Update all mention of "deleted documents" to "trashed documents" in the document app API. GitLab issue #276. 2016-05-10 19:03:00 -04:00
Roberto Rosario
5a15a34818 Add document metadata API tests. Fix document metadata list API view. 2016-05-10 18:57:50 -04:00
Roberto Rosario
a817aa887f Add document type metadata type API tests. Improve document type metadata type delete API view. 2016-05-10 16:52:29 -04:00
Roberto Rosario
f4a415a3e8 Add metadata type API tests. 2016-05-10 01:11:38 -04:00
Roberto Rosario
8ef65a82f5 Add missing minor migrations 2016-05-09 20:27:09 -04:00
Roberto Rosario
f80fa49166 Defer heavy fields when showing a simple list of all documents. 2016-05-09 19:57:05 -04:00
Roberto Rosario
55d53bf4d5 Equate queryset model instances with deffered fields to their parent model class when resolving UI model columns.
This will allow models using .defer or .only optimizations to render properly on list views.
2016-05-09 19:55:03 -04:00
Roberto Rosario
8d549df088 Index the is_stub and is_deleted document boolean fields. 2016-05-09 19:54:32 -04:00
Roberto Rosario
8075bfd0bc Update Spanish translation. 2016-05-08 21:57:23 -04:00
Roberto Rosario
ddc7dc39b0 Update to use Django 1.8.13 2016-05-08 01:31:00 -04:00
Roberto Rosario
2a5264bc2c Fix view context document resolution for the document smart link list view. Fixes GitLab issue #266. Thanks to Baptiste GAILLET @bat79a for the find. 2016-05-08 01:13:54 -04:00
Roberto Rosario
d934b2ee1e Now that autoadmin has an initial migration don't error out on existing tables. 2016-05-07 20:28:34 -04:00
Roberto Rosario
4aea55339f Merge branch 'development' into feature/multi-tenant 2016-05-07 20:13:52 -04:00
Roberto Rosario
94b968963e Bump version to 2.1rc2 2016-05-05 23:44:18 -04:00
Roberto Rosario
bd648d0cb1 Postgresql needs typecasting for turning char fields into native UUID fields.
Conditionally run the necesary SQL for this to happen. GitLab issue #266 Thanks to Baptiste GAULLET @bat79a for finding the solution.
2016-05-05 23:17:32 -04:00
Roberto Rosario
e3d49e1352 Use now django-autoadmin 1.1.1 2016-05-05 23:17:08 -04:00
Roberto Rosario
06ecbfeba2 Flake8 cleanups. 2016-05-04 15:58:17 -04:00
Roberto Rosario
b15d419172 Fix statistics detail view error. GitLab issue #270. @bat79a 2016-05-04 15:57:09 -04:00
Roberto Rosario
9013793b5c Fix migrations conflicts with development branch. 2016-05-04 02:40:28 -04:00
Roberto Rosario
bd3bdb9b13 Merge branch 'development' into feature/multi-tenant 2016-05-04 02:22:38 -04:00
Roberto Rosario
09640d3e43 Change the permission_document_restore permission label from 'deleted' to 'trashed'. 2016-05-04 01:40:51 -04:00
Roberto Rosario
924cb21a83 Add the permission_document_restore permission to the available permission for document's ACLs. GitLab issue #267 @bat79a 2016-05-04 01:39:32 -04:00
Roberto Rosario
5da301a861 Change the variable name to better represent the class of the instance. 2016-05-04 00:11:18 -04:00
Roberto Rosario
afb44798e0 Parent object of the index node being passed to the ACL module for permission test was a function by mistake and not the result of the function which is the index isntance. Fixes Gitlab issue #268 @bat79a 2016-05-04 00:08:44 -04:00
Roberto Rosario
a179a19749 Improve document indexing tests and add test for GitLab issue #268 @bat79a 2016-05-04 00:07:19 -04:00
Roberto Rosario
269d8fb5b3 Remove 'is_staff' and 'is_superadmin' from views and serializers. Add user API tests. 2016-05-01 17:06:37 -04:00
Roberto Rosario
0a8f429d04 Bump version to 2.1.0rc1 2016-04-28 02:44:42 -04:00
Roberto Rosario
b41c2ce02d Add missing dependency to setup.py 2016-04-28 02:44:17 -04:00
Roberto Rosario
15ed0a10e2 User self.stderr instead of print. Colorize the error message. 2016-04-28 01:54:17 -04:00
Roberto Rosario
ea734db79e Update mirror argument parsing to work with Django 1.8. 2016-04-28 01:34:18 -04:00
Roberto Rosario
23f40ac4aa PEP8 cleanups. 2016-04-27 20:31:02 -04:00
Roberto Rosario
3384c06c03 Mock the gpg tests that require internet access. 2016-04-27 20:19:26 -04:00
Roberto Rosario
f944f9ebbc Add smart link dynamic label test. 2016-04-27 18:46:58 -04:00
Roberto Rosario
c6eea8ba64 Don't perform OCR in folder model tests. 2016-04-27 18:19:30 -04:00
Roberto Rosario
af273fbfc3 Remove the creation of a test user. 2016-04-27 18:10:21 -04:00
Roberto Rosario
8a58ee2124 Expand the documentation chapter on file storage. 2016-04-27 15:16:11 -04:00
Roberto Rosario
e824fbffcf Add a documentation chapter regarding settings. 2016-04-27 15:15:57 -04:00
Roberto Rosario
9ab03d2c16 Expand the documentation chapter on transformations. 2016-04-27 14:54:50 -04:00
Roberto Rosario
232cb5e38d Synchronize and compile translations. 2016-04-27 14:54:33 -04:00
Roberto Rosario
5775f5aeaa Run makemessage for apps. 2016-04-27 14:20:45 -04:00
Roberto Rosario
1bda472287 Update roadmap 2016-04-26 18:31:48 -04:00
Roberto Rosario
6931d2ad81 Add direct to watched folder scanning issue to roadmap. 2016-04-26 18:02:59 -04:00
Roberto Rosario
f5609d402a Add backup and ocr backend documentation chapters. 2016-04-26 18:02:45 -04:00
Roberto Rosario
9d7e8d6123 Add roadmap documentation chapter. 2016-04-26 17:10:38 -04:00
Roberto Rosario
0299353fb7 Remove bold markup from all mentions of "Mayan EDMS" 2016-04-26 16:52:17 -04:00
Roberto Rosario
0fa26cda8b Add mailing documentation. 2016-04-26 16:42:25 -04:00
Roberto Rosario
19b43e9504 Remove donation options, add support info. 2016-04-25 14:42:02 -04:00
Roberto Rosario
232b7f644b Update sphinx autorebuild version used. 2016-04-25 14:37:29 -04:00
Roberto Rosario
f020a7a1c6 Expand v2.1 release notes. 2016-04-21 17:01:45 -04:00
Roberto Rosario
756108af8d Disable GitLab CI MySQL testing until GitLab mysql container isssue are fixed. 2016-04-04 23:05:06 -04:00
Roberto Rosario
e3200511ac Small query optimization. 2016-04-04 23:04:35 -04:00
Roberto Rosario
b04421438e Update changelog. 2016-04-04 23:04:20 -04:00
Roberto Rosario
e5743d8964 Remove Django 1.7 and add Django 1.9 to the tox test matrix. 2016-04-04 16:25:52 -04:00
Roberto Rosario
be392823bb Remove all GPG interface module. 2016-04-04 14:55:37 -04:00
Roberto Rosario
f042533576 Put event action description in past tense. 2016-04-04 13:51:23 -04:00
Roberto Rosario
33aefdaef7 Add document download and document preview event logging. Add corresponding tests. Closes GitLab issue #261. 2016-04-04 13:49:14 -04:00
Roberto Rosario
c6fb008562 Workaround problem with gpg embedded signatures corrupting the source file by using clearsign=False by default. 2016-04-01 23:28:34 -04:00
Roberto Rosario
9a0dd8c192 Add embedded signing test. 2016-04-01 12:43:06 -04:00
Roberto Rosario
07cd6d078f No need to typecast the result 2016-04-01 12:33:11 -04:00
Roberto Rosario
3d74bdb590 Add document embedded signature signing support. 2016-03-31 19:06:31 -04:00
Roberto Rosario
14988bab34 Add key upload view, permission, link and test. 2016-03-30 19:05:53 -04:00
Roberto Rosario
e8c0951b0d Add key download view, permission, link and test. 2016-03-30 18:29:39 -04:00
Roberto Rosario
94b00c7ce5 Replace document type selection widget with an opened select list HTML control. 2016-03-30 17:19:27 -04:00
Roberto Rosario
09b71144b6 Add support for signing documents from the UI. Mayan EDMS is now in the major leagues :) 2016-03-30 03:47:58 -04:00
Roberto Rosario
bc59613945 Add key content sign tests. 2016-03-30 02:32:08 -04:00
Roberto Rosario
24d8287072 Add Key usage for signing permission. 2016-03-30 02:30:50 -04:00
Roberto Rosario
8baca70ef5 Add link to document facet menu to display its latest version signatures. 2016-03-30 02:00:17 -04:00
Roberto Rosario
1e7e17bdce Insert the resolved_object context variable in the test views. 2016-03-30 01:42:17 -04:00
Roberto Rosario
c6890c487a Extract a file like object's file name as per docs (using the .name property) and not an unicode representation of the file object instance. Reference: https://docs.python.org/2.7/library/stdtypes.html#file-objects 2016-03-30 01:32:53 -04:00
Roberto Rosario
8b28bdd443 Add missing icon to the all document signature verification tool link. 2016-03-29 21:03:16 -04:00
Roberto Rosario
7da6cf1863 Add view, task and post upgrade signal handler to verify all documents for embedded signatures. 2016-03-29 20:13:58 -04:00
Roberto Rosario
d83a80c65b Add document signature app link tests. 2016-03-29 16:28:24 -04:00
Roberto Rosario
739b96ed37 Add related object link permission support. 2016-03-29 16:27:53 -04:00
Roberto Rosario
0783806fd1 Add signature deletion view tests. 2016-03-29 13:52:35 -04:00
Roberto Rosario
b9d75e525f Convert the signature download view to CBV and add corresponding test. 2016-03-29 05:12:04 -04:00
Roberto Rosario
3b593e10fd Add django-downloadview to the used packages. Add a Mayan generic sub class download view based on django-downloadviews' virtual download view class. 2016-03-29 05:11:08 -04:00
Roberto Rosario
c1cb983869 Just display the signature type to conserve UI space. 2016-03-28 14:57:19 -04:00
Roberto Rosario
e5c47f16d4 Update document version signature upload view to CBV and add test. 2016-03-28 14:56:49 -04:00
Roberto Rosario
35df61bca1 Add view test for the document signatures app. 2016-03-27 03:29:19 -04:00
Roberto Rosario
e708e0250e Support related object permission ACLs for more than just 1 level of relationship. 2016-03-27 03:28:14 -04:00
Roberto Rosario
fa1450fe5a PEP8 cleanups. 2016-03-27 03:27:56 -04:00
Roberto Rosario
0ffe20befd Fix link resolution in the document signature list view. This view exposes 3 navigable objects, use 'resolved_object' for correct link resolution. 2016-03-26 16:28:08 -04:00
Roberto Rosario
5de63c4477 Add support for verifying and unverifying signatures after a key is added or deleted. 2016-03-26 04:23:16 -04:00
Roberto Rosario
1f0dedc9aa Add more fields to signature detail form. 2016-03-26 04:06:43 -04:00
Roberto Rosario
779a14977d Add admin interface for embedded and detached signatures. 2016-03-26 04:06:08 -04:00
Roberto Rosario
9744cdd358 Redirect to public or private key list after deletion of a key. 2016-03-26 04:05:40 -04:00
Roberto Rosario
4a4573fb1b Add missing gpg directory chmod. 2016-03-26 04:05:15 -04:00
Roberto Rosario
467ad0dadb Add more logging. Add preloading of keys to decrypt_file method. Cleanups. 2016-03-26 04:04:34 -04:00
Roberto Rosario
ffb29e0f54 Remove obsolete Document property. Use resolved_object in documents links to avoid context variable clashes with signatures. 2016-03-25 04:12:44 -04:00
Roberto Rosario
7e801ef02e Fix verifyresult timestamp field. Remove Key ID property and verify return a separate small key id without a fingerprint when the signing key is not available. 2016-03-25 04:09:30 -04:00
Roberto Rosario
09b92858d9 Raise MayanAppConfig initialization exception if they are not bening about missing URLs. 2016-03-25 04:08:25 -04:00
Roberto Rosario
355190e919 Start of document_signatures app refactor. 2016-03-25 04:07:57 -04:00
Roberto Rosario
ab6e2d8c23 Fix verification using detached signature. 2016-03-24 02:47:53 -04:00
Roberto Rosario
d41dac5587 Add support for verification of detached signatures. 2016-03-24 00:27:49 -04:00
Roberto Rosario
a5f3d46373 Add a cleartext test file with a detached signature. 2016-03-24 00:26:53 -04:00
Roberto Rosario
c8f7c4ef86 Update document signature app to work with new django_gpg changes. 2016-03-23 19:57:45 -04:00
Roberto Rosario
e96f748439 Add key_id property to SignatureVerification class 2016-03-23 19:57:16 -04:00
Roberto Rosario
048ba4b5cd Add file decryption support. 2016-03-23 19:47:41 -04:00
Roberto Rosario
45774ccdcf Add SignatureVerification class to return verification results. Add support for specifing against which key to verify a signature. Add support to preload all keys before verifing a signature. All test for specific key verificatio and all key preloading. 2016-03-23 18:56:29 -04:00
Roberto Rosario
2f7c6ed0d9 Add embedded file signature verification. 2016-03-23 13:03:48 -04:00
Roberto Rosario
cd077cb076 Add more tests for the Key model. Remove the key_id field and made it a property derived from the fingerprint. 2016-03-23 11:58:08 -04:00
Roberto Rosario
f82b2000c3 Properly render date widgets on form instances. 2016-03-23 00:37:26 -04:00
Roberto Rosario
2748d5959f Place KeyManage on a seprate module. Convert views to use the new Key model. Add KeyStub class and use it to return query results. Add Key detail link and view. Remove the setting for multiple keyservers. 2016-03-23 00:35:32 -04:00
Roberto Rosario
189cda437f Add model test. Finish file signing method. Add key signing exceptions. 2016-03-22 18:02:40 -04:00
Roberto Rosario
dc5d25fd00 Initial code for database stored GPG keys. 2016-03-22 05:10:54 -04:00
Roberto Rosario
ccd6e8c88c Add document mailing view tests. 2016-03-21 18:59:22 -04:00
Roberto Rosario
c9010f6b5e Add test for the document link mailing view. 2016-03-21 17:42:24 -04:00
Roberto Rosario
3d970036b2 Sync translations with Transifex 2016-03-21 17:38:15 -04:00
Roberto Rosario
6fe778051e Update translation source files for all apps. Add Message of the Day source message file. 2016-03-21 16:53:09 -04:00
Roberto Rosario
7dc260046b Update the document type quick label model verbose name from 'Quick rename template' to 'Quick label'. 2016-03-21 16:25:16 -04:00
Roberto Rosario
dda0bbdba9 Add test for the document type quick label creation view. 2016-03-21 16:24:41 -04:00
Roberto Rosario
66d2baafb8 Convert document type quick label creation view to CBV. 2016-03-21 16:24:23 -04:00
Roberto Rosario
18a3773b65 Update changelog 2016-03-21 15:53:27 -04:00
Roberto Rosario
c43fe38ac9 Use Python's string.partition instead of find. 2016-03-21 04:11:50 -04:00
Roberto Rosario
26fce66451 Change pngtoppm to convert PDFs to JPEG instead of PNGs. 2016-03-21 03:49:11 -04:00
Roberto Rosario
28f3b7551d Consolidate document page image generation as binary or base64 to a single place at the converter class level. 2016-03-21 03:44:45 -04:00
Roberto Rosario
37d6070cab Convert the document version revert view to CBV. Add document version revert view tests. 2016-03-21 02:37:39 -04:00
Roberto Rosario
c07f5a7820 Add object permission checking to the generic ConfirmView. 2016-03-21 02:37:14 -04:00
Roberto Rosario
ad0643b62a Convert document cache clear view to CBV. Update message and link label to include the word 'image'. 2016-03-21 02:11:56 -04:00
Roberto Rosario
bd3e31efa4 Update document_reset_view to CBV. 2016-03-21 02:05:05 -04:00
Roberto Rosario
308472b92b Delete temporary directory after testing. 2016-03-20 16:35:08 -04:00
Roberto Rosario
a0b31d4bfe Convert the staging file deletion view to CBV. Add staging file deletion permission. 2016-03-20 16:34:39 -04:00
Roberto Rosario
7be6e8c6ed Add unicode filename test for the StagingFile class. 2016-03-20 15:59:49 -04:00
Roberto Rosario
6ec7a2ca4d Support unicode filenames in staging folders. 2016-03-20 15:40:42 -04:00
Roberto Rosario
b32563ac8e Add python 3.5 and remove python 3.2 from tox.ini. 2016-03-20 01:21:48 -04:00
Roberto Rosario
9191c04eb9 Update changelog. 2016-03-19 03:00:18 -04:00
Roberto Rosario
145161cef4 PEP8 cleanups. 2016-03-19 03:00:03 -04:00
Roberto Rosario
7cde1fe78f Add ACLs to document indexes. Convert all document indexing views to CBV. Remove the document index setup permission. Add view tests to the document indexing app. Use MPTT methods and stop relying on undocumented API. 2016-03-19 02:51:45 -04:00
Roberto Rosario
286a6ba9b8 Enable object access check via related attribute in generic CBV. 2016-03-19 02:51:03 -04:00
Roberto Rosario
2328355754 Don't error out when inspecting ACL permissions for an object with no registered permissions. 2016-03-19 02:20:36 -04:00
Roberto Rosario
45f90cce50 Return the instance when a document is added as recent for an user. 2016-03-19 02:20:01 -04:00
Roberto Rosario
50f473b698 Improve translation template. 2016-03-19 02:00:30 -04:00
Roberto Rosario
ed8ac47240 Extract context object name from the models meta options. 2016-03-19 01:57:30 -04:00
Roberto Rosario
34184e0726 Fix typo in management command name. 2016-03-18 20:58:06 -04:00
Roberto Rosario
66a49c8335 Don't assume all object have a proxy access accessor. 2016-03-18 20:57:39 -04:00
Roberto Rosario
042cef3d0e Add ACL view tests. 2016-03-18 20:57:22 -04:00
Roberto Rosario
adcf946fbb Sort ACL app views. Don't error out on duplicate ACL entry creation (same document + role), but instead redirect to existing ACL entry. 2016-03-18 20:56:41 -04:00
Roberto Rosario
5ac21faced Sort folder app views. 2016-03-18 19:51:29 -04:00
Roberto Rosario
de4948b84f Rename acl creation view from acl_new to acl_create for uniformity. 2016-03-18 19:44:25 -04:00
Roberto Rosario
8302e13d80 Add deleted document list filtering tests. 2016-03-18 18:47:32 -04:00
Roberto Rosario
30738a922c Properly filter deleted document queryset. 2016-03-18 18:46:26 -04:00
Roberto Rosario
473fc09e1a .index is a function not an attribute, add missing parentheses. 2016-03-18 00:23:43 -04:00
Roberto Rosario
4c4409aa1e PEP8 cleanups. 2016-03-17 00:44:54 -04:00
Roberto Rosario
5079b2790e Add Smart link view tests. 2016-03-17 00:39:04 -04:00
Roberto Rosario
67bb84c778 Convert smart link condition create, edit and delete views to CBV. 2016-03-16 18:26:40 -04:00
Roberto Rosario
c3149a58d6 Sort variables. 2016-03-16 18:26:12 -04:00
Roberto Rosario
5bb04cc8f4 Add newly uploaded document to the recent document list of the user. 2016-03-16 16:42:01 -04:00
Roberto Rosario
a6c9393aa0 Permission app's views are all CBV, don't specify view module to preload. 2016-03-16 16:40:39 -04:00
Roberto Rosario
e2bfece9ff Update document OCR content view to a CBV. 2016-03-16 16:40:17 -04:00
Roberto Rosario
0ecfb83d14 Fix metadata edit view test. 2016-03-15 19:03:42 -04:00
Roberto Rosario
6bf352ecbb Fix queryset assigment, should always be of MetadataType not DocumentTypeMetadataType, errors out on Postgres. 2016-03-15 18:39:48 -04:00
Roberto Rosario
8ae61b87b5 Update requirements in setup.py. 2016-03-15 04:22:04 -04:00
Roberto Rosario
aeff40331d Update changelog and release notes. 2016-03-15 04:14:51 -04:00
Roberto Rosario
86af663e91 Use MPTT's native get_level method. 2016-03-15 04:14:34 -04:00
Roberto Rosario
1a20d93e4c Add new split move index navigation. 2016-03-15 04:11:44 -04:00
Roberto Rosario
3d36f1b828 Update Document model's uuid field to use Django's native UUIDField class. 2016-03-15 01:44:34 -04:00
Roberto Rosario
928d86088a Update release notes for 2.1 2016-03-14 22:35:54 -04:00
Roberto Rosario
adcc37d8a4 Remove ununsed metadata function. 2016-03-14 22:35:27 -04:00
Roberto Rosario
c2c95787cb Improve folder and tag creation api test. 2016-03-14 20:38:00 -04:00
Roberto Rosario
9823202405 Remove typecasting of file objects into Django's File class, not needed in Django >1.8.x. 2016-03-14 20:20:54 -04:00
Roberto Rosario
f5d2ea7d9e Update Django version to 1.8.11. 2016-03-14 20:08:51 -04:00
Roberto Rosario
858648782b Update Folder creation and Tag creation API calls to return the id of the created instances. 2016-03-14 04:48:22 -04:00
Roberto Rosario
35cc0ea1d6 Exclude root API and API doc URLs. 2016-03-14 04:15:13 -04:00
Roberto Rosario
3fa9092d57 Complete changes needed to add the Message of the Day app. Closes GitLab issue #222. 2016-03-14 01:53:15 -04:00
Roberto Rosario
71946491b3 Show exception message when an app's URL can't be loaded. 2016-03-14 01:52:40 -04:00
Roberto Rosario
9ba03ff0cb Fix datetime widget rendering. 2016-03-14 01:52:16 -04:00
Roberto Rosario
ba2be644f6 Add note about accessing runserver from other machines. 2016-03-14 01:51:39 -04:00
Roberto Rosario
fba236b0fc Remove Patreon donation link. 2016-03-14 01:51:22 -04:00
Roberto Rosario
083d6e6fc5 Add links, views and urls. Rename main model to just 'Message'. 2016-03-13 21:05:49 -04:00
Roberto Rosario
daa3ca2430 Initial commit to support messages of the day. GitLab issue #222. 2016-03-13 00:56:31 -04:00
Roberto Rosario
6eb868bdfb Add missing migration. 2016-03-12 23:16:18 -04:00
Roberto Rosario
d444835f99 Update changelog. 2016-03-12 04:27:49 -04:00
Roberto Rosario
6b79824daf Update uploader style to better match theme and template used. Use the new uploader for new documents only not for document versions. 2016-03-12 04:25:42 -04:00
Roberto Rosario
642c46ec6f Move dropzone code and style loading to the sources app. Improve dropzone widget appearance. Add Javascript translation catalog support. 2016-03-12 00:49:18 -04:00
Roberto Rosario
452bd45407 Initial support for HTML5 uploads. GitLab issue #162. 2016-03-10 05:20:49 -04:00
Roberto Rosario
ed2f2480e6 Fix Dutch locale typo, close GitLab issue #256. Add placeholder for 2.1 release notes. 2016-03-10 03:39:50 -04:00
Roberto Rosario
60b7ed6a6d PEP8 cleanups 2016-03-10 03:35:15 -04:00
Roberto Rosario
e10ff8e8bd Fix tests. 2016-03-10 03:34:50 -04:00
Roberto Rosario
dd2cef50c8 Fix document preview view. 2016-03-10 03:21:20 -04:00
Roberto Rosario
3532ed7c1e Update changelog. 2016-03-09 23:35:34 -04:00
Roberto Rosario
180c38b746 PEP8 cleanups. 2016-03-09 23:31:03 -04:00
Roberto Rosario
45e90da219 Convert the checkout detail view to use the DetailView CBV. Update usage the DetailView CBV in the DocumentProperties view. Add checkout details view permission. 2016-03-09 23:27:02 -04:00
Roberto Rosario
6f02d96212 Update current user detail view to use DetailView CBV. 2016-03-09 23:26:00 -04:00
Roberto Rosario
2c9a01bdfc Improve the date localte handling of the DetailView and DetailForm. 2016-03-09 23:22:31 -04:00
Roberto Rosario
216673c691 Sort variables 2016-03-09 15:58:53 -04:00
Roberto Rosario
17f129e9e6 Add admin interface to the checkouts app. 2016-03-09 15:40:39 -04:00
Roberto Rosario
ba4768bcbb Revert icons to their original sizes. 2016-03-09 15:40:22 -04:00
Roberto Rosario
5b6b35f1c3 Make document type deletion period optional. 2016-03-09 14:39:16 -04:00
Roberto Rosario
9b315a7cf4 Simple list to tupple and queryset count optimizations. 2016-03-09 14:25:43 -04:00
Roberto Rosario
bccf511178 Add per document type document creation access control test. 2016-03-09 14:24:57 -04:00
Roberto Rosario
330e01972c Hide document facet menu links on small displays. 2016-03-08 04:21:29 -04:00
Roberto Rosario
4d362c3957 Add icons to the document face menu links. Increase icon size by 10%. Increase icon to text spacing to 3px. 2016-03-08 04:17:57 -04:00
Roberto Rosario
5a70bd0995 Remove document clone function. 2016-03-08 03:44:22 -04:00
Roberto Rosario
a7faf7f427 Implement per document type document creation permission. Closes GitLab issue #232. 2016-03-08 03:39:23 -04:00
Roberto Rosario
9da4710c0f Deselect the update checkbox for optional metadata by default. 2016-03-08 02:38:15 -04:00
Roberto Rosario
d05345ed3c Update tests to match generic CBV success message. 2016-03-08 02:37:22 -04:00
Roberto Rosario
ad328b2c3b Silence lock manager model import warning. 2016-03-08 02:32:03 -04:00
Roberto Rosario
927c0bf657 Remove remaining usage of django.contrib.auth.model.User. GitLab issue #225. 2016-03-08 02:21:03 -04:00
Roberto Rosario
5d8dd19895 Merge remote-tracking branch 'origin/development' into development 2016-03-08 01:23:36 -04:00
Roberto Rosario
730cbe922d Update changelog. 2016-03-08 01:23:16 -04:00
Roberto Rosario
1c65b389ee Remove concept of ownership from folders by removing the user field.
"Ownership" now is now determined by ACL of a folder, like the rest of the objects in the system.
2016-03-08 01:20:10 -04:00
Roberto Rosario
74fd47d86e Unify handling for generic CBV views errors and 'object_name'. 2016-03-08 01:13:06 -04:00
Roberto Rosario
014ba4f4fe Remove strip spaces middleware and use spaceless template tag instead. Closes GitLab issue #255. 2016-03-07 20:02:26 -04:00
Roberto Rosario
e85002d4ac Add view test to check for duplicated folder creation. 2016-03-07 17:02:19 -04:00
Roberto Rosario
9efa7c9543 Fix typo in document image generation query. Support multiple logins using different sessions iDS. 2016-03-07 04:13:14 -04:00
Roberto Rosario
8a5a26c0b4 Update authenthication code to support multitenants. Replace all remaining instances of hardcoded User model. 2016-03-07 03:08:11 -04:00
Roberto Rosario
6492908c59 Make folders and tags apps multitenant. 2016-03-07 01:53:13 -04:00
Roberto Rosario
ce6a1f4020 Merge branch 'master' into feature/merge_master 2016-03-03 16:46:11 -04:00
Roberto Rosario
652613452b Add new document upload wizard step to attach tags. GitLab issue #208. 2016-02-05 03:25:27 -04:00
Roberto Rosario
74d8f1d994 Add debug logging during general exception catch. 2016-02-04 22:22:05 -04:00
Roberto Rosario
10eb7d49b2 Update API tests to use login instead of force_authenticate. 2016-02-04 17:39:27 -04:00
Roberto Rosario
8614bc4bfc Remove included login required middleware using django-stronghold instead (http://mikegrouchy.com/django-stronghold/). GitLab Issue #206 2016-02-04 15:33:20 -04:00
Roberto Rosario
2bb96ca98d Add HISTORY entry for upcomming version 2.1. 2016-01-28 06:09:27 -04:00
Roberto Rosario
eae11a1b0c Fix remaining tests for Django 1.8. Closes GitLab issue #246. 2016-01-28 06:04:28 -04:00
Roberto Rosario
2ebb84f18f Remove remaining direct references to the User model. Closes GitLab issue #225. 2016-01-28 05:55:15 -04:00
Roberto Rosario
27d8644438 Silence 90% of remaining Django 1.8 model warnings. 2016-01-28 05:43:08 -04:00
Roberto Rosario
d5c73eaad6 Rename the 'Content' search label to 'OCR' for proper meaning. 2016-01-28 04:42:26 -04:00
Roberto Rosario
09f4d674a4 Pass the request instance to properly resolve the setup and tools links. 2016-01-28 04:40:31 -04:00
Roberto Rosario
830e83d107 Remove unused template. 2016-01-28 04:21:18 -04:00
Roberto Rosario
24644e3538 Remove select_related using reverse related name field. 2016-01-27 18:34:32 -04:00
Roberto Rosario
2dd4ca1f13 Workaround undocumented backward incompatible change in python-gnupy 0.3.8. 2016-01-26 05:14:07 -04:00
Roberto Rosario
59661f643b Update API pagination for DRF 3.3.2. 2016-01-26 03:55:44 -04:00
Roberto Rosario
0b830c380d Silence furder Django 1.8 warnings about ContentType imports. Fix get_model in handlers. 2016-01-26 03:55:10 -04:00
Roberto Rosario
6b3fe7a876 Fix futher Django Warnings. 2016-01-22 04:52:47 -04:00
Roberto Rosario
20535529dc Fix address in about template. 2016-01-22 04:51:48 -04:00
Roberto Rosario
ac9bc9454d Update source app code for new extracted formtools package. 2016-01-22 04:02:12 -04:00
Roberto Rosario
ca15cadc5e Add missing migration for pycountry update. 2016-01-22 04:01:49 -04:00
Roberto Rosario
5ec3025120 Use OneToOneField instead of a ForeignKey with unique=True. 2016-01-22 04:01:15 -04:00
Roberto Rosario
fbb22affaa Update pycountry code to new 1.19 backwards incompatible changes. 2016-01-22 04:00:30 -04:00
Roberto Rosario
b19225e95d Load models by calling AppConfig.get_model method instead. 2016-01-22 03:59:42 -04:00
Roberto Rosario
2f344f299f Update all requirements to most recent version. Update Django to 1.8.8 LTS. 2016-01-22 03:58:00 -04:00
1762 changed files with 58942 additions and 39774 deletions

View File

@@ -10,26 +10,26 @@ variables:
POSTGRES_PASSWORD: "postgres"
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
MYSQL_DATABASE: "mayan_edms"
test:mysql:
script:
- pip install -r requirements/testing.txt
- pip install -q mysql-python
- apt-get install -qq mysql-client
- mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD" -e "ALTER DATABASE $MYSQL_DATABASE CHARACTER SET utf8 COLLATE utf8_unicode_ci;"
- coverage run manage.py runtests --settings=mayan.settings.testing.gitlab-ci.db_mysql --nomigrations
- bash <(curl https://raw.githubusercontent.com/codecov/codecov-bash/master/codecov) -t $CODECOV_TOKEN
tags:
- mysql
test:postgres:
script:
- pip install -r requirements/testing.txt
- pip install -q psycopg2
- coverage run manage.py runtests --settings=mayan.settings.testing.gitlab-ci.db_postgres --nomigrations
- bash <(curl https://raw.githubusercontent.com/codecov/codecov-bash/master/codecov) -t $CODECOV_TOKEN
tags:
- postgres
test:sqlite:
script:
- pip install -r requirements/testing.txt
- coverage run manage.py runtests --settings=mayan.settings.testing.gitlab-ci --nomigrations
- bash <(curl https://raw.githubusercontent.com/codecov/codecov-bash/master/codecov) -t $CODECOV_TOKEN
#test:mysql:
# script:
# - pip install -r requirements/testing.txt
# - pip install -q mysql-python
# - apt-get install -qq mysql-client
# - mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD" -e "ALTER DATABASE $MYSQL_DATABASE CHARACTER SET utf8 COLLATE utf8_unicode_ci;"
# - coverage run manage.py runtests --settings=mayan.settings.testing.gitlab-ci.db_mysql --nomigrations
# - bash <(curl https://raw.githubusercontent.com/codecov/codecov-bash/master/codecov) -t $CODECOV_TOKEN
# tags:
# - mysql
#test:postgres:
# script:
# - pip install -r requirements/testing.txt
# - pip install -q psycopg2
# - coverage run manage.py runtests --settings=mayan.settings.testing.gitlab-ci.db_postgres --nomigrations
# - bash <(curl https://raw.githubusercontent.com/codecov/codecov-bash/master/codecov) -t $CODECOV_TOKEN
# tags:
# - postgres
#test:sqlite:
# script:
# - pip install -r requirements/testing.txt
# - coverage run manage.py runtests --settings=mayan.settings.testing.gitlab-ci --nomigrations
# - bash <(curl https://raw.githubusercontent.com/codecov/codecov-bash/master/codecov) -t $CODECOV_TOKEN

View File

@@ -127,10 +127,16 @@ source_lang = en
source_file = mayan/apps/mirroring/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.navigation-2-0]
file_filter = mayan/apps/navigation/locale/<lang>/LC_MESSAGES/django.po
[mayan-edms.mirroring-2-0]
file_filter = mayan/apps/mirroring/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/navigation/locale/en/LC_MESSAGES/django.po
source_file = mayan/apps/mirroring/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.motd-2-0]
file_filter = mayan/apps/motd/locale/<lang>/LC_MESSAGES/django.po
source_lang = en
source_file = mayan/apps/motd/locale/en/LC_MESSAGES/django.po
type = PO
[mayan-edms.ocr-2-0]

View File

@@ -1,3 +1,53 @@
2.1.2 (2016-05-20)
==================
- Sort document languages and user profile locale language lists. GitLab issue #292.
- Fix metadata lookup for {{ users }} and {{ group }}. Fixes GitLab #290.
- Add Makefile for common development tasks
2.1.1 (2016-05-17)
==================
- Fix navigation issue that make it impossible to add new sources. GitLab issue #288.
- The Tesseract OCR backend now reports if the requested language file is missing. GitLab issue #289.
- Ensure the automatic default index is created after the default document type.
2.1 (2016-05-14)
================
- Upgrade to use Django 1.8.13. Issue #246.
- Upgrade requirements.
- Remove remaining references to Django's User model. GitLab issue #225
- Rename 'Content' search box to 'OCR'.
- Remove included login required middleware using django-stronghold instead (http://mikegrouchy.com/django-stronghold/).
- Improve generation of success and error messages for class based views.
- Remove ownership concept from folders.
- Replace strip_spaces middleware with the spaceless template tag. GitLab issue #255
- Deselect the update checkbox for optional metadata by default.
- Silence all Django 1.8 model import warnings.
- Implement per document type document creation permission. Closes GitLab issue #232.
- Add icons to the document face menu links.
- Increase icon to text spacing to 3px.
- Make document type delete time period optional.
- Fixed date locale handling in document properties, checkout and user detail views.
- Add new permission: checkout details view.
- Add HTML5 upload widget. Issue #162.
- Add Message of the Day app. Issue #222
- Update Document model's uuid field to use Django's native UUIDField class.
- Add new split view index navigation
- Newly uploaded documents appear in the Recent document list of the user.
- Document indexes now have ACL support.
- Remove the document index setup permission.
- Status messages now display the object class on which they operate not just the word "Object".
- More tests added.
- Handle unicode filenames in staging folders.
- Add staging file deletion permission.
- New document_signature_view permission.
- Add support for signing documents.
- Instead of multiple keyservers only one keyserver is now supported.
- Replace document type selection widget with an opened selection list.
- Add mailing documentation chapter.
- Add roadmap documentation chapter.
- API updates.
2.0.2 (2016-02-09)
==================
- Install testing dependencies when installing development dependencies.
@@ -10,15 +60,16 @@
- Strip HTML tags from the browser title.
- Remove Docker and Docker Compose files.
2.0.1 (2016-01-22)
==================
- Fix GitLab issue #243, "System allows a user to skip entering values for a required metadata field while uploading a new document"
- Fix GitLab issue #245, "Add multiple metadata not possible"
- Updated Vagrantfile to provision a production box too.
2.0 (2015-12-04)
================
- New source homepage: https://gitlab.com/mayan-edms/mayan-edms
- Update to Django 1.7
- New Bootstrap Frontend UI
@@ -90,7 +141,6 @@
1.1 (2015-02-10)
================
- Uses Celery for background tasks
- Removal of the splash screen
- Adds a home view with common function buttons
@@ -116,7 +166,6 @@
1.0 (2014-08-27)
================
- New home @ https://github.com/mayan-edms/mayan-edms
- Updated to use Django 1.6
- Translation updates

113
Makefile Normal file
View File

@@ -0,0 +1,113 @@
.PHONY: clean-pyc clean-build
define BROWSER_PYSCRIPT
import sys, webbrowser
webbrowser.open(sys.argv[1])
endef
export BROWSER_PYSCRIPT
BROWSER := python -c "$$BROWSER_PYSCRIPT"
help:
@echo
@echo "clean-build - Remove build artifacts."
@echo "clean-pyc - Remove Python artifacts."
@echo "clean - Remove Python and build artifacts."
@echo "test MODULE=<python module name> - Run tests for a single App, module or test class."
@echo "test-all - Run all tests."
@echo "docs_serve - Run the livehtml documentation generator."
@echo "translations_make - Refresh all translation files."
@echo "translations_compile - Compile all translation files."
@echo "translations_push - Upload all translation files to Transifex."
@echo "translations_pull - Download all translation files from Transifex."
@echo "requirements_dev - Install development requirements."
@echo "requirements_docs - Install documentation requirements."
@echo "requirements_testing - Install testing requirements."
@echo "sdist - Build the source distribution package."
@echo "wheel - Build the wheel distribution package."
@echo "release - Package (sdist and wheel) and upload a release."
@echo "runserver - Run the development server."
# Cleaning
clean: clean-build clean-pyc
clean-build:
rm -fr build/
rm -fr dist/
rm -fr *.egg-info
clean-pyc:
find . -name '*.pyc' -exec rm -f {} +
find . -name '*.pyo' -exec rm -f {} +
find . -name '*~' -exec rm -f {} +
# Testing
test:
python -Wall ./manage.py test $(MODULE) --settings=mayan.settings.testing --nomigrations
test-all:
python -Wall ./manage.py runtests --settings=mayan.settings.testing --nomigrations
# Documentation
docs_serve:
$(BROWSER) http://127.0.0.1:8000
cd docs;make livehtml
# Translations
translations_make:
contrib/scripts/process_messages.py -m
translations_compile:
contrib/scripts/process_messages.py -c
translations_push:
tx push -s
translations_pull:
tx pull
# Requirements
requirements_dev:
pip install -r requirements/development.txt
requirements_docs:
pip install -r requirements/documentation.txt
requirements_testing:
pip install -r requirements/testing.txt
# Releases
release: clean
python setup.py sdist bdist_wheel upload
sdist: clean
python setup.py sdist
ls -l dist
wheel: clean
python setup.py bdist_wheel
ls -l dist
# Dev server
runserver:
$(BROWSER) http://127.0.0.1:8000
./manage.py runserver

View File

@@ -1,4 +1,4 @@
|Build Status| |Coverage badge| |PyPI badge| |Installs badge| |License badge|
|PyPI badge| |Build Status| |Coverage badge| |Installs badge| |License badge|
|Logo|
@@ -19,10 +19,6 @@ Free Open Source Electronic Document Management System.
|Animation|
Support
-------
Help support further improvements and development by donating at: https://www.patreon.com/siloraptor
License
-------
@@ -31,7 +27,7 @@ This project is open sourced under `Apache 2.0 License`_.
Installation
------------
To install **Mayan EDMS**, simply do:
To install Mayan EDMS, simply do:
.. code-block:: bash
@@ -63,8 +59,8 @@ Contribute
.. _`the repository`: http://gitlab.com/mayan-edms/mayan-edms
.. _`contributors file`: https://gitlab.com/mayan-edms/mayan-edms/blob/master/docs/topics/contributors.rst
.. |Build Status| image:: https://gitlab.com/ci/projects/6169/status.png?ref=master
:target: https://gitlab.com/ci/projects/6169?ref=master
.. |Build Status| image:: https://gitlab.com/mayan-edms/mayan-edms/badges/master/build.svg
:target: https://gitlab.com/mayan-edms/mayan-edms/commits/master
.. |Logo| image:: https://gitlab.com/mayan-edms/mayan-edms/raw/master/docs/_static/mayan_logo.png
.. |Animation| image:: https://gitlab.com/mayan-edms/mayan-edms/raw/master/docs/_static/overview.gif
.. |Installs badge| image:: http://img.shields.io/pypi/dm/mayan-edms.svg?style=flat

View File

@@ -18,7 +18,7 @@ sudo apt-get -qq update
sudo apt-get -y upgrade
echo -e "\n -> Installing core binaries \n"
sudo apt-get -y install git-core python-virtualenv gcc python-dev libjpeg-dev libpng-dev libtiff-dev tesseract-ocr poppler-utils unpaper libreoffice
sudo apt-get -y install git-core python-virtualenv gcc python-dev libjpeg-dev libpng-dev libtiff-dev tesseract-ocr poppler-utils libreoffice
echo -e "\n -> Cloning development branch of repository \n"
git clone /mayan-edms-repository/ $INSTALLATION_DIRECTORY

View File

@@ -20,7 +20,7 @@ apt-get -qq update
apt-get -y upgrade
echo -e "\n -> Installing core binaries \n"
apt-get install nginx supervisor redis-server postgresql libpq-dev libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr unpaper poppler-utils -y
apt-get install nginx supervisor redis-server postgresql libpq-dev libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr poppler-utils -y
echo -e "\n -> Setting up virtualenv \n"
rm -f ${INSTALLATION_DIRECTORY}

View File

@@ -9,19 +9,17 @@ APP_LIST = (
'converter', 'django_gpg', 'document_comments', 'document_indexing',
'document_signatures', 'document_states', 'documents', 'dynamic_search',
'events', 'folders', 'installation', 'linking', 'lock_manager', 'mailer',
'metadata', 'mirroring', 'navigation', 'ocr', 'permissions', 'rest_api',
'smart_settings', 'sources', 'statistics', 'storage', 'tags',
'metadata', 'mirroring', 'motd', 'navigation', 'ocr', 'permissions',
'rest_api', 'smart_settings', 'sources', 'statistics', 'storage', 'tags',
'user_management'
)
LANGUAGE_LIST = (
'ar', 'bg', 'bs_BA', 'da', 'de_DE', 'en', 'es', 'fa', 'fr', 'hu', 'id',
'it', 'nl_NL', 'pl', 'pt', 'pt_BR', 'ro_RO', 'ru', 'sl_SI', 'vi_VN',
'zh_CN',
)
# Inactive translations
# 'de_CH', 'hr_HR', 'lv', 'nb', 'sq', 'tr_TR', 'zh_TW'
makemessages = sh.Command('django-admin.py')
makemessages = makemessages.bake('makemessages')

View File

@@ -1,15 +1,4 @@
<h3>Donate</h3>
<p>Help support further improvements and development, via:
<ul>
<li>
- <a href="https://www.paypal.me/RobertoRosario">PayPal.Me</a>
</li>
<li>
- <a href="https://www.patreon.com/siloraptor">Patreon</a>
</li>
<li>- or Gumroad:
<script type="text/javascript" src="https://gumroad.com/js/gumroad.js"></script>
<a href="https://gumroad.com/l/UNApl" class="gumroad-button">Buy Mayan EDMS</a>
</li>
</ul>
<h3>Support</h3>
<p>
Consulting, support, customization, rebranding, and plug-in development are available. Email for information to: <a href='mailto:info@mayan-edms.com'>info@mayan-edms.com</a>
</p>

View File

@@ -1,16 +1,16 @@
Welcome to Mayan EDMS!
======================
**Mayan EDMS** is a `Free Open Source`_ `Electronic Document Management System`_, coded in
Mayan EDMS is a `Free Open Source`_ `Electronic Document Management System`_, coded in
the Python language using the Django_ web application framework and released
under the `Apache 2.0 License`_. It provides an electronic vault or repository for electronic documents.
The easiest way to install and try **Mayan EDMS** is by using a Debian based Linux distribution
and installing it from PyPI with the following commands:
The easiest way to use Mayan EDMS is by using a Debian based Linux distribution
and install it from PyPI with the following commands:
.. code-block:: bash
sudo apt-get install libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr unpaper poppler-utils -y
sudo apt-get install libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr poppler-utils -y
virtualenv venv
source venv/bin/activate
pip install mayan-edms
@@ -33,6 +33,7 @@ account.
Concepts <topics/index>
Development <topics/development>
App creation <topics/app_creation>
Roadmap <topics/roadmap>
Translations <topics/translations>
Contributors <topics/contributors>
Screenshots <topics/screenshots>

View File

@@ -25,9 +25,9 @@ What's new in Mayan EDMS v0.12.1
Fabric file (fabfile)
~~~~~~~~~~~~~~~~~~~~~
A Fabric file is included to help users not very familiar with Ubuntu,
Python and Django install **Mayan EDMS**, or for system administrators
Python and Django install Mayan EDMS, or for system administrators
looking to automate the install whether in local or remote systems.
At the moment the fabfile will install **Mayan EDMS** in the same configurations
At the moment the fabfile will install Mayan EDMS in the same configurations
listed in this documentation, that is: (Ubuntu/Debian/Fedora) + virtualenv + Apache + MySQL.
Feel free to submit your configuration settings and files for different databases,
webserver or Linux distribution. More configurations will be added to
@@ -38,7 +38,7 @@ Documentation update
The installation instructions were updated to include the installation of
the libpng-dev and libjpeg-dev libraries as well as the installation of
the poppler-utils package. An additional step to help users test their
new installation of **Mayan EDMS** was also added.
new installation of Mayan EDMS was also added.
Translations
~~~~~~~~~~~~

View File

@@ -24,7 +24,7 @@ What's new in Mayan EDMS v0.12.2
Smarter auto admin creation
~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Mayan EDMS** creates a administrator user during the
Mayan EDMS creates a administrator user during the
database creation phase to reduce the amount of steps required for a
functional install. The creation of this account is controlled by the configuration
option `COMMON_AUTO_CREATE_ADMIN`, the username of the account is
@@ -41,7 +41,7 @@ As per the feature request filed under `issue #26`_, a new document
check out and check in functionality has been added. Users can now
check out a document and lock new version of it from being uploaded to avoid
editing conflicts. Document check outs have an expiration period after which
**Mayan EDMS** will automatically check them back in to avoid a permanent
Mayan EDMS will automatically check them back in to avoid a permanent
document lockout. Only the user who has checked out a document can upload
new versions of it or check the document back in before the expiration period,
unless being granted the ``Allow overriding check out restrictions`` or
@@ -52,14 +52,14 @@ Installation environment app
Diagnosting remote installations of web based applications without access to the
command line can be a bit hard, to alleviate this situation a new installation
environment details app has been added. The purpose of this app is to provide
support staff information about the physical environment where **Mayan EDMS** has
support staff information about the physical environment where Mayan EDMS has
been installed. To avoid possible security compromises only administrators
can access this app.
Editable compressed documents filename
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Previously when downloading more than one document in a compressed manner,
**Mayan EDMS** would produce a file with the name ``document_bundle.zip`` for
Mayan EDMS would produce a file with the name ``document_bundle.zip`` for
download. A different filename can now be specified at the same download dialog.
German translation
@@ -71,7 +71,7 @@ Statistics gathering
~~~~~~~~~~~~~~~~~~~~
Previous attempts at gathering usage statistics have been met with deficient results.
User participation in surveys as well as the quality of the data entered by users
was disappointing. That is why this version of **Mayan EDMS** features an
was disappointing. That is why this version of Mayan EDMS features an
anonymous statistics gathering functionality.

View File

@@ -6,12 +6,12 @@ Mayan EDMS v0.12 release notes
Welcome to Mayan EDMS v0.12!
This release commemorates **Mayan EDMS** first aniversary!
This release commemorates Mayan EDMS first aniversary!
Overview
========
Aside from new features, the focus of this release of **Mayan EDMS** also
Aside from new features, the focus of this release of Mayan EDMS also
been about improving the code and documentation quality standard
even further. The permission system has been completely overhauled to make
it entire class based. The other big change is the addition of object
@@ -61,7 +61,7 @@ Anonymous user support
~~~~~~~~~~~~~~~~~~~~~~
Anonymous user support is a two tier function, first is the addition of
the `COMMON_ALLOW_ANONYMOUS_ACCESS` configuration option that
allows non authenticated user to browse all the pages of a **Mayan EDMS** installation.
allows non authenticated user to browse all the pages of a Mayan EDMS installation.
The second part of this support is the ability to assign permissions
or individual access to objects to anonymous users.
@@ -89,7 +89,7 @@ the download of several documents in a single compressed file.
Customizable GPG home directory
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Addition of the `SIGNATURES_GPG_HOME` configuration option to let
administrators set **Mayan EDMS**'s GPG instance home directory, used to
administrators set Mayan EDMS's GPG instance home directory, used to
store keyrings and other GPG configuration files.
Out of process bulk uploading
@@ -114,7 +114,7 @@ stage to beta stage. Index configuration menus are now available on the
be populated with document links depending on their metadata and properties.
These populated trees can also be mirrored on the physical filesystem and shared
using Samba or another filesharing server giving users a structured view
of the documents contained within **Mayan EDMS** from the ``Indexes`` tab
of the documents contained within Mayan EDMS from the ``Indexes`` tab
or from a mirrored index shared via the network. A new configuration option
has been added, `DOCUMENT_INDEXING_FILESYSTEM_SERVING`, which maps
the index internal name with the physical directory where such index will be
@@ -127,7 +127,7 @@ Included in this version is a small feedback application, found under the
help determine the priority of the next planned features on the pipeline,
or even help add new features if enough requests are received. All questions
are optional but answering as many as possible will help greatly understand
the need of the **Mayan EDMS** user base.
the need of the Mayan EDMS user base.
Staging file previews
~~~~~~~~~~~~~~~~~~~~~

View File

@@ -31,39 +31,39 @@ Attaching or removing tags from a large number of documents is now much easier.
Registration
~~~~~~~~~~~~
Based on requests made by the community for greater commercial support and services for
**Mayan EDMS**, a new feature has been added that allows users to register their
copies of **Mayan EDMS** and better help users with commercial support packages.
Mayan EDMS, a new feature has been added that allows users to register their
copies of Mayan EDMS and better help users with commercial support packages.
Registration for non commercial users is voluntary and optional, and in no way
affects the functionality of **Mayan EDMS**. However even for non commercial users
affects the functionality of Mayan EDMS. However even for non commercial users
registration offers the advantage of automatically branding the user's copy
of **Mayan EDMS** with their name or the company name in the title area.
of Mayan EDMS with their name or the company name in the title area.
Per document type indexing
~~~~~~~~~~~~~~~~~~~~~~~~~~
Index can now be restricted to update only on specific document types, this
greatly increases the usefulness of indexes, and prevents unwanted index
updates.
updates.
Bootstrap
~~~~~~~~~
Setting up **Mayan EDMS** after installation has been indetified by users as the
main difficulty when knowledge about **Mayan EDMS** is relatively low. To
Setting up Mayan EDMS after installation has been indetified by users as the
main difficulty when knowledge about Mayan EDMS is relatively low. To
address this situation a new feature that provides preconfigured setups has been
added. These preconfigured setups are published in the **Mayan EDMS** website and
added. These preconfigured setups are published in the Mayan EDMS website and
upon synchonization are available to users, this gives users access and integrators
access to new setups without having to wait for new versions of **Mayan EDMS**.
access to new setups without having to wait for new versions of Mayan EDMS.
Aside from including preconfigured setups, the new bootstrap app
has the ability of dumping an user's current setup into a serialized text file
which can be tweaked by hand and sent via email to other users. The possibilities
enabled by this range from company wide defaults setups to consultants providing
their clients with customized setups without having to access their clients'
**Mayan EDMS** instances. ``JSON``, ``YAML`` and a custom ``YAML`` format
Mayan EDMS instances. ``JSON``, ``YAML`` and a custom ``YAML`` format
(http://djangosnippets.org/snippets/2461/) are supported by this new app.
Add documents to folders in bulk
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
As requested, the ability to add more than one document at a time to a selected
folder has been added.
folder has been added.
Translation updates
~~~~~~~~~~~~~~~~~~~
@@ -96,7 +96,7 @@ removes any traces of code and configuration options related to UNOCONV.
Optimizations
~~~~~~~~~~~~~
Inspired by the idea of getting **Mayan EDMS** running effectively on low power hardware such as
Inspired by the idea of getting Mayan EDMS running effectively on low power hardware such as
the Raspberry Pi, several rounds or profiling and optimization were done.
Some caching optimization were introduced to the permission model, resulting in
@@ -105,13 +105,13 @@ and a 18% query reduction on cache hits.
Upgrading from a previous version
=================================
If you installed **Mayan EDMS** by cloning the Git repository issue the commands::
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 add the new requirements::
$ pip install -r requirements/production.txt

View File

@@ -118,7 +118,7 @@ to do document OCR using software or services other than Tesseract.
OCR improvements
~~~~~~~~~~~~~~~~
OCR queue state is now reset when reloading **Mayan EMDS**, avoiding the OCR queue
OCR queue state is now reset when reloading Mayan EMDS, avoiding the OCR queue
to remain locked. `unpaper` binary is now an optional pre OCR requirement, the OCR
queue will now continue working is `unpaper` is not installed. Addition of post
OCR processing support for French and German.
@@ -131,7 +131,7 @@ commercial products is now explicitly allowed.
PyPI package
~~~~~~~~~~~~
**Mayan EDMS** has been packaged and submitted to the PyPI_ Python Package Index
Mayan EDMS has been packaged and submitted to the PyPI_ Python Package Index
making it even easier to install and use.
New REST API

View File

@@ -13,7 +13,7 @@ What's new in Mayan EDMS v1.1
Celery
~~~~~~
All background tasks processing has been converted to use Celery_. By default
**Mayan EDMS** runs in "Eager" until a broker and result backend are configured
Mayan EDMS runs in "Eager" until a broker and result backend are configured
as per `Celery's documentation`_. This change made the built-in scheduler and
job_processing apps obsolete, both were removed.
@@ -21,7 +21,7 @@ job_processing apps obsolete, both were removed.
Views namespaces
~~~~~~~~~~~~~~~~
All views are namespaced_ with the name of the app which defines them. If you have
developed 3rd party apps for **Mayan EDMS** be sure to update any reference to a view
developed 3rd party apps for Mayan EDMS be sure to update any reference to a view
by prepending the app name to the view name.
@@ -43,7 +43,7 @@ mail serving.
Update to Django 1.6.8
~~~~~~~~~~~~~~~~~~~~~~
**Mayan EDMS** has been updated to use Django 1.6.8.
Mayan EDMS has been updated to use Django 1.6.8.
Events app
@@ -55,13 +55,13 @@ for `Django activity stream`_
Watch folders
~~~~~~~~~~~~~
Filesystem folders can be monitored for change and their files automatically
uploaded as documents in **Mayan EDMS**.
uploaded as documents in Mayan EDMS.
Vagrant file included
~~~~~~~~~~~~~~~~~~~~~
A vagrant file is now included to allow developers to provision a virtual machine
with the latest development version of **Mayan EDMS**.
with the latest development version of Mayan EDMS.
User locale profile (language and timezone)
@@ -101,7 +101,7 @@ the metadata types of the new document type are automatically assigned.
New release cycle
~~~~~~~~~~~~~~~~~
Starting with this version a new release cycle methodology will come into effect.
The goal of this release cycle is to allow two series of versions of **Mayan EDMS** to be
The goal of this release cycle is to allow two series of versions of Mayan EDMS to be
active at a given time: A new major version with new functionality and a minor version
providing upgrades and fixes. This release (1.1) will be active and supported
during releases of versions 2.x, but will go into end-of-life as soon as
@@ -111,24 +111,24 @@ maintenance mode.
Deprecation of Python 2.6
~~~~~~~~~~~~~~~~~~~~~~~~~
Series 1.0 of **Mayan EDMS** will be the last series supporting Python 2.6. Series
Series 1.0 of Mayan EDMS will be the last series supporting Python 2.6. Series
2.0 will be using Django 1.7.x which itself requires Python 2.7 or later.
Improved testings
~~~~~~~~~~~~~~~~~
**Mayan EDMS** is now automatically tested against SQLite, MySQL and PostgreSQL.
Mayan EDMS is now automatically tested against SQLite, MySQL and PostgreSQL.
API updates
~~~~~~~~~~~
Many new API endpoints have been added exposing the majority of **Mayan EDMS** functionality.
Many new API endpoints have been added exposing the majority of Mayan EDMS functionality.
Messages contextual improvements
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Many updates and simplifications were made to the source text messages to reduce the
difficulty of translating **Mayan EDMS** and maintaing the contextual meaning of the
difficulty of translating Mayan EDMS and maintaing the contextual meaning of the
text messages.
Improved method for custom settings
@@ -186,7 +186,7 @@ More technical documentation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Many new sub topics were added to the development section of the documentation
to allow developers to better understand the inner workings and philosophies
of **Mayan EDMS**.
of Mayan EDMS.
Other changes

View File

@@ -13,7 +13,7 @@ What's new in Mayan EDMS v2.0
Update to Django 1.7
--------------------
The biggest change of this release comes in the form of support for Django 1.7.
**Mayan EDMS** makes use of several new features of Django 1.7 like: migrations,
Mayan EDMS makes use of several new features of Django 1.7 like: migrations,
app config and transaction handling. The version of Django supported in this
version is 1.7.10. With the move to Django 1.7, support for South migrations
and Python 2.6 is removed. The switch to Django 1.7's app config means that
@@ -27,10 +27,10 @@ update a lot of legacy HTML and CSS was removed, greatly simplifying the
existing template and allowing the removal of some.
Theming and re-branding
----------------------
-----------------------
All the presentation logic and markup has been moved into it's own app, the
'appearance' app. All modifications required to customize the entire look of
the **Mayan EDMS** can now be done in a single app. Very little markup remains
the Mayan EDMS can now be done in a single app. Very little markup remains
in the other apps, and it's usually because of necessity, namely the widgets.py
modules.
@@ -98,7 +98,7 @@ app are no longer required. These are:
* slate
ACL system re-factor
-------------------
--------------------
The Access Control System has been greatly simplified and optimized. The
logistics to grant and revoke permissions are now as follows: Only Roles can
hold permissions, groups and user can no longer on their own be granted a
@@ -135,7 +135,7 @@ support. Administrators wanting to make a group of documents public are
encouraged to create an user, group and role for that purpose.
Metadata validators re-factor
----------------------------
-----------------------------
The metadata validators have been split into: Validators and Parsers.
Validators will just check that the input value conforms to certain
specification, raising a validation error is not and blocking the user from
@@ -194,11 +194,11 @@ Failure tolerance
-----------------
Previous versions made use of transactions to prevent data loss in the event of
an unexpected error. This release improves on that approach by also reacting
to infrastructure failures. **Mayan EDMS** can now recover without any or
to infrastructure failures. Mayan EDMS can now recover without any or
minimal data loss from critical events such as loss of connectivity to the
database manager. This changes allow installation of using database managers
that do not provide guaranteed concurrency such as SQLite, to scale to thousand
of documents. While this configuration is still not recommended, **Mayan EDMS**
of documents. While this configuration is still not recommended, Mayan EDMS
will now work and scale much better in environments where parts of the
infrastructure cannot be changed (such as the database manager).
@@ -219,7 +219,7 @@ new scheme.
Default document type and default document source
-------------------------------------------------
After installation a default document type and document source are created,
this means that users can start uploading documents as soon as **Mayan EDMS**
this means that users can start uploading documents as soon as Mayan EDMS
is installed without having to do any configuration setting changes. The
default document type and default document source are both called 'Default'.
@@ -229,7 +229,7 @@ Support for allowing 3rd party apps to unbind links binded by the core apps
was added to further improve re-branding and customization.
Statistics re-factor
-------------------
--------------------
Statistics gathering and generation has been overhauled to allow for the
creation of scheduled statistics. This allows statistics computation to be
scheduled during low load times. A new management command was added to

87
docs/releases/2.1.1.rst Normal file
View File

@@ -0,0 +1,87 @@
===============================
Mayan EDMS v2.1.1 release notes
===============================
Released: May 17, 2016
What's new
==========
This is a bugfix release and all users are encouraged to upgrade.
Fix object column resolution issue in navigation app
----------------------------------------------------
Version 2.1 includes a navigation feature that allows model instances from a
queryset generated using the .defer() or .only() Django filter optimization
features to resolve to their parent class transparently. This optimization
caused problems with the sources app which uses a
Missing Tesseract language files
--------------------------------
The Tesseract OCR backend now reports if the tesseract language file is missing
for the requested document's language.
Other changes
-------------
- Ensure the automatic default index is created after the default document type.
Removals
--------
* None
Upgrading from a previous version
---------------------------------
Using PIP
~~~~~~~~~
Type in the console::
$ pip install -U mayan-edms
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
===========================
* `GitLab issue #288 <https://gitlab.com/mayan-edms/mayan-edms/issues/288>`_ Can't add sources in mayan-edms 2.1.
* `GitLab issue #289 <https://gitlab.com/mayan-edms/mayan-edms/issues/289>`_ OCR fails with Exception.
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/

86
docs/releases/2.1.2.rst Normal file
View File

@@ -0,0 +1,86 @@
===============================
Mayan EDMS v2.1.2 release notes
===============================
Released: May 20, 2016
What's new
==========
This is a bugfix release and all users are encouraged to upgrade.
Language list sorting
---------------------
The document language list and the user locale profile language list are now
sorted to make it easier to find the desired language.
Fixed the metadata lookup options: {{ users }} and {{ groups }}
---------------------------------------------------------------
When configuring metadata type lookup options the {{ users }} and {{ groups }}
special options can be used to display a list of users or a list of groups.
These options where producing a list in the wrong format and were updated.
Other changes
-------------
- Add Makefile for common development tasks
Removals
--------
* None
Upgrading from a previous version
---------------------------------
Using PIP
~~~~~~~~~
Type in the console::
$ pip install -U mayan-edms
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
===========================
* `GitLab issue #290 <https://gitlab.com/mayan-edms/mayan-edms/issues/290>`_ Unicode characters not supported as metadata values
* `GitLab issue #292 <https://gitlab.com/mayan-edms/mayan-edms/issues/292>`_ Sort languages by name not by abbreviation
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/

238
docs/releases/2.1.rst Normal file
View File

@@ -0,0 +1,238 @@
=============================
Mayan EDMS v2.1 release notes
=============================
Released: May 14, 2016
What's new
==========
Upgrade to use Django 1.8.13
----------------------------
With the end of life support for Django 1.7, moving to the next Mayan EDMS
minor version was a target for this release. The Django minor release chosen was
1.8 as it is very compatible with 1.7 and required minimal changes. Django 1.8
is an LTS release (Long Term Support) meaning that is no new big feature of a
new Django version is required, the project can stay in Django 1.8 for a good
amount of time with no downsides.
Remove remaining references to Django's User model
--------------------------------------------------
The few remaining hard code references to Django's User model that were missed
in a previous release have been removed. Using a custom User model with Mayan
should present very little if any obstacles.
Remove included login required middleware
-----------------------------------------
The custom middleware include with Mayan EDMS that forces user to be
authenticated before being able to access any view has been removed in favor of
a dedicated 3rd party Django app for that purpose. The app chosen was
django-stronghold (http://mikegrouchy.com/django-stronghold/).
Improve generation of success and error messages for class based views
----------------------------------------------------------------------
In the past success messages for actions would show a generic mention to the
object being manipulated (document, folder, tag). Now the errors and success
messages with be more explicit in describing what the view has or was trying
to manipulate.
Remove ownership concept from folders
-------------------------------------
Currently Folders in Mayan EDMS have a field that stores a reference to the
user that has created that folders. One of the design decisions of Mayan EDMS
is that there should never be any explicit ownership of any object. Ownership
is relative and is defined by the Access Control List of an object. The
removal of the user field from the Folders model brings this app in line with
the defined behavior.
Replacement of strip_spaces middleware with the spaceless template tag
----------------------------------------------------------------------
As a size optimization technique HTML content was dynamically stripped of spaces
as it was being served. The technique used involved detecting the MIME type of
the content being served and if found to be of text/HTML type spaces between
tags were stripped. An edge case was found where this did not worked always.
The approached has been changed to use Django's official tag to strip spaces.
In addition to using an official approach, the removal of spaces only happens
when the template is compiled and not at each HTTP response. The optimization
is minimal but since it happened at every response a small increase in speed
is expected for all deployment scenarios.
Deselect the update checkbox for optional metadata by default
-------------------------------------------------------------
During the last releases the behavior of the of metadata edit checkbox has seen
several tune ups. Thanks to community feedback one small change has been
introduced. The edit checkbox will be deselected by default for all optional
document type metadata entries.
Implement per document type document creation permission
--------------------------------------------------------
If is now possible to grant the document creation permission to a role for a
document type. Previously document creation was a "blanket" permission. Having
the permission meant that user could create any type of document. With this
change it is now possible to restrict which types of document users of a
specific role can create.
Make document type delete time period optional
----------------------------------------------
The entries that defined after how long a document in the trash would be
permanently deleted have been made optional. This means that if a document
type has this option blank, the corresponding document of this type would never
be deleted from the trash can.
Fixed date locale handling in document properties, checkout and user detail views
---------------------------------------------------------------------------------
A few releases back the ability to for users to set their timezone was added.
This change also included a smart date rendering update to adjust the dates
and times fields to the user's timezone. Some users reported a few views where
this timezone adjustment was not happening, this has been fully fixed.
Default index
-------------
During new installations a default index that organizes document by year/month
when they were uploaded will be created to help users better understand the
concept of indexes in Mayan EDMS.
HTML5 upload widget
-------------------
A common request is the ability to just drap and drop documents from other
windows into Mayan EDMS's document upload wizard. This release includes that
capability and will also show a completion bar for the upload. Document
uploading is sped up dramatically with this change.
Message of the Day app
----------------------
Administrators wanting to display announcements has no other way to do so
than to customize the login template. To avoid this a new app has been added
that allows for the creation of messages to be shown at the user login
screen. These messages can have an activation and an expiration date and
time. These messages are useful for display company access policies,
maintenance announcement, etc.
Document signing
----------------
The biggest change for this release if the addition of document signing from
within the UI. Enterprise users request this feature very often as in those
environments cryptographic signatures are a basic requirement. Previously
Mayan EDMS had the ability to automatically check if a document was signed and
if signed, verify the validity of the signature. However, to sign documents
user had to download the document, sign the document offline, and either
re-upload the signed document as a new version or upload a detached
signature for the existing document version. Aside from being now able to sign
documents from the web user interface, the way keys are handled has been
rewritten from scratch to support distributed key storage. This means that
a key uploaded in one computer by one user can be used transparently by
other users in other computers to sign documents. The relevant access control
updates were added to the new document signing system. Users wanting to sign a
document need the singing permission for the document (or document type),
for the private key they intend to use, and the passphrase (if the key has one).
Finally documents are now checked just once for signatures and not every time
they are accessed, this provides a very sizable speed improvement in document
access and availability.
Other changes
=============
- Upgrade Python requirements to recent versions.
- Rename 'Content' search box to 'OCR'.
- Silence all Django 1.8 model import warnings.
- Add icons to the document face menu links.
- Increase icon to text spacing to 3px.
- Add new permission: checkout details view.
- Add HTML tags stripping to the browser title generation template.
- Folder and Tag creation API calls now return the id of the created instances.
- Update Document model's uuid field to use Django's native UUIDField class.
- Add new split view index navigation
- Newly uploaded documents appear in the Recent document list of the user.
- Start migration from django-sendfile to django-downloadview.
- Index more model fields.
- Navigation system support querysets using .defer() or .only() optimizations.
- API fixes and improvements.
- Increase total test count to 311.
- Increase test coverage to 77%.
- Documentation improvements.
- Handle unicode filenames in staging folders.
- Add staging file deletion permission.
- New document_signature_view permission.
- Instead of multiple keyservers only one keyserver is now supported.
- Replace document type selection widget with an opened selection list.
- Add roadmap documentation chapter.
Removals
--------
* None
Upgrading from a previous version
---------------------------------
Using PIP
~~~~~~~~~
Type in the console::
$ pip install -U mayan-edms
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
===========================
* `GitLab issue #137 <https://gitlab.com/mayan-edms/mayan-edms/issues/137>`_ Add app creation chapter to documentation.
* `GitLab issue #147 <https://gitlab.com/mayan-edms/mayan-edms/issues/147>`_ Add in app document signing.
* `GitLab issue #161 <https://gitlab.com/mayan-edms/mayan-edms/issues/161>`_ Email backend setup documentation.
* `GitLab issue #162 <https://gitlab.com/mayan-edms/mayan-edms/issues/162>`_ Add HTML5 file uploader.
* `GitLab issue #191 <https://gitlab.com/mayan-edms/mayan-edms/issues/191>`_ Split index contents title into title and path/breadcrumb widget.
* `GitLab issue #206 <https://gitlab.com/mayan-edms/mayan-edms/issues/206>`_ Support for dynamic LOGIN_EXEMPT_URLS.
* `GitLab issue #208 <https://gitlab.com/mayan-edms/mayan-edms/issues/208>`_ Add tagging step to upload wizard.
* `GitLab issue #218 <https://gitlab.com/mayan-edms/mayan-edms/issues/218>`_ Cookie cutter template for Mayan apps.
* `GitLab issue #222 <https://gitlab.com/mayan-edms/mayan-edms/issues/222>`_ Add notice board or Message of the Day.
* `GitLab issue #225 <https://gitlab.com/mayan-edms/mayan-edms/issues/225>`_ Remove hard coded User model.
* `GitLab issue #232 <https://gitlab.com/mayan-edms/mayan-edms/issues/232>`_ "Create documents" is a blanket permission for a user to create a document of any document type.
* `GitLab issue #246 <https://gitlab.com/mayan-edms/mayan-edms/issues/246>`_ Upgrade to Django version 1.8 as Django 1.7 is end-of-life.
* `GitLab issue #251 <https://gitlab.com/mayan-edms/mayan-edms/issues/251>`_ Add method to disable metadata edit form "update" checkbox when not needed.
* `GitLab issue #255 <https://gitlab.com/mayan-edms/mayan-edms/issues/255>`_ UnicodeDecodeError in apps/common/middleware/strip_spaces_widdleware.py.
* `GitLab issue #256 <https://gitlab.com/mayan-edms/mayan-edms/issues/256>`_ typo in locale settings (Dutch).
* `GitLab issue #261 <https://gitlab.com/mayan-edms/mayan-edms/issues/261>`_ Feature: Document Access Audit Logging.
* `GitLab issue #265 <https://gitlab.com/mayan-edms/mayan-edms/issues/265>`_ Indexes show list (show indexe only if the user has ACLs on document type).
* `GitLab issue #266 <https://gitlab.com/mayan-edms/mayan-edms/issues/266>`_ Smart links : Dynamic label with Postgresql.
* `GitLab issue #267 <https://gitlab.com/mayan-edms/mayan-edms/issues/267>`_ Release 2.1 RC1 : Notes and ideas.
* `GitLab issue #268 <https://gitlab.com/mayan-edms/mayan-edms/issues/268>`_ Release 2.1 RC1 : Bug to access inside an indexes.
* `GitLab issue #270 <https://gitlab.com/mayan-edms/mayan-edms/issues/270>`_ Release 2.1 RC1 : Bug statistics.
* `GitLab issue #274 <https://gitlab.com/mayan-edms/mayan-edms/issues/274>`_ [Release 2.1 RC2] Web Tests.
* `GitLab issue #275 <https://gitlab.com/mayan-edms/mayan-edms/issues/275>`_ [Release 2.1 RC2] Notes.
* `GitLab issue #276 <https://gitlab.com/mayan-edms/mayan-edms/issues/276>`_ [Release 2.1 RC2] API Tests.
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/

View File

@@ -2,19 +2,19 @@
Release notes
=============
Release notes for the official **Mayan EDMS** releases. Each release note will tell you
Release notes for the official Mayan EDMS releases. Each release note will tell you
what's new in each version, and will also describe any backwards-incompatible
changes made in that version.
For those upgrading to a new version of **Mayan EDMS**, you will need to check
For those upgrading to a new version of Mayan EDMS, you will need to check
all the backwards-incompatible changes and deprecated features for
each 'final' release from the one after your current **Mayan EDMS** version,
each 'final' release from the one after your current Mayan EDMS version,
up to and including the latest version.
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.
2.0 series
@@ -22,9 +22,12 @@ versions of the documentation contain the release notes for any later releases.
.. toctree::
:maxdepth: 1
2.0
2.0.1
2.1.2
2.1.1
2.1
2.0.2
2.0.1
2.0
1.0 series
----------

View File

@@ -2,7 +2,7 @@
Access control lists
====================
Besides the permissions system explained in :doc:`permissions`, **Mayan EDMS**
Besides the permissions system explained in :doc:`permissions`, Mayan EDMS
provides per object permission granting. This feature is used to grant a
permission to a role, but this permission can only be executed for a limited
number of objects (documents, folders, tags) instead of being effective

View File

@@ -2,7 +2,7 @@
App creation
============
**Mayan EDMS** apps are essentially Django app with some extra code to register
Mayan EDMS apps are essentially Django app with some extra code to register
navigation, permissions and other relationships.
@@ -21,7 +21,7 @@ App modules
- api_views.py
REST API views go here. **Mayan EDMS** uses Django REST Framework API view
REST API views go here. Mayan EDMS uses Django REST Framework API view
classes.
- apps.py
@@ -135,7 +135,7 @@ Views
=====
The module common.generics provides custom generic class based views to be used.
The basic views used to create, edit, view and delete objects in **Mayan EDMS**
The basic views used to create, edit, view and delete objects in Mayan EDMS
are: SingleObjectCreateView, SingleObjectDetailView, SingleObjectEditView,
and SingleObjectListView

16
docs/topics/backups.rst Normal file
View File

@@ -0,0 +1,16 @@
=======
Backups
=======
To backup your install of Mayan EDMS just copy the actual document files and
the database content. If you are using the default storage backend, the
document files should be found in ``mayan/media/document_storage/``.
To dump the content of your database manager refer to the documentation chapter
regarding database data "dumping".
Example:
- Postgresl: http://www.postgresql.org/docs/current/static/backup.html
- MySQL: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
- SQLite: Just copy the file ``mayan/media/db.sqlite3``

View File

@@ -15,14 +15,14 @@ Search for information in the `archives of the mayan-edms mailing list`_, or
`post a question`_. If you prefer news servers, use the gateway provided by
Gmane_.
**Mayan EDMS** community developers do their best to reply to basic questions.
Mayan EDMS community developers do their best to reply to basic questions.
Be sure to check the list archives as it may already containt the answers to
your questions.
Twitter
-------
**Mayan EDMS** has an official Twitter account, `@mayanedms
Mayan EDMS has an official Twitter account, `@mayanedms
<http://twitter.com/mayanedms>`_, which is used for announcements and occasional
related news tidbits.
@@ -30,7 +30,7 @@ related news tidbits.
Bugs/ticket tracker
-------------------
Report bugs with **Mayan EDMS** or search existing ones using Github's `ticket tracker`_.
Report bugs with Mayan EDMS or search existing ones using Gitlab's `ticket tracker`_.
.. _archives of the mayan-edms mailing list: http://groups.google.com/group/mayan-edms/

View File

@@ -8,7 +8,7 @@ Contributors
How to contribute?
------------------
You can help further the development of **Mayan EDMS** by testing, reporting
You can help further the development of Mayan EDMS by testing, reporting
bugs, submitting documentation or code patches.
Lead developer

View File

@@ -5,7 +5,7 @@ Deploying
OS "bare metal"
===============
Like other Django based projects **Mayan EDMS** can be deployed in a wide variety
Like other Django based projects Mayan EDMS can be deployed in a wide variety
of ways. The method provided below is only a bare minimum example.
These instructions are independent of the instructions mentioned in the
:doc:`installation` chapter but assume you have already made a test install to
@@ -109,7 +109,7 @@ Create the directory for the uWSGI log files::
mkdir /var/log/uwsgi
Create the NGINX site file for **Mayan EDMS**, ``/etc/nginx/sites-available/mayan``::
Create the NGINX site file for Mayan EDMS, ``/etc/nginx/sites-available/mayan``::
server {
listen 80;
@@ -134,7 +134,7 @@ Create the NGINX site file for **Mayan EDMS**, ``/etc/nginx/sites-available/maya
}
}
Enable the NGINX site for **Mayan EDMS**::
Enable the NGINX site for Mayan EDMS::
ln -s /etc/nginx/sites-available/mayan /etc/nginx/sites-enabled/
@@ -198,7 +198,7 @@ Deploy the Docker image stack::
docker run --name redis -d redis
docker run --name mayan-edms -p 80:80 --link postgres:postgres --link redis:redis -e POSTGRES_DB=mayan -e POSTGRES_USER=mayan -e POSTGRES_PASSWORD=mysecretpassword -v /usr/local/lib/python2.7/dist-packages/mayan/media -d mayanedms/monolithic
After the **Mayan EDMS** container finishes initializing (about 5 minutes), it will
After the Mayan EDMS container finishes initializing (about 5 minutes), it will
be available by browsing to http://127.0.0.1. You can inspect the initialization
with::
@@ -242,7 +242,7 @@ Launch the entire stack (Postgres, Redis, and Mayan EDMS) using::
docker-compose -f docker-compose.yml -p mayanedms up -d
After the **Mayan EDMS** container finishes initializing (about 5 minutes), it will
After the Mayan EDMS container finishes initializing (about 5 minutes), it will
be available by browsing to http://127.0.0.1. You can inspect the initialization
with::

View File

@@ -3,7 +3,7 @@
Development
===========
**Mayan EDMS** is under active development, and contributions are welcome.
Mayan EDMS is under active development, and contributions are welcome.
If you have a feature request, suggestion or bug report, please open a new
issue on the `GitLab issue tracker`_. To submit patches, please send a pull
@@ -16,8 +16,8 @@ request on GitLab_. Make sure to add yourself to the :ref:`contributors` file.
Project philosophies
--------------------
How to think about **Mayan EDMS** when doing changes or adding new features,
why things are the way they are in **Mayan EDMS**.
How to think about Mayan EDMS when doing changes or adding new features,
why things are the way they are in Mayan EDMS.
- Functionality must be as market/sector independent as possible, code for the
95% of use cases.
@@ -125,7 +125,7 @@ Correct:
Dependencies
~~~~~~~~~~~~
**Mayan EDMS** apps follow a hierarchical model of dependency. Apps import from
Mayan EDMS apps follow a hierarchical model of dependency. Apps import from
their parents or siblings, never from their children. Think plugins. A parent
app must never assume anything about a possible existing child app. The
documents app and the Document model are the basic entities they must never
@@ -136,7 +136,7 @@ Variables
~~~~~~~~~
Naming of variables should follow a Major to Minor convention, usually
including the purpose of the variable as the first piece of the name, using
underscores as spaces. camelCase is not used in **Mayan EDMS**.
underscores as spaces. camelCase is not used in Mayan EDMS.
Examples:
@@ -171,7 +171,7 @@ Classes:
Strings
~~~~~~~
Quotation character used in **Mayan EDMS** for strings is the single quote.
Quotation character used in Mayan EDMS for strings is the single quote.
Double quote is used for multiple line comments or HTML markup.
Migrations
@@ -199,7 +199,7 @@ as passed directly from the exception object.
Source Control
--------------
**Mayan EDMS** source is controlled with Git_.
Mayan EDMS source is controlled with Git_.
The project is publicly accessible, hosted and can be cloned from **GitLab** using::
@@ -209,7 +209,7 @@ The project is publicly accessible, hosted and can be cloned from **GitLab** usi
Git branch structure
--------------------
**Mayan EDMS** follows a simplified model layout based on Vincent Driessen's
Mayan EDMS follows a simplified model layout based on Vincent Driessen's
`Successful Git Branching Model`_ blog post.
``develop``
@@ -299,7 +299,7 @@ merged.
Debugging
---------
**Mayan EDMS** makes extensive use of Django's new `logging capabilities`_.
Mayan EDMS makes extensive use of Django's new `logging capabilities`_.
By default debug logging for all apps is turned on. If you wish to customize
how logging is managed turn off automatic logging by setting
`COMMON_AUTO_LOGGING` to ``False`` and add the following lines to your

View File

@@ -2,7 +2,7 @@
Document types
==============
The basic unit of data in **Mayan EDMS** is the ``document type``. A document
The basic unit of data in Mayan EDMS is the ``document type``. A document
type can be interpreted also as a document category, a document class, or a
document template. Document types need to be created before documents can be
uploaded. It is not possible to upload documents without assigning them a
@@ -11,7 +11,7 @@ document type. Examples of document type: **invoices**, **blueprints**,
Settings and attributes are applied to document types and documents will
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
type at a given moment, but if needed, the type of a document can be changed.
Upon changing its type, the document will lose its previous settings and
attributes, and will inherit the settings and attributes of its new type.

View File

@@ -7,7 +7,7 @@ Frequently asked questions and solutions
**Q: PostgreSQL vs. MySQL**
Since Django abstracts database operations from a functional point of view
**Mayan EDMS** will behave exactly the same either way. The only concern
Mayan EDMS will behave exactly the same either way. The only concern
would be that MySQL doesn't support transactions for schema modifying
commands. The only moment this could cause problems is when running
South migrations during upgrades, if a migration fails the database

View File

@@ -19,7 +19,7 @@ Features
* Office document format support.
* **Mayan EDMS** can detect the presence of Libre Office and use it to support
* Mayan EDMS can detect the presence of Libre Office and use it to support
word processing files, spreadsheets and presentations.
* User defined metadata fields.
@@ -44,7 +44,7 @@ Features
* Previews for many file formats.
* **Mayan EDMS** provides image preview generation for many popular file
* Mayan EDMS provides image preview generation for many popular file
formats.
* Full text searching.
@@ -78,7 +78,7 @@ Features
* Multilingual user interface.
* **Mayan EDMS** being written using the Django_ framework, can be translated
* Mayan EDMS being written using the Django_ framework, can be translated
to practically any language spoken in the world. For a list of translated
languages have a look at the Transifex_ project location.

View File

@@ -2,7 +2,7 @@
File storage
============
The files are stored and placed under **Mayan EDMS** "control" to avoid
The files are stored and placed under Mayan EDMS "control" to avoid
filename clashes each file gets renamed to its ``UUID`` (Universally Unique ID),
without extension, and stored in a simple flat arrangement in a directory.
@@ -20,9 +20,16 @@ This doesn't stop access to the files but renaming, moving or updating
directly them is not recommended because it would throw the database out
of sync.
Because **Mayan EDMS** components are as decoupled from each other as possible,
Because Mayan EDMS components are as decoupled from each other as possible,
storage in this case is decoupled and its behavior is controlled
not by the project but by the ``Storage`` module class. All the other
modules don't make any assumptions about how the actual document files are
stored. This way files can be saved locally, over the network or even across
the Internet and everything will still operate exactly the same.
The default file storage backend: ``storage.backends.filebasedstorage.FileBasedStorage``
is a simple backend that only supports paths and not IP addresses. In case you
are interested in using remote volumes to store documents (NFS, SAMBA), first
mount these volumes so that they appear as a directories to Mayan EDMS. For
direct support for remote volumes a custom backend would be needed such as those
provided by the Django Storages project (https://django-storages.readthedocs.org/en/latest/).

View File

@@ -1,7 +1,7 @@
Concepts
========
Introductions to all the key parts of **Mayan EDMS** you'll need to know:
Introductions to all the key parts of Mayan EDMS you'll need to know:
.. toctree::
:maxdepth: 1
@@ -15,8 +15,13 @@ Introductions to all the key parts of **Mayan EDMS** you'll need to know:
checkouts
versioning
signatures
ocr_backend
indexes
languages
smart_links
tags
mailing
settings
file_storage
backups
screenshots

View File

@@ -17,7 +17,7 @@ Example:
- Metadata type: ``Product year``, associated as a required metadata for the document type ``Product sheet``.
- Index: ``Product sheets per year``, and associated to the document type ``Product sheet``.
- Index slug: ``product-sheets-per-year``. Slugs are internal unique identifiers that can be used by other **Mayan EDMS** modules to reference each index.
- Index slug: ``product-sheets-per-year``. Slugs are internal unique identifiers that can be used by other Mayan EDMS modules to reference each index.
- Index tree template as follows:
.. blockdiag::

View File

@@ -2,11 +2,11 @@
Installation
============
**Mayan EDMS** should be deployed like any other Django_ project and
Mayan EDMS should be deployed like any other Django_ project and
preferably using virtualenv_.
Being a Django_ and a Python_ project, familiarity with these technologies is
recommended to better understand why **Mayan EDMS** does some of the things it
recommended to better understand why Mayan EDMS does some of the things it
does.
Bellow are the step needed for a test install.
@@ -20,13 +20,13 @@ Ubuntu
If using a Debian_ or Ubuntu_ based Linux distribution, get the executable
requirements using::
sudo apt-get install libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr unpaper poppler-utils -y
sudo apt-get install libjpeg-dev libmagic1 libpng-dev libreoffice libtiff-dev gcc ghostscript gpgv python-dev python-virtualenv tesseract-ocr poppler-utils -y
Mac OSX
-------
**Mayan EDMS** is dependent on a number of binary packages and the recommended
Mayan EDMS is dependent on a number of binary packages and the recommended
way is to use a package manager such as `MacPorts <https://www.macports.org/>`_
or `Homebrew <http://brew.sh/>`_.
@@ -45,7 +45,7 @@ With MacPorts installed run the command:
Set the Binary paths
********************
**Mayan EDMS** by default will look in /usr/bin/ for the binary files it needs
Mayan EDMS by default will look in /usr/bin/ for the binary files it needs
so either you can symlink the binaries installed via MacPorts in /opt/local/bin/
to /usr/bin/ with ...
@@ -71,7 +71,7 @@ With Homebrew installed run the command:
Set the Binary paths
********************
**Mayan EDMS** by default will look in /usr/bin/ for the binary files it needs
Mayan EDMS by default will look in /usr/bin/ for the binary files it needs
so either you can symlink the binaries installed via brew in /usr/local/bin/
to /usr/bin/ with ...
@@ -99,8 +99,8 @@ Initialize a ``virtualenv`` to deploy the project:
source venv/bin/activate
pip install mayan-edms
By default **Mayan EDMS** will create a single file SQLite_ database, which makes
it very easy to start using **Mayan EDMS**. Populate the database with the
By default Mayan EDMS will create a single file SQLite_ database, which makes
it very easy to start using Mayan EDMS. Populate the database with the
project's schema doing:
.. code-block:: bash
@@ -112,14 +112,22 @@ Point your browser to http://127.0.0.1:8000. If everything was installed
correctly you should see the login screen and panel showing a randomly generated
admin password.
Note: Background tasks and scheduled tasks will not run when using the test server.
Background tasks and scheduled tasks will not run when using the test server.
The ``runserver`` command is only meant for testing, do not use in a production
server.
Note that the default IP address, 127.0.0.1, is not accessible from other
machines on your network. To make your test server viewable to other
machines on the network, use its own IP address (e.g. 192.168.2.1) or 0.0.0.0 or :: (with IPv6 enabled).
You can provide an IPv6 address surrounded by brackets (e.g. [200a::1]:8000). This will automatically enable IPv6 support.
Production use
==============
After making sure everything is running correctly, stop the `runserver` command.
Deploy **Mayan EDMS** using the webserver of your preference. For more information
After making sure everything is running correctly, stop the ``runserver`` command.
Deploy Mayan EDMS using the webserver of your preference. For more information
on deployment instructions and examples, checkout Django's official documentation
on the topic https://docs.djangoproject.com/en/1.7/howto/deployment/
For a simple production deployment setup follow the instructions in the

19
docs/topics/languages.rst Normal file
View File

@@ -0,0 +1,19 @@
=========
Languages
=========
The list of languages choices in the language dropdown used for documents is
based on the current ISO 639 list. This list can be quite extensive. To reduce
the number of languages available use the settings ``DOCUMENTS_LANGUAGE_CHOICES``,
and set it to a nested list of abbreviations + languages names like::
DOCUMENTS_LANGUAGE_CHOICES = (('eng', 'English'), ('spa', 'Spanish'))
The default language to appear on the dropdown can also be configured using::
DOCUMENTS_LANGUAGE = 'spa'
Use the correct ISO 639-3 language abbreviation (https://en.wikipedia.org/wiki/ISO_639)
as this code is used in several subsystems in Mayan EDMS such as the OCR app
to determine how to interpret the document.

View File

@@ -2,7 +2,7 @@
License
=======
**Mayan EDMS** is distributed under the `Apache 2.0 License`_.
Mayan EDMS is distributed under the `Apache 2.0 License`_.
The complete license terms are included below.
.. _Apache 2.0 License: https://www.apache.org/licenses/LICENSE-2.0.txt

17
docs/topics/mailing.rst Normal file
View File

@@ -0,0 +1,17 @@
=================
Mailing documents
=================
To be able to send documents via email from inside Mayan EDMS you need to add
and configure the following configuration variables in your
mayan/settings/local.py file::
EMAIL_HOST = 'smtp.gmail.com' # Or similar
EMAIL_PORT = 587
EMAIL_HOST_USER = '<your smtp username>'
EMAIL_HOST_PASSWORD = '<your smtp password>'
EMAIL_USE_TLS = True
"Mail is sent using the SMTP host and port specified in the EMAIL_HOST and EMAIL_PORT settings. The EMAIL_HOST_USER andEMAIL_HOST_PASSWORD settings, if set, are used to authenticate to the SMTP server, and the EMAIL_USE_TLS and EMAIL_USE_SSL settings control whether a secure connection is used."
For more details consult Django's documentation on the topic: https://docs.djangoproject.com/en/1.8/ref/settings/#email-host

View File

@@ -0,0 +1,15 @@
===========
OCR backend
===========
Mayan EDMS ships an OCR backend that uses the FLOSS engine Tesseract, but it can
use other engines. To support other engines a wrapper that subclasess the
``OCRBackendBase`` class defined in mayan/apps/ocr/classes. This subclass should
expose the ``execute`` method. For an example of how the Tesseract backend
is implemented take a look at the file ``mayan/apps/ocr/backends/tesseract.py``
Once you create you own backend, in your local.py settings add the option
OCR_BACKEND and point it to your new OCR backend class path.
The default value of OCR_BACKEND is ``"ocr.backends.tesseract.Tesseract"``

View File

@@ -2,7 +2,7 @@
Permissions
===========
**Mayan EDMS** provides very fine control over which actions users can
Mayan EDMS provides very fine control over which actions users can
perform. Action control works by allowing ``roles``, that are composed of
``groups`` of ``users`` to be granted a ``permission`` such that the holder of
that permission can exercise it throughout the entire system.

102
docs/topics/roadmap.rst Normal file
View File

@@ -0,0 +1,102 @@
=======
Roadmap
=======
- Goals for version 2.2:
- Improve workflow system
- Workflow indexing support. Accessor already works ``{{ document.workflows.all.0.get_current_state }}``. Index recalculation after workflow transition is missing.
- Workflow actions. Predefined actions to be execute on document leaving or entering a state or a transition. Example: "Add to folder X", "Attach tag X".
- Add support for state recipients.
- Add workflow document inbox notification.
- Replace indexing and smart linking template language (use Jinja2 instead of Django's).
- Display/find documents by their current workflow state.
- Goals for version 3.0:
- Replace UI.
- General goals:
- Distribution:
- Debian packages. Limited success so far using https://github.com/astraw/stdeb.
- Downloads:
- Transition from filetransfer package to django-downloadview. This task was started and the view ``common.generics.SingleObjectDownloadView`` was created. The ``document_signatures`` app is the first app to use it.
- Notifications:
- Add support for subscribing to a document's events.
- Add support for subscribing to a document type events.
- Add support for subscribing specific events.
- OCR:
- Add image preprocessing for OCR. Increase effectiveness of Tesseract.
- Improve interface with tesseract.
- Fix pytesseract shortcomings via upstream patches or re-implement. Move to PyOCR.
- Python 3:
- Complete support for Python3.
- Find replacement for pdfminer (Python3 support blocker). Use pdfminer.six (#257).
- Simple serving:
- Provide option to serve Mayan EDMS without a webserver (using Tornado o similar). Work started in branch: ``/feature/tornado``
- Source code:
- Implement Developer certificate of origin: http://developercertificate.org/
- Upload wizard:
- Make wizard step configurable. Create ``WirzardStep`` class so apps can add their own upload wizard steps, instead of the steps being hardcoded in the sources app.
- Add upload wizard step to add the new documents to a folder.
- Other
- Use a sequence and not the document upload date to determine the document version sequence. MySQL doesn't store milisecond value in dates and if several version are uploaded in a single second there is no way to know the order or which one is the latests. This is why the document version tests include a 2 second delay. Possible solution: http://schinckel.net/2015/05/17/django-second-autofield/
- Include external app Mayan-EXIF into main code.
- Convert all views from functions to class based views (CBV).
- Increase test coverage.
- Mock external services in tests. For example the ``django_GPG`` app key search and receive tests.
- Pluggable icon app. Make switching icon set easier.
- Reduce dependency on binary executables for a default install.
- Find replacement for ``cssmin`` & ``django-compressor``.
- Find replacement for ``python-gnupg``. Unstable & inconsistent API.
- Google docs integration. Upload document from Google Drive.
- Get ``dumpdata`` and ``loaddata`` working flawlessly. Will allow for easier backups, restores and database backend migrations.
- Make more view asynchronous:
- trash can emptying.
- document delete view.
- Add support for loading settings from environment variables, not just settings/local.py.
- Add generic list ordering. ``django.views.generic.list.MultipleObjectMixin`` (https://docs.djangoproject.com/en/1.8/ref/class-based-views/mixins-multiple-object/#django.views.generic.list.MultipleObjectMixin) now supports an ``ordering`` parameter.
- Workaround GitLab CI MySQL test errors. GitLab MySQL's container doesn't support UTF-8 content.
- Add support for downloading the OCR content as a text file.
- Add support to convert any document to PDF. https://gitlab.mister-muffin.de/josch/img2pdf
- Add support for combining documents.
- Add support for splitting documents.
- Add task viewer.
- Add new document source to get documents from an URL.
- Document overlay support. Such as watermarks. https://gist.github.com/umrashrf/8616550
- Add support for metadata mapping files. CSV file containing filename to metadata values mapping, useful for bulk upload and migrations.
- Add support for registering widgets to the home screen.
- Merge mimetype and converter apps.
- Add entry in About menu to check latest Mayan EDMS version via PyPI.
- Add GPG key generation.
- Add documentation section on editing the settings/local.py file.
- Add documentation section with warning about using runserver.
- Replace ``urlpatterns = patterns( ''``, with Python lists. Django recommendation for post 1.7.
- If SourceColumn label is None take description from model. Avoid unnecessary translatable strings.
- Metadata widgets (Date, time, timedate).
- Datatime widget: https://github.com/smalot/bootstrap-datetimepicker
- Separate Event class instances with a parent namespace class: EventNamespace.
- Add events for document signing app (uploaded detached signateure, signed document, deleted signature)
- A configurable conversion process. Being able to invoke different binaries for file conversion, as opposed to the current libreoffice only solution.
- A tool in the admin interface to mass (re)convert the files (basically the page count function, but then applied on all documents).
- Find solution so that documents in watched folders are not processed until they are ready. Use case scanning directly to scanned folders.

12
docs/topics/settings.rst Normal file
View File

@@ -0,0 +1,12 @@
========
Settings
========
When Mayan EDMS is initially installed a ``local.py`` file is created inside the
``/mayan/settings/`` folder. So if you installed Mayan EDMS according to the
instructions provided in this documentation your ``local.py`` should be located in
the directory: ``/usr/share/mayan-edms/mayan/settings/local.py``.
For a list of all the configuration options, go to "Setup" then "Settings" on
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.

View File

@@ -2,7 +2,7 @@
Document signatures
===================
**Mayan EDMS** supports two types of document signatures: embedded and
Mayan EDMS supports two types of document signatures: embedded and
detached signatures. When a document with an embedded signature is
uploaded, this signature is readily detected as part of the document
inspection step. The status of the signature can be verified by accessing the

View File

@@ -7,5 +7,16 @@ documents. For example: a scanning equipment may only produce landscape PDFs.
In this case an useful transformation for that document source would be to
rotate all documents scanned by 270 degrees after being uploaded, this way
whenever a document is uploaded from that scanner it will appear in portrait
orientation. Transformations do not physically modify the document file but
are just associated with the document's temporary graphical representation.
orientation. In this case add a this transformation to the Mayan EDMS source
that is connected to that device this way all pages scanned via that source
with inherit the transformation as they are created.
Transformations can also be added to existing documents, by clicking on a
document's page, then clicking on "transformations". In this view the Actions
menu will have a new option that reads "Create new transformation". At the
moment the rotation, zoom, crop, and resize transformations are available.
Once the document image has been corrected resubmit it for OCR for improved
results.
Transformations are not destructive and do not physically modify the document
file, they just modify the document's graphical representation.

View File

@@ -2,7 +2,7 @@
Document versioning
===================
**Mayan EDMS** has the ability to store different versions of the same
Mayan EDMS has the ability to store different versions of the same
document. A comment field is provided to allow users to summarize the new
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

View File

@@ -1,10 +1,10 @@
from __future__ import unicode_literals
__title__ = 'Mayan EDMS'
__version__ = '2.0.2'
__build__ = 0x020002
__version__ = '2.1.2'
__build__ = 0x020102
__author__ = 'Roberto Rosario'
__author_email__ = 'roberto.rosario@mayan-edms.com'
__description__ = 'Free Open Source Electronic Document Management System'
__license__ = 'Apache 2.0'
__copyright__ = 'Copyright 2011-2015 Roberto Rosario'
__copyright__ = 'Copyright 2011-2016 Roberto Rosario'

View File

@@ -5,8 +5,7 @@ from django.utils.translation import ugettext_lazy as _
from common import MayanAppConfig, menu_object, menu_sidebar
from navigation import SourceColumn
from .links import link_acl_new, link_acl_delete, link_acl_permissions
from .models import AccessControlList
from .links import link_acl_create, link_acl_delete, link_acl_permissions
class ACLsApp(MayanAppConfig):
@@ -17,6 +16,8 @@ class ACLsApp(MayanAppConfig):
def ready(self):
super(ACLsApp, self).ready()
AccessControlList = self.get_model('AccessControlList')
SourceColumn(
source=AccessControlList, label=_('Permissions'),
attribute='get_permission_titles'
@@ -30,5 +31,5 @@ class ACLsApp(MayanAppConfig):
sources=(AccessControlList,)
)
menu_sidebar.bind_links(
links=(link_acl_new,), sources=('acls:acl_list',)
links=(link_acl_create,), sources=('acls:acl_list',)
)

View File

@@ -2,7 +2,7 @@ from __future__ import unicode_literals, absolute_import
import logging
from permissions.models import StoredPermission
from django.apps import apps
logger = logging.getLogger(__name__)
@@ -20,15 +20,23 @@ class ModelPermission(object):
@classmethod
def get_for_instance(cls, instance):
try:
permissions = cls._registry[type(instance)]
except KeyError:
try:
permissions = cls._registry[cls._proxies[type(instance)]]
except KeyError:
permissions = ()
StoredPermission = apps.get_model(
app_label='permissions', model_name='StoredPermission'
)
pks = [permission.stored_permission.pk for permission in permissions]
permissions = []
class_permissions = cls._registry.get(type(instance))
if class_permissions:
permissions.extend(class_permissions)
proxy = cls._proxies.get(type(instance))
if proxy:
permissions.extend(cls._registry.get(proxy))
pks = [permission.stored_permission.pk for permission in set(permissions)]
return StoredPermission.objects.filter(pk__in=pks)
@classmethod

View File

@@ -23,18 +23,20 @@ def get_kwargs_factory(variable_name):
link_acl_delete = Link(
permissions=(permission_acl_edit,), tags='dangerous', text=_('Delete'),
view='acls:acl_delete', args='resolved_object.pk'
permissions=(permission_acl_edit,), permissions_related='content_object',
tags='dangerous', text=_('Delete'), view='acls:acl_delete',
args='resolved_object.pk'
)
link_acl_list = Link(
permissions=(permission_acl_view,), text=_('ACLs'), view='acls:acl_list',
kwargs=get_kwargs_factory('resolved_object')
)
link_acl_new = Link(
link_acl_create = Link(
permissions=(permission_acl_edit,), text=_('New ACL'),
view='acls:acl_new', kwargs=get_kwargs_factory('resolved_object')
view='acls:acl_create', kwargs=get_kwargs_factory('resolved_object')
)
link_acl_permissions = Link(
permissions=(permission_acl_edit,), text=_('Permissions'),
view='acls:acl_permissions', args='resolved_object.pk'
permissions=(permission_acl_edit,), permissions_related='content_object',
text=_('Permissions'), view='acls:acl_permissions',
args='resolved_object.pk'
)

View File

@@ -1,33 +1,34 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Arabic (http://www.transifex.com/rosarior/mayan-edms/language/ar/)\n"
"Language-Team: Arabic (http://www.transifex.com/rosarior/mayan-edms/language/"
"ar/)\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ar\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "ACLs"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
msgstr "الصلاحيات"
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
@@ -36,13 +37,12 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
msgstr "Insufficient access."
#: models.py:44
msgid "Access entry"
@@ -54,53 +54,52 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr ""
msgstr "لا شيء"
#: permissions.py:7
msgid "Access control lists"
msgstr ""
msgstr "Access control lists"
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
msgstr "Edit ACLs"
#: permissions.py:13
msgid "View ACLs"
msgstr ""
msgstr "View ACLs"
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
msgid "Available permissions"
msgstr ""
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +194,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Bulgarian (http://www.transifex.com/rosarior/mayan-edms/language/bg/)\n"
"Language-Team: Bulgarian (http://www.transifex.com/rosarior/mayan-edms/"
"language/bg/)\n"
"Language: bg\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "ACLs"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
msgstr "Разрешения"
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
@@ -36,13 +36,12 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
msgstr "Недостатъчен достъп."
#: models.py:44
msgid "Access entry"
@@ -54,11 +53,11 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr ""
msgstr "Няма"
#: permissions.py:7
msgid "Access control lists"
msgstr ""
msgstr "Контролни списъци за достъп"
#: permissions.py:10
msgid "Edit ACLs"
@@ -68,39 +67,38 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
msgid "Available permissions"
msgstr ""
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +193,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,34 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/rosarior/mayan-edms/language/bs_BA/)\n"
"Language-Team: Bosnian (Bosnia and Herzegovina) (http://www.transifex.com/"
"rosarior/mayan-edms/language/bs_BA/)\n"
"Language: bs_BA\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bs_BA\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "ACLs"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
msgstr "Dozvole"
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
@@ -36,13 +37,12 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
msgstr "Nedovoljne dozvole."
#: models.py:44
msgid "Access entry"
@@ -54,53 +54,52 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr ""
msgstr "Nijedno"
#: permissions.py:7
msgid "Access control lists"
msgstr ""
msgstr "Liste kontrole pristupa (ACLs)"
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
msgstr "Izmjeniti ACLs"
#: permissions.py:13
msgid "View ACLs"
msgstr ""
msgstr "Pregledati ACLs"
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
msgid "Available permissions"
msgstr ""
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +194,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Danish (http://www.transifex.com/rosarior/mayan-edms/language/da/)\n"
"Language-Team: Danish (http://www.transifex.com/rosarior/mayan-edms/language/"
"da/)\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "ACLs"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
@@ -36,11 +36,10 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
@@ -54,7 +53,7 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr ""
msgstr "Ingen"
#: permissions.py:7
msgid "Access control lists"
@@ -68,39 +67,38 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
msgid "Available permissions"
msgstr ""
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +193,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
# Berny <berny@bernhard-marx.de>, 2015
@@ -9,26 +9,26 @@ msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 17:20+0000\n"
"Last-Translator: Berny <berny@bernhard-marx.de>\n"
"Language-Team: German (Germany) (http://www.transifex.com/rosarior/mayan-edms/language/de_DE/)\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Mathias Behrle <mathiasb@m9s.biz>\n"
"Language-Team: German (Germany) (http://www.transifex.com/rosarior/mayan-"
"edms/language/de_DE/)\n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de_DE\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr "Zugriffsberechtigungen"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr "Berechtigungen"
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr "Rolle"
@@ -37,11 +37,10 @@ msgid "Delete"
msgstr "Löschen"
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr "Neue Berechtigung"
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr "Fehlende Berechtigung"
@@ -69,39 +68,39 @@ msgstr "Zugriffsberechtigungen bearbeiten"
msgid "View ACLs"
msgstr "Zugriffsberechtigungen anzeigen"
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr "Zugriffsberechtigungen für %s"
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr "Neue Zugriffsberechtigung für %s"
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr "ACL \"%s\" löschen"
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr "Zugriffsberechtigungen für %s"
#: views.py:162
msgid "Available permissions"
msgstr "Verfügbare Berechtigungen"
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr "Erteilte Berechtigungen"
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr "Deaktivierte Berechtigungen sind von einem übergeordneten Objekt vererbt."
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Berechtigungen von Rolle \"%(role)s\" für \"%(object)s\""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
"Deaktivierte Berechtigungen sind von einem übergeordneten Objekt vererbt."
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -196,8 +195,10 @@ msgstr "Berechtigungen von Rolle \"%(role)s\" für \"%(object)s\""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2012-02-02 18:20+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: English (http://www.transifex.com/projects/p/mayan-edms/"
@@ -22,12 +22,12 @@ msgstr ""
msgid "ACLs"
msgstr "ACLs"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
#, fuzzy
msgid "Permissions"
msgstr "permissions"
#: apps.py:24 models.py:38
#: apps.py:26 models.py:38
#, fuzzy
#| msgid "Roles"
msgid "Role"
@@ -43,7 +43,7 @@ msgstr ""
msgid "New ACL"
msgstr "View ACLs"
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr "Insufficient access."
@@ -73,41 +73,41 @@ msgstr "Edit ACLs"
msgid "View ACLs"
msgstr "View ACLs"
#: views.py:61
#, fuzzy, python-format
msgid "Access control lists for: %s"
msgstr "access control lists for: %s"
#: views.py:107
#: views.py:78
#, fuzzy, python-format
msgid "New access control lists for: %s"
msgstr "access control lists for: %s"
#: views.py:132
#: views.py:109
#, fuzzy, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr "Default ACLs"
#: views.py:147
#: views.py:151
#, fuzzy, python-format
msgid "Access control lists for: %s"
msgstr "access control lists for: %s"
#: views.py:162
#, fuzzy
msgid "Available permissions"
msgstr "has permission"
#: views.py:148
#: views.py:163
#, fuzzy
msgid "Granted permissions"
msgstr "has permission"
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"

View File

@@ -6,13 +6,13 @@
# Translators:
# jmcainzos <jmcainzos@vodafone.es>, 2015
# Roberto Rosario, 2015
# Roberto Rosario, 2015
# Roberto Rosario, 2015-2016
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-05-09 01:48+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n"
"MIME-Version: 1.0\n"
@@ -25,11 +25,11 @@ msgstr ""
msgid "ACLs"
msgstr "LCAs"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr "Permisos"
#: apps.py:24 models.py:38
#: apps.py:26 models.py:38
#| msgid "Roles"
msgid "Role"
msgstr "Rol"
@@ -43,7 +43,7 @@ msgstr "Borrar"
msgid "New ACL"
msgstr "Nueva LCA"
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr "Acceso insuficiente."
@@ -71,39 +71,39 @@ msgstr "Editar LCAs"
msgid "View ACLs"
msgstr "Ver LCAs"
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr "Listas de control de acceso para: %s"
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr "Nueva lista de control de acceso para: %s"
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
msgstr "Borrar LCA: %s"
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr "Listas de control de acceso para: %s"
#: views.py:162
msgid "Available permissions"
msgstr "Permisos disponibles"
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr "Permisos otorgados"
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr "Los permisos inactivos se heredan de un objeto precedente."
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr "Permisos del rol \"%(role)s\" para \"%(object)s\""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr "Los permisos inactivos se heredan de un objeto precedente."
#~ msgid "New holder"
#~ msgstr "New holder"

View File

@@ -1,106 +1,104 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Persian (http://www.transifex.com/rosarior/mayan-edms/language/fa/)\n"
"Language-Team: Persian (http://www.transifex.com/rosarior/mayan-edms/"
"language/fa/)\n"
"Language: fa\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fa\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "ACLs"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
msgstr "مجوزها"
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
msgstr "نقش"
#: links.py:26
msgid "Delete"
msgstr ""
msgstr "حذف"
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
msgstr "دسترسی ناکافی"
#: models.py:44
msgid "Access entry"
msgstr ""
msgstr "ورودی دسترسی"
#: models.py:45
msgid "Access entries"
msgstr ""
msgstr "ورودیهای دسترسی"
#: models.py:60
msgid "None"
msgstr ""
msgstr "هیچکدام."
#: permissions.py:7
msgid "Access control lists"
msgstr ""
msgstr "لیست کنترل دسترسی ها"
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
msgstr "ویرایش دسترسی ها"
#: permissions.py:13
msgid "View ACLs"
msgstr ""
msgstr "دیدن دسترسی ها"
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr "لیست کنترل دسترسی ها برای : %s"
#: views.py:162
msgid "Available permissions"
msgstr ""
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +193,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,105 +1,104 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
# Christophe CHAUVET <christophe.chauvet@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: French (http://www.transifex.com/rosarior/mayan-edms/language/fr/)\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Christophe CHAUVET <christophe.chauvet@gmail.com>\n"
"Language-Team: French (http://www.transifex.com/rosarior/mayan-edms/language/"
"fr/)\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "Droits"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
msgstr "Permissions"
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
msgstr "Rôle"
#: links.py:26
msgid "Delete"
msgstr ""
msgstr "Suppression"
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
msgstr "Nouveau droit"
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
msgstr "droit d'accès insuffisant."
#: models.py:44
msgid "Access entry"
msgstr ""
msgstr "Entrée d'accès"
#: models.py:45
msgid "Access entries"
msgstr ""
msgstr "Entrées d'accès"
#: models.py:60
msgid "None"
msgstr ""
msgstr "Aucun"
#: permissions.py:7
msgid "Access control lists"
msgstr ""
msgstr "Liste de contrôle des accès"
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
msgstr "Editer les droits"
#: permissions.py:13
msgid "View ACLs"
msgstr ""
msgstr "voir les droits d'accès"
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
msgstr "Nouvelle liste de contrôle d'accès pour: %s"
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
msgstr "Supprimer le droit: %s"
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr "Liste des contrôle d'accès pour: %s"
#: views.py:162
msgid "Available permissions"
msgstr ""
msgstr "Permissions disponibles"
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
msgstr "Permissions autorisées"
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
msgstr "Permission du rôle \"%(role)s\" pour \"%(object)s\"@"
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr "La désactivation de permission est hérité de l'objet parent"
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +194,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Hungarian (http://www.transifex.com/rosarior/mayan-edms/language/hu/)\n"
"Language-Team: Hungarian (http://www.transifex.com/rosarior/mayan-edms/"
"language/hu/)\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "ACL-ek"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
@@ -36,11 +36,10 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
@@ -54,7 +53,7 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr ""
msgstr "Semmi"
#: permissions.py:7
msgid "Access control lists"
@@ -68,39 +67,38 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
msgid "Available permissions"
msgstr ""
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +193,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Indonesian (http://www.transifex.com/rosarior/mayan-edms/language/id/)\n"
"Language-Team: Indonesian (http://www.transifex.com/rosarior/mayan-edms/"
"language/id/)\n"
"Language: id\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: id\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
@@ -36,11 +36,10 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
@@ -68,39 +67,38 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
msgid "Available permissions"
msgstr ""
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +193,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,106 +1,104 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Italian (http://www.transifex.com/rosarior/mayan-edms/language/it/)\n"
"Language-Team: Italian (http://www.transifex.com/rosarior/mayan-edms/"
"language/it/)\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "ACLs"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
msgstr "Permessi"
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
msgstr "Ruolo"
#: links.py:26
msgid "Delete"
msgstr ""
msgstr "Cancella"
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
msgstr "Accesso insufficiente."
#: models.py:44
msgid "Access entry"
msgstr ""
msgstr "Voce di accesso"
#: models.py:45
msgid "Access entries"
msgstr ""
msgstr "Voci di accesso"
#: models.py:60
msgid "None"
msgstr ""
msgstr "Nessuna "
#: permissions.py:7
msgid "Access control lists"
msgstr ""
msgstr "Liste di controllo accessi"
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
msgstr "Modifica ACL"
#: permissions.py:13
msgid "View ACLs"
msgstr ""
msgstr "Visualizza ACL"
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr "Lista dei permessi d'accesso per: %s"
#: views.py:162
msgid "Available permissions"
msgstr ""
msgstr "Autorizzazioni disponibili "
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
msgstr "Autorizzazioni concesse "
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +193,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,105 +1,104 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
# Justin Albstbstmeijer <justin@albstmeijer.nl>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Dutch (Netherlands) (http://www.transifex.com/rosarior/mayan-edms/language/nl_NL/)\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Justin Albstbstmeijer <justin@albstmeijer.nl>\n"
"Language-Team: Dutch (Netherlands) (http://www.transifex.com/rosarior/mayan-"
"edms/language/nl_NL/)\n"
"Language: nl_NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nl_NL\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "Authorisatielijsten"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
msgstr "Permissies"
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
msgstr "Gebruikersrol"
#: links.py:26
msgid "Delete"
msgstr ""
msgstr "Verwijder"
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
msgstr "Nieuwe authorisatielijst"
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
msgstr "Permissie is ontoereikend"
#: models.py:44
msgid "Access entry"
msgstr ""
msgstr "Authorisatie invoer"
#: models.py:45
msgid "Access entries"
msgstr ""
msgstr "Authorisaties invoer"
#: models.py:60
msgid "None"
msgstr ""
msgstr "Geen"
#: permissions.py:7
msgid "Access control lists"
msgstr ""
msgstr "Authorisatielijsten"
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
msgstr "Bewerk authorisatielijsten"
#: permissions.py:13
msgid "View ACLs"
msgstr ""
msgstr "Bekijk authorisatielijsten"
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
msgstr "Nieuwe authorisatielijsten voor: %s"
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
msgstr "Verwijder authorisatielijst: %s"
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr "Authorisatielijsten voor: %s"
#: views.py:162
msgid "Available permissions"
msgstr ""
msgstr "Beschikbare permissies"
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
msgstr "Toegekende permissies"
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
msgstr "Rol \"%(role)s\" permissies voor \"%(object)s\""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr "Uitgeschakelde permissies zijn geërfd van een parent object."
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +194,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,105 +1,105 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
# Wojciech Warczakowski <w.warczakowski@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Polish (http://www.transifex.com/rosarior/mayan-edms/language/pl/)\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Wojciech Warczakowski <w.warczakowski@gmail.com>\n"
"Language-Team: Polish (http://www.transifex.com/rosarior/mayan-edms/language/"
"pl/)\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pl\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "Listy ACL"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
msgstr "Uprawnienia"
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
msgstr "Rola"
#: links.py:26
msgid "Delete"
msgstr ""
msgstr "Usuń"
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
msgstr "Nowa lista ACL"
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
msgstr "Niewystarczający dostęp."
#: models.py:44
msgid "Access entry"
msgstr ""
msgstr "Zgłoszenie dostępu"
#: models.py:45
msgid "Access entries"
msgstr ""
msgstr "Zgłoszenia dostępu"
#: models.py:60
msgid "None"
msgstr ""
msgstr "Brak"
#: permissions.py:7
msgid "Access control lists"
msgstr ""
msgstr "Listy ACL"
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
msgstr "Edytuj listy ACL"
#: permissions.py:13
msgid "View ACLs"
msgstr ""
msgstr "Przeglądaj listy ACL"
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
msgstr "Nowe listy ACL dla: %s"
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
msgstr "Usuń listę ACL: %s"
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr "Listy ACL dla: %s"
#: views.py:162
msgid "Available permissions"
msgstr ""
msgstr "Dostępne uprawnienia"
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
msgstr "Przyznane uprawnienia"
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
msgstr "Uprawnienia roli \"%(role)s\" dla obiektu \"%(object)s\""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr "Domyślne uprawnienia są dziedziczone z obiektu nadrzędnego."
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +195,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,48 +1,47 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Portuguese (http://www.transifex.com/rosarior/mayan-edms/language/pt/)\n"
"Language-Team: Portuguese (http://www.transifex.com/rosarior/mayan-edms/"
"language/pt/)\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "ACL's"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
msgstr "Permissões"
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
#: links.py:26
msgid "Delete"
msgstr ""
msgstr "Eliminar"
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
msgstr "Acesso insuficiente."
#: models.py:44
msgid "Access entry"
@@ -54,53 +53,52 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr ""
msgstr "Nenhum"
#: permissions.py:7
msgid "Access control lists"
msgstr ""
msgstr "Listas de controlo de acesso"
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
msgstr "Editar ACL's"
#: permissions.py:13
msgid "View ACLs"
msgstr ""
msgstr "Ver ACL's"
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
msgid "Available permissions"
msgstr ""
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +193,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,106 +1,104 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/rosarior/mayan-edms/language/pt_BR/)\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/rosarior/mayan-"
"edms/language/pt_BR/)\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "ACLs"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
msgstr "Permissões"
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
msgstr "Regras"
#: links.py:26
msgid "Delete"
msgstr ""
msgstr "Excluir"
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
msgstr "Acesso insuficiente."
#: models.py:44
msgid "Access entry"
msgstr ""
msgstr "Acesso entrada"
#: models.py:45
msgid "Access entries"
msgstr ""
msgstr "Entradas de acesso"
#: models.py:60
msgid "None"
msgstr ""
msgstr "Nenhum"
#: permissions.py:7
msgid "Access control lists"
msgstr ""
msgstr "Listas de controle de acesso"
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
msgstr "Editar ACLs"
#: permissions.py:13
msgid "View ACLs"
msgstr ""
msgstr "Visualizar ACLs"
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr "listas de controle de acesso para: %s"
#: views.py:162
msgid "Available permissions"
msgstr ""
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +193,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,34 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Romanian (Romania) (http://www.transifex.com/rosarior/mayan-edms/language/ro_RO/)\n"
"Language-Team: Romanian (Romania) (http://www.transifex.com/rosarior/mayan-"
"edms/language/ro_RO/)\n"
"Language: ro_RO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ro_RO\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
"2:1));\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "ACL-uri"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
msgstr "Permisiuni"
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
@@ -36,13 +37,12 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
msgstr "Accesul insuficient."
#: models.py:44
msgid "Access entry"
@@ -54,53 +54,52 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr ""
msgstr "Nici unul"
#: permissions.py:7
msgid "Access control lists"
msgstr ""
msgstr "Lista de control acces"
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
msgstr "Editați ACL-uri"
#: permissions.py:13
msgid "View ACLs"
msgstr ""
msgstr "Vezi ACL-uri"
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
msgid "Available permissions"
msgstr ""
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +194,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,35 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Russian (http://www.transifex.com/rosarior/mayan-edms/language/ru/)\n"
"Language-Team: Russian (http://www.transifex.com/rosarior/mayan-edms/"
"language/ru/)\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
"%100>=11 && n%100<=14)? 2 : 3);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "ACLs"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
msgstr "Разрешения"
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
@@ -36,13 +38,12 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
msgstr "Недостаточный доступ."
#: models.py:44
msgid "Access entry"
@@ -54,53 +55,52 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr ""
msgstr "Ни один"
#: permissions.py:7
msgid "Access control lists"
msgstr ""
msgstr "Списки контроля доступа"
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
msgstr "Редактировать списки ACL"
#: permissions.py:13
msgid "View ACLs"
msgstr ""
msgstr "Просмотр списков ACL"
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
msgid "Available permissions"
msgstr ""
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +195,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,34 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Slovenian (Slovenia) (http://www.transifex.com/rosarior/mayan-edms/language/sl_SI/)\n"
"Language-Team: Slovenian (Slovenia) (http://www.transifex.com/rosarior/mayan-"
"edms/language/sl_SI/)\n"
"Language: sl_SI\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sl_SI\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
"%100==4 ? 2 : 3);\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
@@ -36,11 +37,10 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
@@ -54,7 +54,7 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr ""
msgstr "Brez"
#: permissions.py:7
msgid "Access control lists"
@@ -68,39 +68,38 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
msgid "Available permissions"
msgstr ""
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +194,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/rosarior/mayan-edms/language/vi_VN/)\n"
"Language-Team: Vietnamese (Viet Nam) (http://www.transifex.com/rosarior/"
"mayan-edms/language/vi_VN/)\n"
"Language: vi_VN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: vi_VN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "ACLs"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
@@ -36,11 +36,10 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
@@ -54,7 +53,7 @@ msgstr ""
#: models.py:60
msgid "None"
msgstr ""
msgstr "None"
#: permissions.py:7
msgid "Access control lists"
@@ -68,39 +67,38 @@ msgstr ""
msgid "View ACLs"
msgstr ""
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
msgid "Available permissions"
msgstr ""
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +193,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -1,33 +1,33 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Mayan EDMS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-24 16:24-0400\n"
"PO-Revision-Date: 2015-09-24 05:15+0000\n"
"POT-Creation-Date: 2016-04-27 14:09-0400\n"
"PO-Revision-Date: 2016-03-21 21:03+0000\n"
"Last-Translator: Roberto Rosario\n"
"Language-Team: Chinese (China) (http://www.transifex.com/rosarior/mayan-edms/language/zh_CN/)\n"
"Language-Team: Chinese (China) (http://www.transifex.com/rosarior/mayan-edms/"
"language/zh_CN/)\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: apps.py:14 links.py:30
msgid "ACLs"
msgstr ""
msgstr "访问控制列表"
#: apps.py:20 links.py:38 models.py:36
#: apps.py:22 links.py:38 models.py:36
msgid "Permissions"
msgstr ""
msgstr "权限"
#: apps.py:24 models.py:38
#| msgid "Roles"
#: apps.py:26 models.py:38
msgid "Role"
msgstr ""
@@ -36,71 +36,69 @@ msgid "Delete"
msgstr ""
#: links.py:34
#| msgid "View ACLs"
msgid "New ACL"
msgstr ""
#: managers.py:72
#: managers.py:85
msgid "Insufficient access."
msgstr ""
msgstr "权限不足"
#: models.py:44
msgid "Access entry"
msgstr ""
msgstr "访问入口"
#: models.py:45
msgid "Access entries"
msgstr ""
msgstr "多个访问入口"
#: models.py:60
msgid "None"
msgstr ""
msgstr ""
#: permissions.py:7
msgid "Access control lists"
msgstr ""
msgstr "访问控制列表"
#: permissions.py:10
msgid "Edit ACLs"
msgstr ""
msgstr "编辑访问控制列表"
#: permissions.py:13
msgid "View ACLs"
msgstr ""
msgstr "查看访问控制列表"
#: views.py:61
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:107
#: views.py:78
#, python-format
msgid "New access control lists for: %s"
msgstr ""
#: views.py:132
#: views.py:109
#, python-format
#| msgid "Default ACLs"
msgid "Delete ACL: %s"
msgstr ""
#: views.py:147
#: views.py:151
#, python-format
msgid "Access control lists for: %s"
msgstr ""
#: views.py:162
msgid "Available permissions"
msgstr ""
#: views.py:148
#: views.py:163
msgid "Granted permissions"
msgstr ""
#: views.py:187
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#: views.py:218
#: views.py:222
#, python-format
msgid "Role \"%(role)s\" permission's for \"%(object)s\""
msgstr ""
#: views.py:242
msgid "Disabled permissions are inherited from a parent object."
msgstr ""
#~ msgid "New holder"
#~ msgstr "New holder"
@@ -195,8 +193,10 @@ msgstr ""
#~ msgid "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgstr "Permission \"%(permission)s\" revoked of %(actor)s for %(object)s."
#~ msgid "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgstr ""
#~ "%(actor)s, didn't had the permission \"%(permission)s\" for %(object)s."
#~ msgid "Add new holder for: %s"
#~ msgstr "add new holder for: %s"

View File

@@ -8,6 +8,7 @@ from django.db import models
from django.db.models import Q
from django.utils.translation import ugettext
from common.utils import return_attrib
from permissions.models import StoredPermission
from .classes import ModelPermission
@@ -54,10 +55,11 @@ class AccessControlListManager(models.Manager):
permission.stored_permission for permission in permissions
]
except TypeError:
# Not a list of permissions, just one
stored_permissions = [permissions.stored_permission]
if related:
obj = getattr(obj, related)
obj = return_attrib(obj, related)
try:
parent_accessor = ModelPermission.get_inheritance(obj._meta.model)
@@ -72,15 +74,14 @@ class AccessControlListManager(models.Manager):
pass
user_roles = []
for group in user.groups.all():
for group in user.organization_groups.all():
for role in group.roles.all():
if set(stored_permissions).intersection(set(self.get_inherited_permissions(role=role, obj=obj))):
return True
user_roles.append(role)
# TODO: possible .exists() optimization
if not self.filter(content_type=ContentType.objects.get_for_model(obj), object_id=obj.pk, permissions__in=stored_permissions, role__in=user_roles):
if not self.model.on_organization.filter(content_type=ContentType.objects.get_for_model(obj), object_id=obj.pk, permissions__in=stored_permissions, role__in=user_roles).exists():
raise PermissionDenied(ugettext('Insufficient access.'))
def filter_by_access(self, permission, user, queryset):
@@ -88,7 +89,7 @@ class AccessControlListManager(models.Manager):
return queryset
user_roles = []
for group in user.groups.all():
for group in user.organization_groups.all():
for role in group.roles.all():
user_roles.append(role)

View File

@@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
import organizations.shortcuts
class Migration(migrations.Migration):
dependencies = [
('organizations', '0002_add_data_default_organization'),
('acls', '0002_auto_20150703_0513'),
]
operations = [
migrations.AddField(
model_name='accesscontrollist',
name='organization',
field=models.ForeignKey(default=organizations.shortcuts.get_current_organization, to='organizations.Organization'),
),
]

View File

@@ -2,12 +2,15 @@ from __future__ import absolute_import, unicode_literals
import logging
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _
from organizations.models import Organization
from organizations.managers import CurrentOrganizationManager
from organizations.shortcuts import get_current_organization
from permissions.models import Role, StoredPermission
from .managers import AccessControlListManager
@@ -26,10 +29,13 @@ class AccessControlList(models.Model):
related_name='object_content_type'
)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey(
content_object = GenericForeignKey(
ct_field='content_type',
fk_field='object_id',
)
organization = models.ForeignKey(
Organization, default=get_current_organization
)
# TODO: limit choices to the permissions valid for the content_object
permissions = models.ManyToManyField(
StoredPermission, blank=True, related_name='acls',
@@ -38,6 +44,7 @@ class AccessControlList(models.Model):
role = models.ForeignKey(Role, related_name='acls', verbose_name=_('Role'))
objects = AccessControlListManager()
on_organization = CurrentOrganizationManager()
class Meta:
unique_together = ('content_type', 'object_id', 'role')
@@ -45,7 +52,11 @@ class AccessControlList(models.Model):
verbose_name_plural = _('Access entries')
def __str__(self):
return '{} <=> {}'.format(self.content_object, self.role)
return _('Permissions "%(permissions)s" to role "%(role)s" for "%(object)s"') % {
'permissions': self.get_permission_titles(),
'object': self.content_object,
'role': self.role
}
def get_inherited_permissions(self):
return AccessControlList.objects.get_inherited_permissions(

View File

@@ -0,0 +1,103 @@
from __future__ import unicode_literals
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
from documents.tests.test_views import GenericDocumentViewTestCase
from user_management.tests.literals import (
TEST_USER_PASSWORD, TEST_USER_USERNAME
)
from ..links import (
link_acl_delete, link_acl_list, link_acl_create, link_acl_permissions
)
from ..models import AccessControlList
from ..permissions import permission_acl_edit, permission_acl_view
class ACLsLinksTestCase(GenericDocumentViewTestCase):
def test_document_acl_create_link(self):
acl = AccessControlList.objects.create(
content_object=self.document, role=self.role
)
acl.permissions.add(permission_acl_edit.stored_permission)
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
self.add_test_view(test_object=self.document)
context = self.get_test_view()
resolved_link = link_acl_create.resolve(context=context)
self.assertNotEqual(resolved_link, None)
content_type = ContentType.objects.get_for_model(self.document)
kwargs = {
'app_label': content_type.app_label,
'model': content_type.model,
'object_id': self.document.pk
}
self.assertEqual(
resolved_link.url, reverse('acls:acl_create', kwargs=kwargs)
)
def test_document_acl_delete_link(self):
acl = AccessControlList.objects.create(
content_object=self.document, role=self.role
)
acl.permissions.add(permission_acl_edit.stored_permission)
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
self.add_test_view(test_object=acl)
context = self.get_test_view()
resolved_link = link_acl_delete.resolve(context=context)
self.assertNotEqual(resolved_link, None)
self.assertEqual(
resolved_link.url, reverse('acls:acl_delete', args=(acl.pk,))
)
def test_document_acl_edit_link(self):
acl = AccessControlList.objects.create(
content_object=self.document, role=self.role
)
acl.permissions.add(permission_acl_edit.stored_permission)
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
self.add_test_view(test_object=acl)
context = self.get_test_view()
resolved_link = link_acl_permissions.resolve(context=context)
self.assertNotEqual(resolved_link, None)
self.assertEqual(
resolved_link.url, reverse('acls:acl_permissions', args=(acl.pk,))
)
def test_document_acl_list_link(self):
acl = AccessControlList.objects.create(
content_object=self.document, role=self.role
)
acl.permissions.add(permission_acl_view.stored_permission)
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
self.add_test_view(test_object=self.document)
context = self.get_test_view()
resolved_link = link_acl_list.resolve(context=context)
self.assertNotEqual(resolved_link, None)
content_type = ContentType.objects.get_for_model(self.document)
kwargs = {
'app_label': content_type.app_label,
'model': content_type.model,
'object_id': self.document.pk
}
self.assertEqual(
resolved_link.url, reverse('acls:acl_list', kwargs=kwargs)
)

View File

@@ -1,17 +1,17 @@
from __future__ import absolute_import, unicode_literals
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from django.core.exceptions import PermissionDenied
from django.core.files import File
from django.test import TestCase, override_settings
from documents.models import Document, DocumentType
from documents.permissions import permission_document_view
from documents.tests import TEST_SMALL_DOCUMENT_PATH, TEST_DOCUMENT_TYPE
from organizations.tests.base import OrganizationTestCase
from permissions.classes import Permission
from permissions.models import Role
from permissions.tests.literals import TEST_ROLE_LABEL
from user_management.models import MayanGroup
from user_management.tests.literals import TEST_USER_USERNAME, TEST_GROUP
from ..models import AccessControlList
@@ -20,46 +20,50 @@ TEST_DOCUMENT_TYPE_2 = 'test document type 2'
@override_settings(OCR_AUTO_OCR=False)
class PermissionTestCase(TestCase):
class PermissionTestCase(OrganizationTestCase):
def setUp(self):
self.document_type_1 = DocumentType.objects.create(
super(PermissionTestCase, self).setUp()
self.document_type_1 = DocumentType.on_organization.create(
label=TEST_DOCUMENT_TYPE
)
self.document_type_2 = DocumentType.objects.create(
self.document_type_2 = DocumentType.on_organization.create(
label=TEST_DOCUMENT_TYPE_2
)
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
self.document_1 = self.document_type_1.new_document(
file_object=File(file_object)
file_object=file_object
)
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
self.document_2 = self.document_type_1.new_document(
file_object=File(file_object)
file_object=file_object
)
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
self.document_3 = self.document_type_2.new_document(
file_object=File(file_object)
file_object=file_object
)
self.user = get_user_model().objects.create(
self.user = get_user_model().on_organization.create(
username=TEST_USER_USERNAME
)
self.group = Group.objects.create(name=TEST_GROUP)
self.role = Role.objects.create(label=TEST_ROLE_LABEL)
self.group = MayanGroup.on_organization.create(name=TEST_GROUP)
self.role = Role.on_organization.create(label=TEST_ROLE_LABEL)
self.group.user_set.add(self.user)
self.role.groups.add(self.group)
self.group.users.add(self.user)
self.role.organization_groups.add(self.group)
Permission.invalidate_cache()
def tearDown(self):
for document_type in DocumentType.objects.all():
for document_type in DocumentType.on_organization.all():
document_type.delete()
super(PermissionTestCase, self).tearDown()
def test_check_access_without_permissions(self):
with self.assertRaises(PermissionDenied):
AccessControlList.objects.check_access(
@@ -76,7 +80,7 @@ class PermissionTestCase(TestCase):
)
def test_check_access_with_acl(self):
acl = AccessControlList.objects.create(
acl = AccessControlList.on_organization.create(
content_object=self.document_1, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)
@@ -92,7 +96,7 @@ class PermissionTestCase(TestCase):
def test_filtering_with_permissions(self):
self.role.permissions.add(permission_document_view.stored_permission)
acl = AccessControlList.objects.create(
acl = AccessControlList.on_organization.create(
content_object=self.document_1, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)
@@ -105,7 +109,7 @@ class PermissionTestCase(TestCase):
)
def test_check_access_with_inherited_acl(self):
acl = AccessControlList.objects.create(
acl = AccessControlList.on_organization.create(
content_object=self.document_type_1, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)
@@ -119,12 +123,12 @@ class PermissionTestCase(TestCase):
self.fail('PermissionDenied exception was not expected.')
def test_check_access_with_inherited_acl_and_local_acl(self):
acl = AccessControlList.objects.create(
acl = AccessControlList.on_organization.create(
content_object=self.document_type_1, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)
acl = AccessControlList.objects.create(
acl = AccessControlList.on_organization.create(
content_object=self.document_3, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)
@@ -140,7 +144,7 @@ class PermissionTestCase(TestCase):
def test_filtering_with_inherited_permissions(self):
self.role.permissions.add(permission_document_view.stored_permission)
acl = AccessControlList.objects.create(
acl = AccessControlList.on_organization.create(
content_object=self.document_type_1, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)
@@ -156,12 +160,12 @@ class PermissionTestCase(TestCase):
def test_filtering_with_inherited_permissions_and_local_acl(self):
self.role.permissions.add(permission_document_view.stored_permission)
acl = AccessControlList.objects.create(
acl = AccessControlList.on_organization.create(
content_object=self.document_type_1, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)
acl = AccessControlList.objects.create(
acl = AccessControlList.on_organization.create(
content_object=self.document_3, role=self.role
)
acl.permissions.add(permission_document_view.stored_permission)

View File

@@ -0,0 +1,111 @@
from __future__ import absolute_import, unicode_literals
from django.contrib.contenttypes.models import ContentType
from documents.tests.test_views import GenericDocumentViewTestCase
from user_management.tests import (
TEST_USER_USERNAME, TEST_USER_PASSWORD
)
from ..models import AccessControlList
from ..permissions import permission_acl_edit
class AccessControlListViewTestCase(GenericDocumentViewTestCase):
def setUp(self):
super(AccessControlListViewTestCase, self).setUp()
content_type = ContentType.objects.get_for_model(self.document)
self.view_arguments = {
'app_label': content_type.app_label,
'model': content_type.model,
'object_id': self.document.pk
}
def test_acl_create_view_no_permission(self):
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
response = self.post(
viewname='acls:acl_create', kwargs=self.view_arguments, data={
'role': self.role.pk
}
)
self.assertEquals(response.status_code, 403)
self.assertEqual(AccessControlList.on_organization.count(), 0)
def test_acl_create_view_with_permission(self):
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
self.role.permissions.add(
permission_acl_edit.stored_permission
)
response = self.post(
viewname='acls:acl_create', kwargs=self.view_arguments, data={
'role': self.role.pk
}, follow=True
)
self.assertContains(response, text='created', status_code=200)
self.assertEqual(AccessControlList.on_organization.count(), 1)
def test_acl_create_duplicate_view_with_permission(self):
"""
Test creating a duplicate ACL entry: same object & role
Result: Should redirect to existing ACL for object + role combination
"""
acl = AccessControlList.on_organization.create(
content_object=self.document, role=self.role
)
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
self.role.permissions.add(
permission_acl_edit.stored_permission
)
response = self.post(
viewname='acls:acl_create', kwargs=self.view_arguments, data={
'role': self.role.pk
}, follow=True
)
self.assertContains(
response, text='vailable permissions', status_code=200
)
self.assertEqual(AccessControlList.on_organization.count(), 1)
self.assertEqual(AccessControlList.on_organization.first().pk, acl.pk)
def test_orphan_acl_create_view_with_permission(self):
"""
Test creating an ACL entry for an object with no model permissions.
Result: Should display a blank permissions list (not optgroup)
"""
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
self.role.permissions.add(
permission_acl_edit.stored_permission
)
recent_entry = self.document.add_as_recent_document_for_user(self.user)
content_type = ContentType.objects.get_for_model(recent_entry)
view_arguments = {
'app_label': content_type.app_label,
'model': content_type.model,
'object_id': recent_entry.pk
}
response = self.post(
viewname='acls:acl_create', kwargs=view_arguments, data={
'role': self.role.pk
}, follow=True
)
self.assertNotContains(response, text='optgroup', status_code=200)
self.assertEqual(AccessControlList.on_organization.count(), 1)

View File

@@ -9,8 +9,8 @@ from .views import (
urlpatterns = patterns(
'acls.views',
url(
r'^(?P<app_label>[-\w]+)/(?P<model>[-\w]+)/(?P<object_id>\d+)/new/$',
ACLCreateView.as_view(), name='acl_new'
r'^(?P<app_label>[-\w]+)/(?P<model>[-\w]+)/(?P<object_id>\d+)/create/$',
ACLCreateView.as_view(), name='acl_create'
),
url(
r'^(?P<app_label>[-\w]+)/(?P<model>[-\w]+)/(?P<object_id>\d+)/list/$',

View File

@@ -6,7 +6,7 @@ import logging
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse
from django.http import Http404
from django.http import Http404, HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.utils.translation import ugettext_lazy as _
@@ -24,7 +24,9 @@ from .permissions import permission_acl_edit, permission_acl_view
logger = logging.getLogger(__name__)
class ACLListView(SingleObjectListView):
class ACLCreateView(SingleObjectCreateView):
fields = ('role',)
def dispatch(self, request, *args, **kwargs):
self.content_type = get_object_or_404(
ContentType, app_label=self.kwargs['app_label'],
@@ -38,47 +40,6 @@ class ACLListView(SingleObjectListView):
except self.content_type.model_class().DoesNotExist:
raise Http404
try:
Permission.check_permissions(
request.user, permissions=(permission_acl_view,)
)
except PermissionDenied:
AccessControlList.objects.check_access(
permission_acl_view, request.user, self.content_object
)
return super(ACLListView, self).dispatch(request, *args, **kwargs)
def get_queryset(self):
return AccessControlList.objects.filter(
content_type=self.content_type, object_id=self.content_object.pk
)
def get_extra_context(self):
return {
'hide_object': True,
'object': self.content_object,
'title': _('Access control lists for: %s' % self.content_object),
}
class ACLCreateView(SingleObjectCreateView):
fields = ('role',)
model = AccessControlList
def dispatch(self, request, *args, **kwargs):
content_type = get_object_or_404(
ContentType, app_label=self.kwargs['app_label'],
model=self.kwargs['model']
)
try:
self.content_object = content_type.get_object_for_this_type(
pk=self.kwargs['object_id']
)
except content_type.model_class().DoesNotExist:
raise Http404
try:
Permission.check_permissions(
request.user, permissions=(permission_acl_edit,)
@@ -91,14 +52,18 @@ class ACLCreateView(SingleObjectCreateView):
return super(ACLCreateView, self).dispatch(request, *args, **kwargs)
def form_valid(self, form):
self.instance = form.save(commit=False)
self.instance.content_object = self.content_object
self.instance.save()
return super(ACLCreateView, self).form_valid(form)
def get_success_url(self):
return reverse('acls:acl_permissions', args=(self.instance.pk,))
try:
acl = AccessControlList.on_organization.get(
content_type=self.content_type,
object_id=self.content_object.pk,
role=form.cleaned_data['role']
)
except AccessControlList.DoesNotExist:
return super(ACLCreateView, self).form_valid(form)
else:
return HttpResponseRedirect(
reverse('acls:acl_permissions', args=(acl.pk,))
)
def get_extra_context(self):
return {
@@ -108,10 +73,22 @@ class ACLCreateView(SingleObjectCreateView):
) % self.content_object
}
def get_instance_extra_data(self):
return {
'content_object': self.content_object
}
def get_queryset(self):
return AccessControlList.on_organization.all()
def get_success_url(self):
if self.object.pk:
return reverse('acls:acl_permissions', args=(self.object.pk,))
else:
return super(ACLCreateView, self).get_success_url()
class ACLDeleteView(SingleObjectDeleteView):
model = AccessControlList
def dispatch(self, request, *args, **kwargs):
acl = get_object_or_404(AccessControlList, pk=self.kwargs['pk'])
@@ -141,6 +118,47 @@ class ACLDeleteView(SingleObjectDeleteView):
)
)
def get_queryset(self):
return AccessControlList.on_organization.all()
class ACLListView(SingleObjectListView):
def dispatch(self, request, *args, **kwargs):
self.content_type = get_object_or_404(
ContentType, app_label=self.kwargs['app_label'],
model=self.kwargs['model']
)
try:
self.content_object = self.content_type.get_object_for_this_type(
pk=self.kwargs['object_id']
)
except self.content_type.model_class().DoesNotExist:
raise Http404
try:
Permission.check_permissions(
request.user, permissions=(permission_acl_view,)
)
except PermissionDenied:
AccessControlList.objects.check_access(
permission_acl_view, request.user, self.content_object
)
return super(ACLListView, self).dispatch(request, *args, **kwargs)
def get_extra_context(self):
return {
'hide_object': True,
'object': self.content_object,
'title': _('Access control lists for: %s' % self.content_object),
}
def get_queryset(self):
return AccessControlList.on_organization.filter(
content_type=self.content_type, object_id=self.content_object.pk
)
class ACLPermissionsView(AssignRemoveView):
grouped = True
@@ -181,17 +199,6 @@ class ACLPermissionsView(AssignRemoveView):
ACLPermissionsView, self
).dispatch(request, *args, **kwargs)
def get_right_list_help_text(self):
if self.get_object().get_inherited_permissions():
return _(
'Disabled permissions are inherited from a parent object.'
)
return None
def get_object(self):
return get_object_or_404(AccessControlList, pk=self.kwargs['pk'])
def get_available_list(self):
return ModelPermission.get_for_instance(
instance=self.get_object().content_object
@@ -229,12 +236,23 @@ class ACLPermissionsView(AssignRemoveView):
merged_pks = self.get_object().permissions.values_list('pk', flat=True) | self.get_object().get_inherited_permissions().values_list('pk', flat=True)
return StoredPermission.objects.filter(pk__in=merged_pks)
def get_object(self):
return get_object_or_404(AccessControlList, pk=self.kwargs['pk'])
def get_right_list_help_text(self):
if self.get_object().get_inherited_permissions():
return _(
'Disabled permissions are inherited from a parent object.'
)
return None
def left_list(self):
return ACLPermissionsView.generate_choices(self.get_available_list())
def right_list(self):
return ACLPermissionsView.generate_choices(self.get_granted_list())
def remove(self, item):
permission = get_object_or_404(StoredPermission, pk=item)
self.get_object().permissions.remove(permission)
def right_list(self):
return ACLPermissionsView.generate_choices(self.get_granted_list())

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