From 473fc09e1afa225db769aaf4ddca234439b7014f Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 18 Mar 2016 00:23:43 -0400 Subject: [PATCH 01/36] .index is a function not an attribute, add missing parentheses. --- mayan/apps/document_indexing/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mayan/apps/document_indexing/views.py b/mayan/apps/document_indexing/views.py index c21fe2741c..4f1867a889 100644 --- a/mayan/apps/document_indexing/views.py +++ b/mayan/apps/document_indexing/views.py @@ -249,7 +249,7 @@ class IndexInstanceNodeView(DocumentListView, SingleObjectListView): except PermissionDenied: AccessControlList.objects.check_access( permission_document_indexing_view, - request.user, self.index_instance.index + request.user, self.index_instance.index() ) if self.index_instance: From d934b2ee1e45d6068a571bc33fb9484dcb942834 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sat, 7 May 2016 20:28:34 -0400 Subject: [PATCH 02/36] Now that autoadmin has an initial migration don't error out on existing tables. --- mayan/apps/common/management/commands/performupgrade.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mayan/apps/common/management/commands/performupgrade.py b/mayan/apps/common/management/commands/performupgrade.py index 91713c3885..0060ace44a 100644 --- a/mayan/apps/common/management/commands/performupgrade.py +++ b/mayan/apps/common/management/commands/performupgrade.py @@ -9,7 +9,7 @@ class Command(management.BaseCommand): help = 'Performs the required steps after a version upgrade.' def handle(self, *args, **options): - management.call_command('migrate', interactive=False) + management.call_command('migrate', fake=True, interactive=False) management.call_command('purgeperiodictasks', interactive=False) perform_upgrade.send(sender=self) post_upgrade.send(sender=self) From 2a5264bc2c2a8e2d495a372ffda4609f21af4819 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sun, 8 May 2016 01:13:54 -0400 Subject: [PATCH 03/36] Fix view context document resolution for the document smart link list view. Fixes GitLab issue #266. Thanks to Baptiste GAILLET @bat79a for the find. --- mayan/apps/linking/apps.py | 2 +- mayan/apps/linking/tests/literals.py | 5 ++ mayan/apps/linking/tests/test_models.py | 3 +- mayan/apps/linking/tests/test_views.py | 67 +++++++++++++++++++++++-- 4 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 mayan/apps/linking/tests/literals.py diff --git a/mayan/apps/linking/apps.py b/mayan/apps/linking/apps.py index e8d99160fc..54250c85e4 100644 --- a/mayan/apps/linking/apps.py +++ b/mayan/apps/linking/apps.py @@ -54,7 +54,7 @@ class LinkingApp(MayanAppConfig): SourceColumn( source=ResolvedSmartLink, label=_('Label'), func=lambda context: context['object'].get_dynamic_label( - context['resolved_object'] + context['document'] ) ) diff --git a/mayan/apps/linking/tests/literals.py b/mayan/apps/linking/tests/literals.py new file mode 100644 index 0000000000..279ea65564 --- /dev/null +++ b/mayan/apps/linking/tests/literals.py @@ -0,0 +1,5 @@ +from __future__ import unicode_literals + +TEST_SMART_LINK_DYNAMIC_LABEL = '{{ document.label }}' +TEST_SMART_LINK_EDITED_LABEL = 'test edited label' +TEST_SMART_LINK_LABEL = 'test label' diff --git a/mayan/apps/linking/tests/test_models.py b/mayan/apps/linking/tests/test_models.py index 41fba66f49..3d79855654 100644 --- a/mayan/apps/linking/tests/test_models.py +++ b/mayan/apps/linking/tests/test_models.py @@ -13,8 +13,7 @@ from user_management.tests.literals import ( from ..models import SmartLink -TEST_SMART_LINK_LABEL = 'test label' -TEST_SMART_LINK_DYNAMIC_LABEL = '{{ document.label }}' +from .literals import TEST_SMART_LINK_LABEL, TEST_SMART_LINK_DYNAMIC_LABEL @override_settings(OCR_AUTO_OCR=False) diff --git a/mayan/apps/linking/tests/test_views.py b/mayan/apps/linking/tests/test_views.py index 039e520a91..317e2450b5 100644 --- a/mayan/apps/linking/tests/test_views.py +++ b/mayan/apps/linking/tests/test_views.py @@ -1,5 +1,6 @@ from __future__ import absolute_import, unicode_literals +from documents.permissions import permission_document_view from documents.tests.test_views import GenericDocumentViewTestCase from user_management.tests import ( TEST_USER_USERNAME, TEST_USER_PASSWORD @@ -8,11 +9,13 @@ from user_management.tests import ( from ..models import SmartLink from ..permissions import ( permission_smart_link_create, permission_smart_link_delete, - permission_smart_link_edit + permission_smart_link_edit, permission_smart_link_view ) -TEST_SMART_LINK_LABEL = 'test label' -TEST_SMART_LINK_EDITED_LABEL = 'test edited label' +from .literals import ( + TEST_SMART_LINK_DYNAMIC_LABEL, TEST_SMART_LINK_EDITED_LABEL, + TEST_SMART_LINK_LABEL +) class SmartLinkViewTestCase(GenericDocumentViewTestCase): @@ -105,3 +108,61 @@ class SmartLinkViewTestCase(GenericDocumentViewTestCase): smart_link = SmartLink.objects.get(pk=smart_link.pk) self.assertContains(response, text='update', status_code=200) self.assertEqual(smart_link.label, TEST_SMART_LINK_EDITED_LABEL) + + def setup_smart_links(self): + smart_link = SmartLink.objects.create( + label=TEST_SMART_LINK_LABEL, + dynamic_label=TEST_SMART_LINK_DYNAMIC_LABEL + ) + smart_link.document_types.add(self.document_type) + + smart_link_2 = SmartLink.objects.create( + label=TEST_SMART_LINK_LABEL, + dynamic_label=TEST_SMART_LINK_DYNAMIC_LABEL + ) + smart_link_2.document_types.add(self.document_type) + + def test_document_smart_link_list_view_no_permission(self): + self.setup_smart_links() + + self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD) + + self.role.permissions.add( + permission_document_view.stored_permission + ) + + response = self.get( + 'linking:smart_link_instances_for_document', + args=(self.document.pk,) + ) + # Text must appear 2 times, only for the windows title and template + # heading. The two smart links are not shown. + + self.assertContains( + response, text=self.document.label, count=2, status_code=200 + ) + + def test_document_smart_link_list_view_with_permission(self): + self.setup_smart_links() + + self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD) + + self.role.permissions.add( + permission_smart_link_view.stored_permission + ) + + self.role.permissions.add( + permission_document_view.stored_permission + ) + + response = self.get( + 'linking:smart_link_instances_for_document', + args=(self.document.pk,) + ) + + # Text must appear 4 times: 2 for the windows title and template + # heading, plus 2 for the test. + + self.assertContains( + response, text=self.document.label, count=4, status_code=200 + ) From ddc7dc39b0117192510b1d80e77d106651395aa2 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sun, 8 May 2016 01:31:00 -0400 Subject: [PATCH 04/36] Update to use Django 1.8.13 --- requirements/common.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/common.txt b/requirements/common.txt index 40e59101da..d55044d5a9 100644 --- a/requirements/common.txt +++ b/requirements/common.txt @@ -1,2 +1,2 @@ -r base.txt -Django==1.8.11 +Django==1.8.13 From 8075bfd0bc8dfa8b4a4e069391588f7fe87a4ec0 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sun, 8 May 2016 21:57:23 -0400 Subject: [PATCH 05/36] Update Spanish translation. --- .../apps/acls/locale/es/LC_MESSAGES/django.mo | Bin 1560 -> 1606 bytes .../apps/acls/locale/es/LC_MESSAGES/django.po | 22 ++-- .../locale/es/LC_MESSAGES/django.mo | Bin 3866 -> 3924 bytes .../locale/es/LC_MESSAGES/django.po | 28 ++--- .../common/locale/es/LC_MESSAGES/django.mo | Bin 3267 -> 3518 bytes .../common/locale/es/LC_MESSAGES/django.po | 53 ++++---- .../converter/locale/es/LC_MESSAGES/django.mo | Bin 1766 -> 2925 bytes .../converter/locale/es/LC_MESSAGES/django.po | 53 ++++---- .../locale/es/LC_MESSAGES/django.mo | Bin 2758 -> 4125 bytes .../locale/es/LC_MESSAGES/django.po | 49 ++++---- .../locale/es/LC_MESSAGES/django.mo | Bin 3700 -> 3949 bytes .../locale/es/LC_MESSAGES/django.po | 62 +++++----- .../locale/es/LC_MESSAGES/django.mo | Bin 1554 -> 4333 bytes .../locale/es/LC_MESSAGES/django.po | 78 ++++++------ .../locale/es/LC_MESSAGES/django.mo | Bin 3661 -> 4557 bytes .../locale/es/LC_MESSAGES/django.po | 32 +++-- .../documents/locale/es/LC_MESSAGES/django.mo | Bin 13236 -> 13280 bytes .../documents/locale/es/LC_MESSAGES/django.po | 4 +- .../folders/locale/es/LC_MESSAGES/django.mo | Bin 2624 -> 3023 bytes .../folders/locale/es/LC_MESSAGES/django.po | 52 ++++---- .../linking/locale/es/LC_MESSAGES/django.mo | Bin 3962 -> 5055 bytes .../linking/locale/es/LC_MESSAGES/django.po | 59 +++++---- .../mailer/locale/es/LC_MESSAGES/django.mo | Bin 2539 -> 3414 bytes .../mailer/locale/es/LC_MESSAGES/django.po | 41 +++---- .../metadata/locale/es/LC_MESSAGES/django.mo | Bin 6270 -> 6785 bytes .../metadata/locale/es/LC_MESSAGES/django.po | 114 +++++++++--------- .../apps/ocr/locale/es/LC_MESSAGES/django.mo | Bin 2891 -> 3254 bytes .../apps/ocr/locale/es/LC_MESSAGES/django.po | 50 ++++---- .../locale/es/LC_MESSAGES/django.mo | Bin 968 -> 1018 bytes .../locale/es/LC_MESSAGES/django.po | 13 +- .../sources/locale/es/LC_MESSAGES/django.mo | Bin 7371 -> 8186 bytes .../sources/locale/es/LC_MESSAGES/django.po | 62 +++++----- .../apps/tags/locale/es/LC_MESSAGES/django.mo | Bin 3999 -> 4091 bytes .../apps/tags/locale/es/LC_MESSAGES/django.po | 22 ++-- .../locale/es/LC_MESSAGES/django.mo | Bin 3872 -> 3925 bytes .../locale/es/LC_MESSAGES/django.po | 26 ++-- 36 files changed, 392 insertions(+), 428 deletions(-) diff --git a/mayan/apps/acls/locale/es/LC_MESSAGES/django.mo b/mayan/apps/acls/locale/es/LC_MESSAGES/django.mo index 736c1573daedeca09703290e214ea45b1020755b..8e8df2efe10fa26a82523e5ee4e5a271999761d7 100644 GIT binary patch delta 543 zcmX}oF-QV&6vy$udZy`lmK8x6++dK9U{qiS4VO#94Q)ZSI2+|KEGwl|8V#uLY}Th-tD&_Q?hEAjX3jqJ__> zGcTxfpXgvZZj6nyID;h|Ll5=4k2T!EaXiNP-_j}HCKHVco9T~xzM)WvJmg}qKDXNE<6lRLf5Ycp1at-tH$?Zne|F_!>z7(YqhACIE#wbo*gufnw>^7 a^xUu=b*y`5>$ufwwA`TX>t3{!{Q3hnIX2$_ delta 498 zcmX}oze~eF6u|M9Hno~wt=2fH5X7ZIz_g15|Aa11B2EQM!9fId(4~Wmi_=l);!+U* zfc6hign;NMIQRqH+*}10zb}nGc=x$GF8AIgF@4j0uev=U=Ey~IL@tp{hk>|37jMzW z1ohktPUANkEapV!(Z>l~#dVBu3inWJ9HHKGjzy8KTrvsRxI!(IU%fryU3FLmRp~w&xD*R^jUx`x`HD diff --git a/mayan/apps/acls/locale/es/LC_MESSAGES/django.po b/mayan/apps/acls/locale/es/LC_MESSAGES/django.po index f41fc7d05c..e6a9dd55bb 100644 --- a/mayan/apps/acls/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/acls/locale/es/LC_MESSAGES/django.po @@ -1,25 +1,24 @@ # 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: # jmcainzos , 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: 2016-04-27 14:09-0400\n" -"PO-Revision-Date: 2016-03-21 21:03+0000\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" -"Language: es\n" +"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: apps.py:14 links.py:30 @@ -31,6 +30,7 @@ msgid "Permissions" msgstr "Permisos" #: apps.py:26 models.py:38 +#| msgid "Roles" msgid "Role" msgstr "Rol" @@ -39,6 +39,7 @@ msgid "Delete" msgstr "Borrar" #: links.py:34 +#| msgid "View ACLs" msgid "New ACL" msgstr "Nueva LCA" @@ -77,8 +78,9 @@ msgstr "Nueva lista de control de acceso para: %s" #: views.py:109 #, python-format +#| msgid "Default ACLs" msgid "Delete ACL: %s" -msgstr "" +msgstr "Borrar LCA: %s" #: views.py:151 #, python-format @@ -196,10 +198,8 @@ msgstr "Los permisos inactivos se heredan de un objeto precedente." #~ 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" diff --git a/mayan/apps/appearance/locale/es/LC_MESSAGES/django.mo b/mayan/apps/appearance/locale/es/LC_MESSAGES/django.mo index 6aa83c8f4d4b0858016c55f5017d4b0ab6dcf521..fea7e49fb736811cf417107a03022be39b2f13bb 100644 GIT binary patch delta 1247 zcmY+@T}YEr9LMpqHnq)JzGSVe^{i62Y;D>GY8OHXfxQa7NSL|S8jW%=l}d&DRq%SR2N+Yfv~%xpo<`opqrp>*7x`HbkU!4&gXeM&pGFRo@Xvt3Kl=r zdu|ybLET7w;WB0~4!UWGOCDn?@G@3m5m(|AdhsUua1IaSBixNYF^C;>uEc&+{{dWu z!`Q~_Ox}6m9yV~}A+Ez`Sc~s5grAXOT)a)!t8g_2kg-e{HIXP*Vf@^UIdvF{zz*E!;7jXkFVLdKm49lqJVx&i@Pomy;5S5Vu ztie-AF&F&gUjt2WroEg&z32gIkCsrWE1@#-6*YnHxE(#bZ3o6s_Xkk}o0?#wkR8g5#!_sf>iK~7U%~VC@2BG?s=fzhMzhzisnCF$q&~Jd^Q7Qe zLR3YBs^40n3@R(isJ5@on1!q->Z&`R8OwBA&Efp%TqZph8SPn^skr9$C8O~!E8gCn s=$y5@6SI%KC;a@6Y`C<@bGFkH0_9^LxI}Z+;9-hpJzjJrhP` z$?fEf%j_6-yJ?6U9%bW1aRpvS-Csrz z^V<*|z0qxq<3o(%tNIOQ3&>%gY5e#NwUVEh#^1OB6P%=LdDQhH%{uJCb9e={uvyeN z?=Z&v_K6OM{dM$EUsd0a2QYxAu!tNsNi)heJw>fB$#Qf)>v-6)3puQZ<`Q1OPMpI8 z{==#sj8ix5WePW94)b^#HNhBe#VKsY*SHVoo$HIJlK(-C6J&X+L@39>hQP(4kt_fRF&+SJ|T*MAMiD4XZ&Obvv z_Y(DS&Nfm1vvd|Xp}lG6LkQv#)HiSjRiRtR;_M!3YerGOm@zzo^QadIuq<|_9;%!s zQ|ux$q&{#3x7#*#wErrtCeupw_8M5B30ue%sVXgpUP$FrB@}zfE%n|~d9@W;3`ZB9p}R3w+ExBA}@asH-Q^=j$osh^-K5+)UUNPQ!U-K46r zo=lM1LMvRY3=di1+EBSNFleMayan EDMS, " "congratulations!" -msgstr "" -"!Felicitaciones! Acaba de terminar de instalar Mayan EDMS" +msgstr "!Felicitaciones! Acaba de terminar de instalar Mayan EDMS" #: templates/appearance/login.html:25 msgid "Login using the following credentials:" @@ -257,9 +253,7 @@ msgstr "Contraseña: %(password)s" msgid "" "Be sure to change the password to increase security and to disable this " "message." -msgstr "" -"Asegúrese de cambiar su contraseña para aumentar la seguridad y para " -"desactivar este mensaje" +msgstr "Asegúrese de cambiar su contraseña para aumentar la seguridad y para desactivar este mensaje" #: templates/appearance/login.html:45 templates/appearance/login.html.py:54 msgid "Sign in" diff --git a/mayan/apps/common/locale/es/LC_MESSAGES/django.mo b/mayan/apps/common/locale/es/LC_MESSAGES/django.mo index 55fd78c5aa913ba5ffbbf685d78f593f60ffd8eb..cb9238c77035ba6bc2b3e2173d6d61b79c4183f6 100644 GIT binary patch delta 1262 zcmaLWPizcf7{~FKUES60qFw)Lt43*UwcBhL z7XPH7^>MUuTw7wyK3rHzN1OKP5KaKg_7Sfv$17{e~q#KRcDQ>b})3}P7-;1aIFE6C5>qSO657{GhD0v~$g z8Ej|#93#XxA2`v%-%$%L;5zg%&^Ss*rlteAWqPp*2T(iPk8AK4-o^|n0YA|-Ka86( zf{HVU+E@}J#5adH(Ly75o$}{#BjcZ}qD)PYnxSK=d4VeVYb3V$h*A8E zyD`{Uuh0Qh;3KHSMzPYxNt%-cUd5F-g97AJP?4TjpEr507RHxQ=(rX8C?^-kJWl~l2sPy>ObExU_ zRn_$9)bur}>E%?@7p*TzpStOciUY0==y#x>>7w+Evy0-b|FdOa}}S6kfmC~F8< z#6s+}(!w;7C1s+h!6GTr#L6lX3sDIEzuCFWy}!A$v*(_BX6CT`YiaDa-}Av}t@H}| zT#8vIeotkf9i*8>@H0NZYviz7hGP7W=~(13E5r({#V}^$OU%S!%)?7mB6sfZDNHh$`|u(9-FY=uGH*u3?MD7$eW-X*EMa|{ za4)<^Wx9kMw#JZ!A5lBo!XiAt4Ln9AI7u{4?JZX00&1ZR)W$YZ3GATae8Cl}e2)FB zZzDv}!U@z)zM)F{1G&d8u^g|k19P}pm3WR?;1w!?5p2Lo4B;x~Vggl(Q&jxF=*Jt3 zX@M+XGBZCaP$ROI1zn$F3G*&gfY;cFgZLPi-0Rz@c)O^C_fc_9ki&j5=n-9@e*fpA z{$-rxQfCEf!6WQO?W~wV)-nV!gi2rlRmw4}!FO1PpODJx#d0d4$JI>N8rqoNX;nl` ziB#(O^B*Uhd{kMh=nAU#h^`%|Q7xwm&V<3K9O{{?oND?qTAZ`wpf5oiQ__0t^&Y4x zc_nOJbd^TWTdh8cGwLPMC#j}#s|Dz-I-%vz_g;9`(|k{Y?cqRsI1+jmzsgw5?upKf Z&qv2cBZ1M`_>{Lde&%i48^|2;+yke~QB42< diff --git a/mayan/apps/common/locale/es/LC_MESSAGES/django.po b/mayan/apps/common/locale/es/LC_MESSAGES/django.po index 204421b051..a4147357a2 100644 --- a/mayan/apps/common/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/common/locale/es/LC_MESSAGES/django.po @@ -1,25 +1,25 @@ # 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: # jmcainzos , 2014 # jmcainzos , 2015 # Lory977 , 2015 +# Roberto Rosario, 2016 msgid "" msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:10-0400\n" -"PO-Revision-Date: 2016-03-21 21:08+0000\n" +"PO-Revision-Date: 2016-05-09 01:42+0000\n" "Last-Translator: Roberto Rosario\n" -"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/" -"language/es/)\n" -"Language: es\n" +"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: apps.py:72 settings.py:9 @@ -59,7 +59,7 @@ msgstr "" #: generics.py:299 #, python-format msgid "%(object)s created successfully." -msgstr "" +msgstr "%(object)s creado con éxito." #: generics.py:324 #, python-format @@ -69,7 +69,7 @@ msgstr "" #: generics.py:335 #, python-format msgid "%(object)s deleted successfully." -msgstr "" +msgstr "%(object)s borrado con éxito." #: generics.py:380 #, python-format @@ -79,7 +79,7 @@ msgstr "" #: generics.py:391 #, python-format msgid "%(object)s updated successfully." -msgstr "" +msgstr "%(object)s actualizado con éxito." #: links.py:9 msgid "About" @@ -178,20 +178,18 @@ msgid "User locale profiles" msgstr "Perfiles de localización de usuario" #: settings.py:13 +#| msgid "" +#| "ary directory used site wide to store thumbnails, previews and porary es. " +#| "If none is specified, one will be created using pfile.mkdtemp()" msgid "" "Temporary directory used site wide to store thumbnails, previews and " -"temporary files. If none is specified, one will be created using tempfile." -"mkdtemp()." -msgstr "" -"El directorio temporaro es el utilizado por todo el proyecto para almacenar " -"miniaturas, previsualizaciones y los archivos temporales. Si no se " -"especifica ninguno, se creará utilizando tempfile.mkdtemp ()." +"temporary files. If none is specified, one will be created using " +"tempfile.mkdtemp()." +msgstr "El directorio temporaro es el utilizado por todo el proyecto para almacenar miniaturas, previsualizaciones y los archivos temporales. Si no se especifica ninguno, se creará utilizando tempfile.mkdtemp ()." #: settings.py:22 msgid "A storage backend that all workers can use to share files." -msgstr "" -"Un soporte de almacenamiento que todos los 'workers' puedan utilizar para " -"compartir archivos." +msgstr "Un soporte de almacenamiento que todos los 'workers' puedan utilizar para compartir archivos." #: settings.py:28 msgid "An integer specifying how many objects should be displayed per page." @@ -203,7 +201,8 @@ msgstr "" #: settings.py:40 msgid "" -"Time to delay background tasks that depend on a database commit to propagate." +"Time to delay background tasks that depend on a database commit to " +"propagate." msgstr "" #: views.py:37 @@ -223,6 +222,7 @@ msgid "Edit current user locale profile details" msgstr "Editar los detalles del perfil del usuario local" #: views.py:113 +#| msgid "Selection" msgid "Filter selection" msgstr "" @@ -232,6 +232,7 @@ msgid "Results for filter: %s" msgstr "" #: views.py:136 +#| msgid "Page not found" msgid "Filter not found" msgstr "Filtro no encontrado" @@ -285,11 +286,11 @@ msgstr "Ninguno" #~ msgstr "Email" #~ msgid "" -#~ "Please enter a correct email and password. Note that the password field " -#~ "is case-sensitive." +#~ "Please enter a correct email and password. Note that the password field is " +#~ "case-sensitive." #~ msgstr "" -#~ "Please enter a correct email and password. Note that the password fields " -#~ "is case-sensitive." +#~ "Please enter a correct email and password. Note that the password fields is " +#~ "case-sensitive." #~ msgid "This account is inactive." #~ msgstr "This account is inactive." @@ -298,11 +299,11 @@ msgstr "Ninguno" #~ msgstr "change password" #~ msgid "" -#~ "Controls the mechanism used to authenticated user. Options are: " -#~ "username, email" +#~ "Controls the mechanism used to authenticated user. Options are: username, " +#~ "email" #~ msgstr "" -#~ "Controls the mechanism used to authenticated user. Options are: " -#~ "username, email" +#~ "Controls the mechanism used to authenticated user. Options are: username, " +#~ "email" #~ msgid "Allow non authenticated users, access to all views" #~ msgstr "Allow non authenticated users, access to all views" diff --git a/mayan/apps/converter/locale/es/LC_MESSAGES/django.mo b/mayan/apps/converter/locale/es/LC_MESSAGES/django.mo index 65fcb0c2e03cb9118e9f8fe98dcb296691964155..80bba06424ecdf6db181de937c2f82660ed233b3 100644 GIT binary patch literal 2925 zcmbuAON#nZ)UiH;~ zZg1K66~py9emn8owt=xRaML5W;rb4I3cOnJ2KX}GZ-TqPKfoQ}hDRCO2<`+Q2X}$f z;3)V4n1J;C68IkYDYy;11(Lnn;2H2ga1=a=$-BWNa02`qr1d}JM*e;U9|Qja4frqk z2H3?Q2R{cXj&CY{4?c_c8{l)`PvDE-@8GN8KOju7%~y zey_HIREwAJqgvB?xMkRy{T&!~?L;mqd zEW1WZI}-BoL(NZEYdMlRP2n+$W>S@@tjp(Sj`Cb|C69EGxk;+}F(dMxiY$g`6D=)i zi|B&PV(v6AEJ8e?+D4x0bX0_`)sCyoI*}wY=7^I9IxrV=;b7eL{AQjMsbnYdNn~7? zD?2KYlo=YL&Q6&a?c(n+$CnU7Z%E3PFR3KqZOP@bj0z{?IzQgwiR?IDWKmCKT^a8u zC!%ngS}j6MFkM!+zgk$Ux*1lpIYdZ_QF-Tdo+GB*=&lhd&*P56NIEzvq2#L+s+n~* zFRl7WvU%;$?rdSO)dyegy3e+1OUuqG922>$tfRdd+-u9;*E(f$MpMrQ$K&8^xj7-9 z6&I0jYi9OzZC>WuxM0?HRU8~Cx;9wQA+ODyS_u4U!e$0Dh%n?6&GEN`=7C`1ARj*v zjyLh#Y+_=hoa-nIYluaPx)HagJNJHAjSZ((B zZ0laq5OIw>u3L}!>DEiWdJj?y7otl{B<>S<7#&=Ee@v+HTU-5Kb@>Hx#(Ze|?~gEa=$_RD2|B{JghXYT51Po=}cO5S%mEsh8@wy06+dvJ`Bu+m*MJ1PH+~7 z$lnkv-XG~7+?04YC&P@CJ~C${&MqBLs0XQ;*FX%)q%VOQvc;48$_bH5p-B)m6-8)T z>b=qgZ=IKEo}l}OOJP~}RV@@*tjS%ray^yCJIhxtcU1<3jWG_L^x`+ zsoaRIYgR5p4>c*Wh1?WY#Cp9_Rzis{Ttg?hL?0r3dY4%#lRAaEKq%3QlvgQ_-k~s2 zPc5z%Lciu)YS3%KQN9J5I8zqbX*h9oniJOut@ zAe0oL7u1!@P*g}c4qlzJ`NCmBvMQLOub5PkQcMlBk!E2)M3JR^@K@a!+KH2|~s8Bor delta 608 zcmXxhKP&@r6u|Lc|6S{}N>Ra~5`U&9T4FFMMqw}_aX3vXt>h3%qiMt>!SV}}No+P& z5j(5JASRoH$zbt)=e*?I=lAbW!g`FN~=z*R@?;iq+zCTjf>v KuRuj#nvcKUoI;=g diff --git a/mayan/apps/converter/locale/es/LC_MESSAGES/django.po b/mayan/apps/converter/locale/es/LC_MESSAGES/django.po index 2a804a50b5..0c9063cbd3 100644 --- a/mayan/apps/converter/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/converter/locale/es/LC_MESSAGES/django.po @@ -1,24 +1,23 @@ # 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: # Lory977 , 2015 -# Roberto Rosario, 2015 +# Roberto Rosario, 2015-2016 msgid "" msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:10-0400\n" -"PO-Revision-Date: 2016-03-21 21:06+0000\n" +"PO-Revision-Date: 2016-05-09 01:47+0000\n" "Last-Translator: Roberto Rosario\n" -"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/" -"language/es/)\n" -"Language: es\n" +"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: apps.py:18 permissions.py:7 settings.py:7 @@ -40,16 +39,17 @@ msgstr "Argumentos" #: backends/python.py:87 backends/python.py:101 #, python-format msgid "Exception determining PDF page count; %s" -msgstr "" +msgstr "Excepción determinando el número de páginas del PDF; %s" #: classes.py:98 +#| msgid "suported file formats" msgid "Not an office file format." -msgstr "" +msgstr "No es un formato de archivo de la oficina." #: classes.py:121 #, python-format msgid "LibreOffice not installed or not found at path: %s" -msgstr "" +msgstr "LibreOffice no instalado o no encontrado en: %s" #: classes.py:254 msgid "Resize" @@ -65,7 +65,7 @@ msgstr "Ampliar" #: classes.py:324 msgid "Crop" -msgstr "" +msgstr "Recortar" #: links.py:31 msgid "Create new transformation" @@ -87,7 +87,7 @@ msgstr "Transformaciones" msgid "" "Order in which the transformations will be executed. If left unchanged, an " "automatic order value will be assigned." -msgstr "" +msgstr "Orden de ejecución de las transformaciones. Si lo deja en blanco, un valor de orden sera asignado automáticamente. " #: models.py:38 msgid "Name" @@ -97,7 +97,7 @@ msgstr "Nombre" msgid "" "Enter the arguments for the transformation as a YAML dictionary. ie: " "{\"degrees\": 180}" -msgstr "" +msgstr "Entre el argumento de la transformación como un diccionario YAML. Ejemplo: {\"degrees\": 180}" #: permissions.py:10 msgid "Create new transformations" @@ -112,12 +112,13 @@ msgid "Edit transformations" msgstr "Editar transformaciones" #: permissions.py:19 +#| msgid "Raw application information" msgid "View existing transformations" msgstr "Ver transformaciones existentes" #: settings.py:10 msgid "Graphics conversion backend to use." -msgstr "" +msgstr "Módulo de conversión de gráficos a ser usado." #: settings.py:16 msgid "Path to the libreoffice program." @@ -129,12 +130,12 @@ msgstr "Ruta al programa pdftoppm de Poppler." #: validators.py:22 msgid "Enter a valid YAML value." -msgstr "" +msgstr "Entre un valor YAML." #: views.py:71 #, python-format msgid "Delete transformation \"%(transformation)s\" for: %(content_object)s?" -msgstr "" +msgstr "¿Borrar transformación \"%(transformation)s\" para: %(content_object)s?" #: views.py:139 #, python-format @@ -188,13 +189,14 @@ msgstr "Transformaciones para: %s" #~ msgstr "File path to graphicsmagick's program." #~ msgid "" -#~ "Graphics conversion backend to use. Options are: converter.backends." -#~ "imagemagick.ImageMagick, converter.backends.graphicsmagick.GraphicsMagick " -#~ "and converter.backends.python.Python" +#~ "Graphics conversion backend to use. Options are: " +#~ "converter.backends.imagemagick.ImageMagick, " +#~ "converter.backends.graphicsmagick.GraphicsMagick and " +#~ "converter.backends.python.Python" #~ msgstr "" -#~ "Graphics conversion backend to use. Options are: converter.backends." -#~ "imagemagick, converter.backends.graphicsmagick and converter.backends." -#~ "python." +#~ "Graphics conversion backend to use. Options are: " +#~ "converter.backends.imagemagick, converter.backends.graphicsmagick and " +#~ "converter.backends.python." #~ msgid "Help" #~ msgstr "Help" @@ -507,11 +509,9 @@ msgstr "Transformaciones para: %s" #~ msgstr "Magick Image File Format" #~ msgid "" -#~ "Multiple-image Network Graphics (libpng 1.2.42,1.2.44, zlib " -#~ "1.2.3.3,1.2.3.4)" +#~ "Multiple-image Network Graphics (libpng 1.2.42,1.2.44, zlib 1.2.3.3,1.2.3.4)" #~ msgstr "" -#~ "Multiple-image Network Graphics (libpng 1.2.42,1.2.44, zlib " -#~ "1.2.3.3,1.2.3.4)" +#~ "Multiple-image Network Graphics (libpng 1.2.42,1.2.44, zlib 1.2.3.3,1.2.3.4)" #~ msgid "Raw Bi-level bitmap in least-significant-byte first order" #~ msgstr "Raw Bi-level bitmap in least-significant-byte first order" @@ -627,8 +627,7 @@ msgstr "Transformaciones para: %s" #~ msgid "Joint Photographic Experts Group JFIF format (62)" #~ msgstr "Joint Photographic Experts Group JFIF format (62)" -#~ msgid "" -#~ "Portable Network Graphics (libpng 1.2.42,1.2.44, zlib 1.2.3.3,1.2.3.4)" +#~ msgid "Portable Network Graphics (libpng 1.2.42,1.2.44, zlib 1.2.3.3,1.2.3.4)" #~ msgstr "" #~ "Portable Network Graphics (libpng 1.2.42,1.2.44, zlib 1.2.3.3,1.2.3.4)" diff --git a/mayan/apps/django_gpg/locale/es/LC_MESSAGES/django.mo b/mayan/apps/django_gpg/locale/es/LC_MESSAGES/django.mo index b2fe1693c2a6a51fd68c1d256565407e629831a4..ca4903fb8147041d2ec0c56db542e24c174f950f 100644 GIT binary patch literal 4125 zcma);%Wot{9mfl@Brq(5EU%Cds0~?S@4Cn1jkDQ|V zuHL@@(w^^vXTTqVJm+@B-+{~8cR{T=}!TAT*?{wzqlm#XJokall@)Z+$t9W217!FRxA@Lo9O zaj*mOyac4YF-ZNs1%3ql9!P)u42;2_gFOF!97?+$1V0Ks4$gqfAnhE0NGb6(@MGXN zK+69K$bGj!+Vx9Ng1-fM&R@Vs!M}st{}2{yP=eI+n;`Z3K1lsu0-1-mKT~zUY$(gFfJOrbMu@jrlnY=8wcUkHJ{+ zqK_GG`rs27^+g}R6~PDZ2A`;3fEO|7D_(OLXE7L?c?`yi{%0+yFZz3Ot!%G$yHdH- zI^CCJ?Yyy>v;&#%X?as0HpNOZw9e#vsko&2(wkwX^1|t+San+ET-{f>7M<-C(b0+K zG=RI?@{FIlQwN>w7(4o1dJ`ET81L+wV+WVyIvQ!V?(={UFUP!=Bc=T>^$g`mK2 zFZXqlkg?4MW>{3R1}4$IDZ1&%y1W7po|?*ThjIDb)FUqk&Za>@?U)3jTNy-0Bfd&J z3mF*L9H0_Jzkew8f$=#Gvu36|+yBBwv7Mlv8$0DXRGEDYN zrW~?+)0r{Sw~WnZNG?&LeDsB&`%PHqgT7+&puG2D3yHt2m5cX)*y&ts*WZZL&QYJq z1249VIM&_|iX@>+Vr|9|esK2i7t+H%YGw1fIv)+=W$7G%Q$85iwn zmA2*fNM*+F$(g-8AGPP__xJakIk%gEK4``^opIYn<9p#EpvU4&yNyivLzYsDd%;*yt}g=T|8dL69?KwYgugjNY%Ey*faS= z*|yZav6({Qs0)@DBSwx^GmXvF3)80^s-!-U22FBf}__mS=Q{nmWh%{qQ<(e z(Ww>d#-)no=;##`In@;F8tO?bMrx|qV1FppYl%tu35ZM9Ips<@p2DT_F5wQRpGW0hkDbu_(-7;IMU9tfbXe88Dz`R(HpGgP|o;~%?!(U z5MI~upluTs^M8mvq!Yp!lM_QFRJ8QKP9Py2`|Ny@KJXB7(kxP+9bZwCB)RLX!$+Ob+pbh@r_9aujZ-+4u*eJaVcJiEH@&i_D6xB4;$q_JcU172zML z;7y6%KStW3>{cJf{_OW+QKZ8N3R~3+=`u}R~_mJCT2wM;$Zx%hIo}-i~c_@ z8k0UZ)x0D+W6xA!nx3;|@(CLar;4 delta 1083 zcmYk*Pe>F|9Ki9P<-hgMnwFWBHkM{9b;y(~ky=^{3nFThPR8gyWorM(%xX!+(mxC$ zBM0eF-J}TV5P}p^AW|KI4&AzR>d+wwqD#=B?{6KU$Nc8=-uUMCe(%lt#Cl(w`&v^t zBeWJ`D-kOY>BQt3ZnVQ|MZy@xN<4*JGQh1E2eBL-EWt56g4eJOmjZuagmGP=NGV2< z`8hdGr-}!sF^YqziD$74=Wq)y1kXRC7W5?;f5#5SKaoqCi&z9BSbcKEt+ZFoBx)66%hxpq}8Z zU_6cetS^t~9Kc`LgS(mCiWg89m`462k8uOe;t;+@E@@zrp2$wzg`Kz&2T%(cLu!*d zXmAQO-*3!m!oPI%6I8QJP1uCGlQz`fL^o>UbErGIj=UnbQ4`%qeg7fqLeEh1yg)s% z1>}-NZX8s;5BfQB`6JiGR@-JewZTBYyC%}sNLbpT?I83U>!RAUnC*maMvqu`t%bA@ z|2I7qEqJwUlcTF$k$SpXZ8gzAtS5B$`Xkb&N38!8n+QFHWig*=IwtnDN{ z|83Eyy58i7owAeCdwJAx?W~hYTM0XB{5QqtTRm&o&7`c0X2LV>xN$u>VJ57;Se}%f zwnt3Lq_h4~$ss>ndN&j|Zc5@4qsH$J-6-qW)4t!@+jX$Lef~qJvcUgS)>So>w8za# z0m-EC{Ey|0{&e{_f3l*%pR2g)_f$qAeF<_p!_JVM$hcO*SoxRanDMgC@;v1QPdvXq coc14tU)9H#pSvk1osqaRnvs6vuDs&OKN=d0tpET3 diff --git a/mayan/apps/django_gpg/locale/es/LC_MESSAGES/django.po b/mayan/apps/django_gpg/locale/es/LC_MESSAGES/django.po index f7bd1f169f..8a54023ef0 100644 --- a/mayan/apps/django_gpg/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/django_gpg/locale/es/LC_MESSAGES/django.po @@ -6,12 +6,13 @@ # Translators: # jmcainzos , 2014 # Lory977 , 2015 +# Roberto Rosario, 2016 msgid "" msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:10-0400\n" -"PO-Revision-Date: 2016-04-27 18:22+0000\n" +"PO-Revision-Date: 2016-05-09 01:46+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" @@ -22,7 +23,7 @@ msgstr "" #: apps.py:30 msgid "Django GPG" -msgstr "" +msgstr "Django GPG" #: apps.py:73 apps.py:76 forms.py:17 msgid "Key ID" @@ -30,7 +31,7 @@ msgstr "Identificador de clave" #: apps.py:74 apps.py:87 forms.py:19 models.py:67 msgid "User ID" -msgstr "" +msgstr "ID de usuario" #: apps.py:77 forms.py:34 models.py:70 msgid "Type" @@ -46,7 +47,7 @@ msgstr "Fecha de expiración" #: apps.py:83 msgid "No expiration" -msgstr "" +msgstr "No expira" #: apps.py:85 forms.py:32 models.py:62 msgid "Length" @@ -58,11 +59,11 @@ msgstr "Ninguno" #: forms.py:31 models.py:59 msgid "Fingerprint" -msgstr "" +msgstr "Huella" #: forms.py:33 models.py:65 msgid "Algorithm" -msgstr "" +msgstr "Algoritmo" #: forms.py:47 msgid "Term" @@ -99,7 +100,7 @@ msgstr "Gestión de claves" #: links.py:37 #| msgid "Import key" msgid "Upload key" -msgstr "" +msgstr "Subir llave" #: links.py:41 views.py:160 msgid "Private keys" @@ -155,28 +156,28 @@ msgstr "El documento ha sido firmado y la firma ha sido validada." #: models.py:47 msgid "ASCII armored version of the key." -msgstr "" +msgstr "Versión ASCII de la llave" #: models.py:48 msgid "Key data" -msgstr "" +msgstr "Datos de llave" #: models.py:76 #| msgid "Key ID" msgid "Key" -msgstr "" +msgstr "Llave" #: models.py:77 msgid "Keys" -msgstr "" +msgstr "Llaves" #: models.py:86 msgid "Invalid key data" -msgstr "" +msgstr "Datos de llave invalidos" #: models.py:89 msgid "Key already exists." -msgstr "" +msgstr "Llave ya existe." #: permissions.py:10 msgid "Delete keys" @@ -184,7 +185,7 @@ msgstr "Borrar claves" #: permissions.py:13 msgid "Download keys" -msgstr "" +msgstr "Descargar llaves" #: permissions.py:16 msgid "Import keys from keyservers" @@ -192,12 +193,12 @@ msgstr "Importar llaves del servidores de claves" #: permissions.py:19 msgid "Use keys to sign content" -msgstr "" +msgstr "Usar llaves para firmar contenido" #: permissions.py:22 #| msgid "public keys" msgid "Upload keys" -msgstr "" +msgstr "Subir llaves" #: permissions.py:25 msgid "View keys" @@ -219,24 +220,24 @@ msgstr "Ruta al binario GPG." #: settings.py:25 #| msgid "List of keyservers to be queried for unknown keys." msgid "Keyserver used to query for keys." -msgstr "" +msgstr "Servidor usado para buscar llaves." #: views.py:38 #, python-format #| msgid "Delete keys" msgid "Delete key: %s" -msgstr "" +msgstr "Borrar llave: %s" #: views.py:48 #, python-format msgid "Details for key: %s" -msgstr "" +msgstr "Detalles para llave: %s" #: views.py:68 #, python-format #| msgid "Import key" msgid "Import key ID: %s?" -msgstr "" +msgstr "¿Importar llave: %s?" #: views.py:69 msgid "Import key" @@ -246,12 +247,12 @@ msgstr "Importar clave" #, python-format #| msgid "Unable to import key id: %(key_id)s; %(error)s" msgid "Unable to import key: %(key_id)s; %(error)s" -msgstr "" +msgstr "No se pudo importar la llave: %(key_id)s; %(error)s " #: views.py:85 #, python-format msgid "Successfully received key: %(key_id)s" -msgstr "" +msgstr "Llave: %(key_id)s, recibida con éxito" #: views.py:107 msgid "Search" @@ -263,11 +264,11 @@ msgstr "Consultar servidor de claves" #: views.py:119 msgid "Key query results" -msgstr "" +msgstr "Resultado de búsqueda de llaves" #: views.py:138 msgid "Upload new key" -msgstr "" +msgstr "Subir una nueva llave" #~ msgid "Unknown" #~ msgstr "unknown" diff --git a/mayan/apps/document_indexing/locale/es/LC_MESSAGES/django.mo b/mayan/apps/document_indexing/locale/es/LC_MESSAGES/django.mo index 9a32d2b64ab88c50e243dc9587820961ae668e11..96acae55060fab337d35e797f0c13f41dc7b7035 100644 GIT binary patch delta 1279 zcmYk*OGs2v9LMo9zMtbOoqVKM%TiODAW6-r4D3Oum?#t&x0%~`ahkCil?ug;n}ldF z1QE8V7HwSVqJ@i~7wtj_0-+#UhP1FYQPB4{-9>-+&*z?d?|J>toga1E^^2d&v+f%r zNY;@nK4VVnI+GuwCCixI*otSc9|v$5r*IRi@OZW{ML3GJXk!j8U;vk}5?8Pn*U)dw zqS@vmpBulCu}luV^kO0Mf@#ED4B{|$V+Gzpx|m0(_nvz9*F4{16Zf~g_8-(ZW&CKt z)mX{=Cdfq|HwI7x51|GQdAgo))I_tMOP(pz!k>6P!;`dEQI*@q63k%|y;tQ~i^a@u zEG`+wM`_1DgxbA!d0k64XgQQyQLREJzf*TPD17Y0xzZAVqA4^`R`)PlzGGG0MV zw1Mikg{ts(WN7o#fAHU#XEK`p0RhwtXHgvokrPNqdFo3>h0e<~liFV?$qS}~+(+uO zV&wExs)Isbl%kz%A$0(h$s8bcNM)o#+g9ixHFFKA&sWh(YI~Go(O6ul7CNB+Lv_&J z6^BUGvr`R1|7C4UTWlj0+P^{vub>j?v(WV(GK1W&#;G~mjoMeEjunoF3TLl7u^DUT z*0hscf0t?dO01bl$8uv~=Vq_foIJ7Kl>Nb1WY4(~d&Z5&xR=_=S;<4G%=o-jS1T5fVW9&=en za(yg+)fagAqCcKU*a^#tYI-+Bf6ebJ9M13$+H+3C4!N(^(<>M%-Y7m7X5sENH)Mz7 JiB!IS>MtAYlOO;9 delta 1052 zcmZ9~J7^R^9LMqhT{h+($>yoX7|%1O#>WXsL_*Fh6hsS!)j)_C2wo9Se56rPB;h~{ z!AIk&*j`~FA{HyCg&=5Q3dKSYGzKfN2{y423%|e3VBv88`^?M^Gyi!k=9YSE3mx8F zqZEl=VkTj>8|Rb!QQkI~9l$xX*`On@C`QO7hH=!a0PmeW~(uaB`lzilbFV{ z$k3Wyq_UEZ88_fIHqox*VSI?4_#63|&+MA03)Nq64r3qfgRVV|n&%2C(d(#n>X^c3 z*vb0#ii#%w==|*bhFa*m^B0n_dCV%)xCedg#sFLKr2BpeTWHVX2E2h<=P@dg2yfLm z?l~&sbc}N@llTN@(a$VTd=oX%11w;KRfmtJrTZ77o(ocqeS#I8zjTB{~~N? GJ@pq8pIVFn diff --git a/mayan/apps/document_indexing/locale/es/LC_MESSAGES/django.po b/mayan/apps/document_indexing/locale/es/LC_MESSAGES/django.po index e3c7c321aa..4aab448ed9 100644 --- a/mayan/apps/document_indexing/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/document_indexing/locale/es/LC_MESSAGES/django.po @@ -1,24 +1,24 @@ # 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: # jmcainzos , 2014 # Lory977 , 2015 +# Roberto Rosario, 2016 msgid "" msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:11-0400\n" -"PO-Revision-Date: 2016-03-21 21:09+0000\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" -"Language: es\n" +"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: admin.py:24 @@ -30,6 +30,7 @@ msgid "Document types" msgstr "Tipos de documento" #: apps.py:48 +#| msgid "document indexes" msgid "Document indexing" msgstr "" @@ -39,7 +40,7 @@ msgstr "Etiqueta" #: apps.py:121 models.py:30 msgid "Slug" -msgstr "" +msgstr "Identificador" #: apps.py:123 apps.py:143 models.py:38 models.py:126 msgid "Enabled" @@ -99,19 +100,17 @@ msgstr "nuevo nodo secundario" msgid "" "Error indexing document: %(document)s; expression: %(expression)s; " "%(exception)s" -msgstr "" -"Error indexando documento: %(document)s; expresión: %(expression)s; " -"%(exception)s" +msgstr "Error indexando documento: %(document)s; expresión: %(expression)s; %(exception)s" #: models.py:29 +#| msgid "Internal name used to reference this index." msgid "This values will be used by other apps to reference this index." msgstr "" #: models.py:35 -msgid "Causes this index to be visible and updated when document data changes." -msgstr "" -"Hace que este índice sea visible y actualizado cuando los datos de " -"documentos cambien." +msgid "" +"Causes this index to be visible and updated when document data changes." +msgstr "Hace que este índice sea visible y actualizado cuando los datos de documentos cambien." #: models.py:82 models.py:109 msgid "Index" @@ -137,17 +136,13 @@ msgstr "expresión de indexación" #: models.py:123 msgid "Causes this node to be visible and updated when document data changes." -msgstr "" -"Hace que este nodo sea visible y actualizado cuando los datos de los " -"documentos son cambiados." +msgstr "Hace que este nodo sea visible y actualizado cuando los datos de los documentos son cambiados." #: models.py:131 msgid "" -"Check this option to have this node act as a container for documents and not " -"as a parent for further nodes." -msgstr "" -"Marque esta opción para que el nodo actúe como un contenedor de documentos y " -"no como un padre para otros nodos secundarios." +"Check this option to have this node act as a container for documents and not" +" as a parent for further nodes." +msgstr "Marque esta opción para que el nodo actúe como un contenedor de documentos y no como un padre para otros nodos secundarios." #: models.py:134 msgid "Link documents" @@ -219,8 +214,9 @@ msgstr "Generar índices de documentos" #: views.py:51 #, python-format +#| msgid "Delete document indexes" msgid "Delete the index: %s?" -msgstr "" +msgstr "¿Borrar el indice: %s?" #: views.py:64 #, python-format @@ -229,7 +225,7 @@ msgstr "Editar índice: %s" #: views.py:81 msgid "Available document types" -msgstr "" +msgstr "Tipos de documentos disponibles" #: views.py:83 msgid "Document types linked" @@ -263,7 +259,7 @@ msgstr "" #: views.py:286 #, python-format msgid "Navigation: %s" -msgstr "" +msgstr "Navegación: %s" #: views.py:291 #, python-format @@ -277,9 +273,7 @@ msgstr "" #: views.py:341 msgid "On large databases this operation may take some time to execute." -msgstr "" -"En bases de datos de gran tamaño esta operación puede tardar algún tiempo en " -"ejecutarse." +msgstr "En bases de datos de gran tamaño esta operación puede tardar algún tiempo en ejecutarse." #: views.py:342 msgid "Rebuild all indexes?" @@ -350,11 +344,9 @@ msgstr "Reconstrucción de Índices en espera de forma exitosa." #~ msgstr "Maximum suffix (%s) count reached." #~ msgid "" -#~ "Error in document indexing update expression: %(expression)s; " -#~ "%(exception)s" +#~ "Error in document indexing update expression: %(expression)s; %(exception)s" #~ msgstr "" -#~ "Error in document indexing update expression: %(expression)s; " -#~ "%(exception)s" +#~ "Error in document indexing update expression: %(expression)s; %(exception)s" #~ msgid "Unable to delete document indexing node; %s" #~ msgstr "Unable to delete document indexing node; %s" @@ -391,11 +383,11 @@ msgstr "Reconstrucción de Índices en espera de forma exitosa." #~ msgstr "documents rename count" #~ msgid "" -#~ "A dictionary that maps the index name and where on the filesystem that " -#~ "index will be mirrored." +#~ "A dictionary that maps the index name and where on the filesystem that index" +#~ " will be mirrored." #~ msgstr "" -#~ "A dictionary that maps the index name and where on the filesystem that " -#~ "index will be mirrored." +#~ "A dictionary that maps the index name and where on the filesystem that index" +#~ " will be mirrored." #~ msgid "Index rebuild error: %s" #~ msgstr "Index rebuild error: %s" diff --git a/mayan/apps/document_signatures/locale/es/LC_MESSAGES/django.mo b/mayan/apps/document_signatures/locale/es/LC_MESSAGES/django.mo index d9cd64a43b44c1d9679b6c44e91bba4e8c47d739..e433a7e78c3410064b91ae6d9539a6ec6bc718eb 100644 GIT binary patch literal 4333 zcmb7`Uu+yl9ml6o{<+XXp)C-=lax>=VSRTYZJZ0KNn=~MwHp(=2nh)^-krN!vbTH8 z?8Y|mgb*Mkc%UHh46Ou+2ck+m^ns}LLwQANC3pb|Aq5aZeESgz8lowJHb7W^4|iFfzN{{!Iwaeza8qYhx&tx{ zfBYDvo?9UGyar0}@8JF512B?todap_$MIr5Jqg0)A^|@OW*|%vzXG|AS3&yeuc1DR zU_hlf51t2?K<4^az!Tsvz?0x_LFUiDLF&5?73SA5ka3GZ+Vwa{KYR*g{`Wxq#Mkip zDEK{)>wF2E1786d$JfE*;6Fg-(?d|odDg%P{0vBaUkB-r=Rn4HAEdt9Aj0Sh_XBo;llIQN?D8Yr zN1FKtQ1%LQP)iY4L!Fo7W=PjuA_=$ZEdg0vb}j|*vYd( zVb$Sdyx^oZgnn@=w_!dP?u{k*iA%D(e>}EeAtai;Y$#OqU6LOEJAWO3i_` zUYhr{8JRRMolK_lemQWT<=)7TtE@Jhb;4Y~e(TS-3??F0*;ZB3B*M2y6?X*Qf z?y$NbS9iEkE(I72+UF}SzT;{y&GbYs{8uYjoM@)UrnInOWVFRbn3T&>TTTpv^U_`# z`y~2erK>}^+!*4m_bKakU6aZo0&WX$G0C18G5g0+Xe4dDNP9@8>AJJ-ptg||pQiPD zQe~NJrkFYp?BY=}wr*?&H7e1S>K$h}50|1hRy-loe2NWId;u9AttJtS;mOjK>uOKs za(QWebLN^J6{d{VZ9h$-C#t@Uwu-Kt*|@qDT?yMc;!)X^XWN~}qV~Dy?0MNa*X?xh z-EKoLx~6ZW)H@~jXw<$S+nsLb!kIS8%$l-gv}IIoGgTI*E3XyX+F*lSE37hU0fD?< zslJZ3v>JBh=1AqK9mu&sS&q7`*3Qn(e97TyPw&ph#js`kK-0qRS9zq9p>1VBNlV+- zshRcF_2u!RJM-hIN<`-o=P{!)=(lc8t(ZX1cGxoHJmT^)f zIJmlUVLL4wW4lt@nT@P6DvMSMGqhcqk6hJWI(t$2&r5T;Jbp=bPFHb}Ow$k4lskmz{{aZL&=J>xLha0yr`K2&ZC⋙(J zlPiVGFq`hbz*B47ESxBt+?F}I+i5zw-=)~WQDLP@#<&~yf3lmF1#Td1W1Q+(c=I*2 z_9?ThSViFaSa>1UGIc|X)dX>L2SbAE752ui`Le%|h6S78gUq!$uR9^6bX+g`aJRp% z4hwv;(oi&|a!U=>{>|xWw$hPr@D?s{KxHeY_te;@kw{fuh~-@R>kM)@QVZu-EHcMs z=Cx~EDu2&;qeeLWaJMOwD1$?#zyBg+Q$57II+q$7y+WtOoySb)jkkYOO@5EBJT)&i zH7+{*DM&F1LQ~881XB3Bkl+?pNOAN#N6w20PjHcPA zDH?{!|9c$%LAaa<(<2SSjSEk52DiZu7}H=(S)3iYB`!wu-N%?XFQ09Rm>n7$or#D5c<1&lq? z6IBG&8Q|aJqu|KR>Tg5jtk|r!Q{zpubu?hw*jJMhwLpE$+*$X8TJiEN91U*28vLzF t5TT6uJ`R{u=NA^PM6CEI*|9$wlc#OPMDTQpI~Rvx?Q(vMXA^EB@gJ0agc==O~hbLbumDUi5hdB#2JME;r3s`M%P z8~QZ;PL6^05%ai>9)7`-_zj2gHy*~^kVplKIF8e(_s-%eY@*&bnK2S?QwB`*froer zAK?*vhb8=sdcK1i_y=m>U-*Q_#}0`USU=~ICins;@nyDti~8_;)FMCOG2F!(@5=#` z(`-x;rHB_Y8+e@c4b%$TcpDScL_Q!t`N}{D`Hp4W#Tx!Z@=KeZ>%T*;Lf&c9;^fxf zc^Z)WY2}*jD19tD)2y{=5)a_q_^n1qb=V#n}q3T+NyOlw_miVDu z>8zSCG@)EK8}6}pt+pJsW53t8rrwIyjQm@6Wo2XCxQoRTZpf>;?c%`IOJ08d{JFW; zOQlNAyPR0-Tenp{lWVwF&nsWV7v?#-<-<>#lwfCPBYL)TAqa00Vn+8~^|S diff --git a/mayan/apps/document_signatures/locale/es/LC_MESSAGES/django.po b/mayan/apps/document_signatures/locale/es/LC_MESSAGES/django.po index 114d7af20b..e0a7365467 100644 --- a/mayan/apps/document_signatures/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/document_signatures/locale/es/LC_MESSAGES/django.po @@ -7,13 +7,13 @@ # jmcainzos , 2014 # Lory977 , 2015 # Roberto Rosario, 2012,2015 -# Roberto Rosario, 2015 +# Roberto Rosario, 2015-2016 msgid "" msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:11-0400\n" -"PO-Revision-Date: 2016-04-27 18:23+0000\n" +"PO-Revision-Date: 2016-05-09 01:19+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" @@ -38,7 +38,7 @@ msgstr "Identificador de clave" #: apps.py:98 forms.py:71 models.py:41 #| msgid "Signature ID: %s" msgid "Signature ID" -msgstr "" +msgstr "ID de firma" #: apps.py:99 forms.py:83 msgid "None" @@ -50,64 +50,64 @@ msgstr "Tipo" #: forms.py:23 msgid "Key" -msgstr "" +msgstr "Llave" #: forms.py:27 msgid "Passphrase" -msgstr "" +msgstr "Contraseña" #: forms.py:53 #| msgid "Signature file" msgid "Signature is embedded?" -msgstr "" +msgstr "¿Firma integrada?" #: forms.py:55 #| msgid "Signature file" msgid "Signature date" -msgstr "" +msgstr "Fecha de la firma" #: forms.py:58 #| msgid "Signature ID: %s" msgid "Signature key ID" -msgstr "" +msgstr "ID de llave de firma" #: forms.py:60 #| msgid "Signature type: %s" msgid "Signature key present?" -msgstr "" +msgstr "¿Llave de la firma presente?" #: forms.py:73 msgid "Key fingerprint" -msgstr "" +msgstr "Huella de la llave" #: forms.py:77 msgid "Key creation date" -msgstr "" +msgstr "Fecha de creación de la llave" #: forms.py:82 msgid "Key expiration date" -msgstr "" +msgstr "Fecha de expiración de la llave" #: forms.py:87 msgid "Key length" -msgstr "" +msgstr "Tamaño de la llave" #: forms.py:91 msgid "Key algorithm" -msgstr "" +msgstr "Algoritmo de la llave" #: forms.py:95 msgid "Key user ID" -msgstr "" +msgstr "ID de usuario de la llave" #: forms.py:99 msgid "Key type" -msgstr "" +msgstr "Tipo de llave" #: links.py:32 #| msgid "Verify document signatures" msgid "Verify all documents" -msgstr "" +msgstr "Verificar todos los documents" #: links.py:39 msgid "Signatures" @@ -123,7 +123,7 @@ msgstr "Detalles" #: links.py:57 msgid "Signature list" -msgstr "" +msgstr "Lista de firmas" #: links.py:63 msgid "Download" @@ -135,11 +135,11 @@ msgstr "Subir firma" #: links.py:75 msgid "Sign detached" -msgstr "" +msgstr "Firma aparte" #: links.py:81 msgid "Sign embedded" -msgstr "" +msgstr "Firma integrada" #: models.py:31 msgid "Document version" @@ -147,11 +147,11 @@ msgstr "Versión de documento" #: models.py:35 msgid "Date signed" -msgstr "" +msgstr "Fecha firmado" #: models.py:45 msgid "Public key fingerprint" -msgstr "" +msgstr "Huella de llave publica" #: models.py:51 msgid "Document version signature" @@ -191,15 +191,15 @@ msgstr "" #: models.py:130 msgid "signature" -msgstr "" +msgstr "firma" #: permissions.py:13 msgid "Sign documents with detached signatures" -msgstr "" +msgstr "Firmar documentos con firma aparte" #: permissions.py:17 msgid "Sign documents with embedded signatures" -msgstr "" +msgstr "Firmar documentos con firma integrada" #: permissions.py:21 msgid "Delete detached signatures" @@ -208,12 +208,12 @@ msgstr "Borrar firmas separadas" #: permissions.py:25 #| msgid "Download detached signatures" msgid "Download detached document signatures" -msgstr "" +msgstr "Descargar firma aparte de documentos" #: permissions.py:29 #| msgid "Upload detached signatures" msgid "Upload detached document signatures" -msgstr "" +msgstr "Subir firmas aparte de documentos" #: permissions.py:33 msgid "Verify document signatures" @@ -222,50 +222,50 @@ msgstr "Verificar firmas de documentos" #: permissions.py:37 #| msgid "Verify document signatures" msgid "View details of document signatures" -msgstr "" +msgstr "Ver detalles de firma de documentos" #: views.py:67 views.py:172 msgid "Passphrase is needed to unlock this key." -msgstr "" +msgstr "Se necesita contraseña para acceder a esta llave." #: views.py:77 views.py:182 msgid "Passphrase is incorrect." -msgstr "" +msgstr "Contraseña incorrecta." #: views.py:98 views.py:202 msgid "Document version signed successfully." -msgstr "" +msgstr "Versión de documento firmada con éxito." #: views.py:129 #, python-format msgid "Sign document version \"%s\" with a detached signature" -msgstr "" +msgstr "Firmar versión de documento \"%s\" con una firma aparte " #: views.py:240 #, python-format msgid "Sign document version \"%s\" with a embedded signature" -msgstr "" +msgstr "Firmar versión de documento \"%s\" con una firma integrada" #: views.py:267 #, python-format msgid "Delete detached signature: %s" -msgstr "" +msgstr "Borrar firma aparte: %s" #: views.py:292 #, python-format #| msgid "Document signatures" msgid "Details for signature: %s" -msgstr "" +msgstr "Detalles para la firma: %s" #: views.py:339 #, python-format msgid "Signatures for document version: %s" -msgstr "" +msgstr "Firmas para la versión de documento: %s" #: views.py:375 #, python-format msgid "Upload detached signature for document version: %s" -msgstr "" +msgstr "Subir firma aparte para la versión de documento: %s" #: views.py:392 msgid "On large databases this operation may take some time to execute." @@ -274,11 +274,11 @@ msgstr "En bases de datos de gran tamaño esta operación puede tardar algún ti #: views.py:393 #| msgid "Verify document signatures" msgid "Verify all document for signatures?" -msgstr "" +msgstr "¿Verificar todos los documentos para firmas?" #: views.py:403 msgid "Signature verification queued successfully." -msgstr "" +msgstr "Verificación de firmas colocada en la cola." #~ msgid "Signature status: %s" #~ msgstr "Signature type: %s" diff --git a/mayan/apps/document_states/locale/es/LC_MESSAGES/django.mo b/mayan/apps/document_states/locale/es/LC_MESSAGES/django.mo index 24caf49c85a04528ea53af42ae4bfb77c9a2d2b6..51ffd0652af60bc876d1233a49f9ab733e7c0c7f 100644 GIT binary patch delta 1914 zcmYk+PiP!v7{~E<+iXlW+i22So21&YO=>hIO{!^43Q|pr6hvvDh<^@Fc4w1`o0)ZH zwxNN#AlMc`lnyp{u~HQ4K|L&033_Q$P$AWWp46g3K}8WyrcjFC-()xOW#9SC%+9>e z^FHspyR>y_N9AgJ!<&XSO5aNVGiA(^`1yJcwB-h4w%~QV1>4icWUv#n*n@ZBZfwKD zxC3)|E1tyLa2_|{`I?_#lQ9*u$Vnq#ETJC!4mHrV+Wmjg;`$~k&^8|CMe{H!z+>2o zPhl?>um@kqcD#Vw@JnP4<~P*yf8lZBn;V>HW^){r;mfE5-aulSbErV)Q3HI2n)w$v zi(ex{m`BNKGaf=+KaZ-^ByPe0Tks@yVT^smHy?ANfqy_{_A~M^e{)bG%XlYdnpa-z zMa}F0CNoDRSip^V6czAQlau)O%0Vd=^!KDb(KaQHh>Hie={UUObzn{u=lzZjh9@j<@4_M%7F@ za2We*=1`S*3wPqDs6bayfv({^-b4jDLsSKRn}ZVm5LMaBsPV6~Qhz=8D>rz@{DH6F zGV1Tdw1GQFN)Lolo4<>7c7S{ptF)@dG@I7Qn%>Z3{LQOMM)yO4j8n51zq?)Rw#44JV ze)|fpJ)mGpNb9er{{$tXrcGLJ+F*UP3+*AzT9v3bm3v+7VyNc!n!TuB7E4}9)URW*0h)hINZ zS#^8lsO=W*iK1iW{aks*@ggfaR&qi!=FjL#mWoc~`d+-hA&Ad4EHs9Z9XVkCVJ8*q7W_yvFxARussn5mExtFS5Tx>qkrn^yKPuSBu88~(j4{g|VI&(37 zkSXTl%bD)@`^;Vih=0#y8wePkZtd>UYxRX$t)w3kz>BXmcf{G2?Ug9-^X0jmZ8=4& z3a)1t-MN)CtQX6UhD{E3-e0RKZ?04|NmpZQs6w$k?f)-r${V>wH%Eyt rEzCFpS%j>Hv$=?qUh?Q#_N>we6ym{Cpoj=PSj3B>2ba6l@9&XQhs=Cl-g`6ipa0A&HI?G|h5D*n zhLWPjsSka|3}Uj9hSFPQObzy72nTRI?#Jbr#U{*S9Zq8ypOr0Qfd6yo$9dFyUy%NJ z^QZivvf3Dz2M%h21ghg+ti?mP2}hAG=1Teg4OD;+P!m5v1@;{InfEjiETQ^+MlIwk zo@0LViwi}Tp;?JJ)c;8u2d`of@8DXT#st1a4fqok;BQpGi>LqsM70hZQ2lzb9uK45 z&tQc4%~>v@IE691hs*FOHsC9~#m)m|x9B2N#NHH!_Dgf}8OeYQW3L80IA^&?0WfPpE-Hq(|dKQT>ys@wTA?8AN4f z7}fs->b>(p@~;Rla$^#&mmkCk)8&60HNj5gkr_gM<^WAI9>rd~gc|TQuE2MwLpG1v zf*-g815DO~L#Q)$Ax!?2;``jt9=*T~_yJw~i%M;j<+Nc7vJ>7x1h43Q6$Pl(Du51Z zimL6@hvZUK^ra}HI%g`H-zz#uDq59Nr*tYH0{2RiR$HQztW+u(rBcCbrE91aRFy`m zR;SFhP_+P+jZ|f$i`q(6*~1oksnfU5hu|HkcGO8-T66{yOK%R2WwYtrY1>>qZXZ|A z*yH|A``sTaOw?5P3O55YK4)utcgpQf^>_8zUCu;k-$*WVW+apDchjfr8)w+I29pk> pFv!UG$uWC7IAv$+YVAO%Xb%RXHW}`*3*pAX-P%T9VJ`B|_aF0xaVP)) diff --git a/mayan/apps/document_states/locale/es/LC_MESSAGES/django.po b/mayan/apps/document_states/locale/es/LC_MESSAGES/django.po index e122282f10..f11125d406 100644 --- a/mayan/apps/document_states/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/document_states/locale/es/LC_MESSAGES/django.po @@ -1,27 +1,27 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Roberto Rosario, 2015 +# Roberto Rosario, 2016 msgid "" msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:11-0400\n" -"PO-Revision-Date: 2016-03-21 21:09+0000\n" +"PO-Revision-Date: 2016-05-09 01:51+0000\n" "Last-Translator: Roberto Rosario\n" -"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/" -"language/es/)\n" -"Language: es\n" +"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: apps.py:31 msgid "Document states" -msgstr "" +msgstr "Estados de documentos" #: apps.py:47 msgid "Initial state" @@ -49,7 +49,7 @@ msgstr "Fecha y hora" #: apps.py:72 apps.py:99 models.py:79 msgid "Completion" -msgstr "" +msgstr "Cantidad de completación" #: apps.py:86 forms.py:39 links.py:79 models.py:187 msgid "Transition" @@ -77,7 +77,7 @@ msgstr "Flujos de trabajo" #: links.py:20 msgid "Create workflow" -msgstr "" +msgstr "Crear flujo de trabajo" #: links.py:25 links.py:46 links.py:63 msgid "Delete" @@ -123,9 +123,7 @@ msgstr "Flujo de trabajo" msgid "" "Select if this will be the state with which you want the workflow to start " "in. Only one state can be the initial state." -msgstr "" -"Seleccione si este va a ser el estado con el que desea que el flujo de " -"trabajo comience. Sólo un estado puede ser el estado inicial." +msgstr "Seleccione si este va a ser el estado con el que desea que el flujo de trabajo comience. Sólo un estado puede ser el estado inicial." #: models.py:73 msgid "Initial" @@ -135,7 +133,7 @@ msgstr "Inicial" msgid "" "Enter the percent of completion that this state represents in relation to " "the workflow. Use numbers without the percent sign." -msgstr "" +msgstr "Introduzca el porcentaje de finalización que este estado representa en relación con el flujo de trabajo. Utilice números sin el signo de porcentaje." #: models.py:92 msgid "Workflow state" @@ -179,7 +177,7 @@ msgstr "Entradas de registro de las instancias de flujos de trabajo" #: permissions.py:7 msgid "Document workflows" -msgstr "" +msgstr "Flujos de trabajo de document" #: permissions.py:10 msgid "Create workflows" @@ -199,7 +197,7 @@ msgstr "Ver flujos de trabajo" #: permissions.py:26 msgid "Transition workflows" -msgstr "" +msgstr "Realizar transiciones" #: views.py:57 #, python-format @@ -209,7 +207,7 @@ msgstr "Flujos de trabajo para el documento: %s" #: views.py:91 #, python-format msgid "Documents with the workflow: %s" -msgstr "" +msgstr "Documentos con el flujo de trabajo: %s" #: views.py:116 #, python-format @@ -227,11 +225,11 @@ msgstr "Realizar la transición de flujo de trabajo: %s" #: views.py:215 msgid "Available document types" -msgstr "" +msgstr "Tipos de documentos disponibles" #: views.py:216 msgid "Document types assigned this workflow" -msgstr "" +msgstr "Tipos de documentos asignados a este flujo de trabajo" #: views.py:226 #, python-format diff --git a/mayan/apps/documents/locale/es/LC_MESSAGES/django.mo b/mayan/apps/documents/locale/es/LC_MESSAGES/django.mo index 44705c36839cd93b3290ea05dacf53b45efd5d0a..98ff89a336edd8c0de3176f021b64fde22666b67 100644 GIT binary patch delta 3181 zcmYk-eN5F=9LMoPf;`=;De|BQULl@T5F*Tne1I}F71AOxjdn|>Xp$(Flz4pvEm80X zrir2EN?oosq_X~~aIHCKZd#(5sccT?L$j4_wy@rxdrw=xael9Je)rsSzUO<+?{Z}R z<@vr}`UW=}uKkpOl*dAhxrB2gxN)6x8xw}-(Suz`7t^DcF;q=B4#!x`!$}y9HCTvs zn2%@iNsQ}lOcB0_(~a?&kEuM%gKmt(nGXggEX8HC=VLTpz)<|netr+5Xg|=$m>7(~ zewc~sUx0KmC8&j!qt;Z53cL}cncuWh;m@>l(*)mPHlD(sX!-^Q3`Gr?fC-poora0D z7b1UV6F2p1K`rPoDuYMu^A1!1XE2KS%@rzS$K2He4CXcf<4`NfMSWq4ZO=mWUyPb) zCHBX9OvMjz5Ppxj_$z8ll1L9zm|>`K$D@y|n_?=Oung5+jf%Jd^@W|-i63DwuIJlv zxCxc|eaIZCMqN(}keM43DZ%qZa@znLT$|n)WjE2 zndq|KL1HrZQ7ep!4eW6OYNB-1^E}i%<57oqvTYZ}l7DrW#e)>|qS|#>jEy)GuiU{Bpw7@V`@9sD`U=17|1$ev z1?rI0paQ8yo$6N9scyrEu>-a8yQu!%SRce{S-#p$EPp8OMzxQl_Wm@E#%nkMlRUg# zJ}NI$DZ$rp4xYj?96Fc-gN>-ecMIp@<1Ak(+=JS~!`Ot!P-mfplc+6Pg392VNOH^u zWNxz$)vp6}{>)EQw6}ktUcV4->M#T~Q2{cyDMGrKO4MF9<0#yV+UpCbiMmjk`v>_m zQS6hpY9zOGEJb29bt%069x8`;povbPB0h%-s0)?4-%*DvjFY4lrywHx76WfeR)dAG$J!zj`#4y@-P;bFKd;vp; z1pe)oVJ_`vR7Q?tC|*S!;@haed$L@OKM)moK58CcF%_NeGE_uW_Jdl~#M`Z{_W1#1 z@#b?3$IG|`Z(u3T8OHg*FHivuBdrQ>GHT+LsEjutyXrG-RM-x49+h&F6^M8M>I`I~ zR+Nt;aSF01vlf-|!>9~)pce2WD)4Kl0Pdi^?;0N1ihkIOb{>Z5|Nj$I6xnptA@pJ- zR-jJ(8>m#aU~ghqgo2;1z$|T#)$L&scL~c-vlM@*m z-b7o=-{{PU%ysXzy~KW}F)}`S!~dS>RnZyP<9ri2roTf?FI_c7S2Lx6^0pK0O3v6x zZ5~Cx6LTr=Q~tYVQyEKHOsRFeu0cWDoHeer;`eB8qA0s-D3uicjrgw>-0La3DN8A< zDcbHClxHZLDZ2bG3+jK0u6LYnSF*c~n)a@ovct)A51O%yS_MTrt7|Gn$4=K6$`*=_ z(LRcHQ`aKOTmD+$rk{{j+pckTyW@k_wH_0&>tqMNKv%OL36o4NY6cyiW6a+U!7h4>f!> z#Jpq{&Nb)iv~J#Nm5XT>&W&to+HHx|>^93;_Wf~Q-tj-5=Xu}vywCsnKhJx(TKQIG z=t^?*F5@^vq!YtBnSFzk;`!kC)N2-pP3Xf5$Sw8<@@N0>k&Cg3X2Wp=cE-h6f~#>n zp1}t&F3D^PPQl4$Av-{0DkpwH4;FQa3|NB8=}*HHJd3e-&AomdyV3t0dtgjgv+mdj zb$Aqmj(Tn`hN!wtprHZFQT?T;jH^&z*o-Z>7o%|n-|mG$ zROxphW7rW?Vkc40IfqK*Yg8rfU;@VRB~?152ldxLeK=8q1MnVPi9XzeRNaoF2L23H zi3_e*k(}&T)C@cJjI6O2HBc|qc|U5LT-4?*aQkC>Qh(i0%n3i1qWY_`9ILSmTkugF z%(Q7*H4efCY+Fmrq~DC%Y=5CAz z?f;0%{5NE>b_-R)MAl6M^gtz&gSxK}wFE_|0n1R&t-v&_L{`H>H8fPJ2JDZGr~#T# z54eijWH(U{h~nECI02cYbw};~Y}AY=q28KBsLi+>HIY52aT?w0VGQd1f1idPG>p0p z#L1|PSD|K9<@UFs65Neis^h5F@EU5ycTov<;v~6R3Tp2R#kNYIN?ztVtxeXyf`&H7 zJX9hJP`kMXwVUfPfQ_h`Uqan~4Yx*_wYvQ^O#fcaSEH^UMXmYUI110={TSnmyj8_G zJ;aHbG-hEKpTwkooWqrU>4I?3D=?4t`2wNVbmTdWCv=ArefPBLyBVak+E$9 z>b^!~``9TAX>Grxq1W!ZdqW}}4Kx55+wzf1R*qWBAdbZKsI@+g8t4qFa^E3;c8d=! zRXQJ9+9D)ZTZlf~=4bsi&@oOZ;}fWa&Y()yg4$d^qh{=3N3mV39}dDXZod+>)-|XB zcA*k^7xle!s0w_GTA~hFk^6G8sDCymN;#p@g;1s0f_e*HMLpoS+iyla_$O4tcTkDO zFufa?hA|jRc0No*RVEj;DJP*4twjB@217Jds#?@8eZ#%*A!-v{M7;%w-T%0&K z^4lInRpcnfViRf;H=`17MLl2BR^ootI3rP;J2a7oGMesQSb!S%8P^*3d@V9r+l!s? zV_b^oaSo0fVzvzTqY~;uS@UrSYT&u3rCEWjrqv^>5wepsRPygp8UKgc1Ko2XGxB2r z{cL11_7tk*b*K_Hq9*VjD)F{Hzr~#<or6>@O4*7O(+ ztw{?;(jFwz(Z@V%v#gw?7_tIbKhG)Jx8IPtVSK=<7|}=*;uvdtav2 zejIWRdeTzXwRcf3gjV{1)9e|Yx`UQptstReCs9Ofar_CHgLcz;g3zx)1@Q{ee$1dT zhFDCjca|k&MAbQU30dX)=x-ua%PL|S(TC8nhNva>5>FG_09xEq;t}F`LWf=n9s19q z<3-2o&Gc@drIngb)H`Fm8Ty(nA+(M<9wwe`YnhG4t%NqsK|*V%VqiH|w~ diff --git a/mayan/apps/documents/locale/es/LC_MESSAGES/django.po b/mayan/apps/documents/locale/es/LC_MESSAGES/django.po index c1be8a4118..7174a228d2 100644 --- a/mayan/apps/documents/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/documents/locale/es/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:11-0400\n" -"PO-Revision-Date: 2016-04-27 18:22+0000\n" +"PO-Revision-Date: 2016-05-09 01:41+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" @@ -458,7 +458,7 @@ msgstr "Versión de documento" #: models.py:632 msgid "Quick label" -msgstr "" +msgstr "Etiqueta rapida" #: models.py:650 msgid "Page number" diff --git a/mayan/apps/folders/locale/es/LC_MESSAGES/django.mo b/mayan/apps/folders/locale/es/LC_MESSAGES/django.mo index 7c6b6cfc649ad7926a9265db40cdaed1d833bf6f..daf5b2648a65ddea9319adde5f58b8320415dc89 100644 GIT binary patch delta 1053 zcmY+?O=uHA6u|MxrpcyhYHC}J(WqRCW=56QuNcl^9 z)10EjsWED|N2z_-Z}6b}!M*qwH(|o7R2YwAD-OF}z;*N|(8OtM!@KCmIrsfT+(>^O ziBncp8uH->Jci#;ChTfb>M)LA9PeW@KF0{YLVjwIhb-tLhVVPegv%%k`G?!l@F~Sl z#d+++1SXkZ4bez2P{OVF7~Am;7I6_J@E}nikev}s)Bj3z`MxWl)CNrBdOU}ciOa4x zP!=?UTX5Fx&tsVR)e9P%v5KAe871H^9KZnE?!z;91ZPlo@D79c1Lf$JQ6_3*P&N=j z$xIR@6DcI5O5<)kjb#}q(MaHJl+-`LZv2EYk*{TCLA&q{{i7%usUiufO~%}{-AP8I zNCu=BRM`xn8b!`u?o#dichKmd${9-*WTg^ZirfoXpzKPDq_XawPUgm@ zCY;Hl+t;=?s)OF2Ed!bH`dH<+_pB#0I_{Jj(N6iUH}~%8>9czFrw-`_-z`1tKOY*h zC$m#_)=61TK|l3hi)Hgp*3MfQcaB`avaK;Yf7L141syf}^`O}sPUrG@K5C5LG-JsV pD<4@IXZ6p@9W1OF)k|iy^2`i+^rL`3P>)i18MxW!16BsT|> zav)1CN;x1GDHj(<%SGh>jPW$j`}>}m`QGihah>Hvo}A`&MHG@n3p>Hg~Wd4+lUM$BNtj0d9!g(yl9dzP3PU9V}a=0#D?qGfO!0fsFP{8b2*nsKS zfwFKv%Iyp#>S-*XUcex3U@Jai8|K;mHZ*_^>RFVVT|}903uQyQXk~qM!~-97#!!P- ziTVSpsDDtdu99o2#X*!4FQIIF52JX3(lyzv93+L51toGwY1@CK@*wYq=a$?yn zb0}IB4>u!+iU+qI?{9XZ{zqCS!5&pU$?eAbF0GMp>W`#m9W?57)F{;lhFiZHU$HlH z$fQG-IeTNB-{<{9 diff --git a/mayan/apps/folders/locale/es/LC_MESSAGES/django.po b/mayan/apps/folders/locale/es/LC_MESSAGES/django.po index 99c9468f65..789c81420c 100644 --- a/mayan/apps/folders/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/folders/locale/es/LC_MESSAGES/django.po @@ -1,26 +1,25 @@ # 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: # jmcainzos , 2014 # Lory977 , 2015 # Roberto Rosario, 2012,2015 -# Roberto Rosario, 2015 +# Roberto Rosario, 2015-2016 msgid "" msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:12-0400\n" -"PO-Revision-Date: 2016-03-21 21:11+0000\n" +"PO-Revision-Date: 2016-05-09 01:41+0000\n" "Last-Translator: Roberto Rosario\n" -"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/" -"language/es/)\n" -"Language: es\n" +"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: apps.py:33 links.py:16 links.py:44 models.py:45 permissions.py:7 @@ -74,35 +73,37 @@ msgstr "Fecha y hora que fue creado" #: models.py:63 msgid "Document folder" -msgstr "" +msgstr "Carpeta de documento" #: models.py:64 msgid "Document folders" -msgstr "" +msgstr "Carpetas de documento" #: permissions.py:10 msgid "Create folders" -msgstr "" +msgstr "Crear carpetas" #: permissions.py:13 msgid "Edit folders" -msgstr "" +msgstr "Editar carpetas" #: permissions.py:16 +#| msgid "Delete new folders" msgid "Delete folders" -msgstr "" +msgstr "Borrar carpetas" #: permissions.py:19 msgid "Remove documents from folders" msgstr "Eliminar documentos de las carpetas" #: permissions.py:22 +#| msgid "Edit new folders" msgid "View folders" -msgstr "" +msgstr "Ver carpetas" #: permissions.py:27 msgid "Add documents to folders" -msgstr "" +msgstr "Agregar documentos a carpetas" #: serializers.py:58 msgid "Primary key of the document to be added." @@ -110,6 +111,7 @@ msgstr "Llave primaria del documento a ser agregado." #: views.py:54 #, python-format +#| msgid "Delete new folders" msgid "Delete the folder: %s?" msgstr "¿Eliminar la carpeta: %s?" @@ -215,11 +217,11 @@ msgstr[1] "¿Eliminar los documentos seleccionados de la carpeta: %(folder)s?" #~ msgstr "Add documents: %s to folder." #~ msgid "" -#~ "Are you sure you wish to remove the documents: %(documents)s from the " -#~ "folder \"%(folder)s\"?" +#~ "Are you sure you wish to remove the documents: %(documents)s from the folder" +#~ " \"%(folder)s\"?" #~ msgstr "" -#~ "Are you sure you wish to remove the documents: %(documents)s from the " -#~ "folder \"%(folder)s\"?" +#~ "Are you sure you wish to remove the documents: %(documents)s from the folder" +#~ " \"%(folder)s\"?" #~ msgid "Document" #~ msgstr "document" @@ -252,12 +254,12 @@ msgstr[1] "¿Eliminar los documentos seleccionados de la carpeta: %(folder)s?" #~ msgstr "What are folders?" #~ msgid "" -#~ "These folders can also be described as user folders. They are a way to " -#~ "let individual users create their own document organization methods. " -#~ "Folders created by one user and the documents contained by them don't " -#~ "affect any other user folders or documents." +#~ "These folders can also be described as user folders. They are a way to let " +#~ "individual users create their own document organization methods. Folders " +#~ "created by one user and the documents contained by them don't affect any " +#~ "other user folders or documents." #~ msgstr "" -#~ "These folders can also be described as user folders. They are a way to " -#~ "let individual users create their own document organization methods. " -#~ "Folders created by one user and the documents contained by them don't " -#~ "affect any other user folders or documents." +#~ "These folders can also be described as user folders. They are a way to let " +#~ "individual users create their own document organization methods. Folders " +#~ "created by one user and the documents contained by them don't affect any " +#~ "other user folders or documents." diff --git a/mayan/apps/linking/locale/es/LC_MESSAGES/django.mo b/mayan/apps/linking/locale/es/LC_MESSAGES/django.mo index 714ae3dda4d528afc8ec350eb8263b64ef9548d7..34a4d0f492b336f931d89f0189267e995d933e59 100644 GIT binary patch literal 5055 zcmbuCO^h5z6@beSAS{3R1w#0#II+D;n4h(s*q+5oY`hUByI|R4OB@iYovxiNr>A?| z)wAohWr;(iC_)@S3Xr2A8~`B%MnXhF0hSX;5Tpo@KoKB;-~tzr0^-2;s(Yq;y<_`8 zX?wo@sjBzty;rZ^zIxYf&neo6x!%k5-(5P!FR(`a0WW~KA6Kh z;1}S%@T>5h@CWdX@MX9g{-*r?A9xqfckrv+u&c| zZSbG)KKO5VH@y2zg&zALf9fzl--nMwk^dSLz3;zWsrSIWP~IPdsH7q&dYp&vfSXX} zdA8)|p^SeX%J>)HTi{Dj?Dli`A^2B#5Z=oo9)}-;qUUF!nDlFqF6!%0*7aS;pZWzq zGS6?J%=<6+ez*&vqK}5szYRs-B`E$l4IhS2!MDOMmG57GBJYRrb@0bf=KU#@d0&Q~ z!`J_SkMewl!5@I%gVOI6xDWmTihpm%_z%GQN-jW5uRaCEj}er3c&_9%c%0{7LGkxJ z7+1#cgNRfo;aS*)55aFh>Gw-0^Zp5n{J%k&_fCu;>u*6B|0Mh!JO}r}{U|B#KMAE@ z1V!FwpxFB>@E-V0C~^8DDE|F56nU>gk^g5X_IwRW|A+2W>VxnIJOCrO0KW`R!&l&g za36y)r+N~Kyk#isItRs`m!YiZ87O*w8;ag9LQJgw2>DZg=SRlxBB;erGq3~ap!AEN z^t%AXuTMjf`%L-$Svbq{7t8nDP8zNVwvq4B_Hc;~;&*9cXK4%#HaP-iZ4z(Na7BpG z!%%D@t;yBm5?f0S!5v{AfUr-s+|cH@_H)VFWj)d)?sjvDA0$?#Ne(!`B{q{LK6qES zEA00O_u?PfW75PI<0f`%aN&}$H`qeK*J8&um-s`P*iH8ExXJz$o6d8IjiurK&<>SU z$D&9lc0>2lByzb+6R-1B`+>=F9lPYIj^4e;?^egwjf>4nY;~0OMgyDVI^P^xuRbyv zSG(1#X|`>SJ#@^h$!#TP{6d6R;-V%DLZcEhqSMwE$KDM(n?GCYnrJb@19HHOUxsHq88KvG1JUt&P{2jj>K7!udS5 zF(0e>w$D;%w3(QJ>uEe=W3`9_!%tn<#IM(X2@}YWT5qow!^$I=+e{ms+rdyY6U8!{ zL^f;cv)<|x=S|X2_jw)JRWpi-hN7cO`e>8%N2YJ}>{^}=eW%r8J-!)*A;T;^Z+m&O zmkwGsY0WnewKBWf8q4vmm63~cm-yCPQ+L;_zI?d~xhq%1-?_b*>vfa4;3Vg@83$)m zEoK>^*SCqy472ogR5#Irgu>#*VP?H2)YTJdW?et21eiR}+{%bZJDIH8EN3&ILY($7 za=IEG(xFV9W=*vetiFU3t0+|4AANX65A|`|7YC~|lbuz&)fYxK+tgN+4}Ph7`C2z0 zqI4V_p`%#HCB1kg>(SVP<*=wI^c3A!UFLJ`uy0d!*XWR0Sw0)MSlhtnCNjB^<(W9v zDTA_!L3}x=+6f{fNptC&Zq(#>HfT>Gc&r|=AsM2n&N+6tz36=KM>UgICW(~z)8OvO zjh^ip0*qHS@nocRJEsUduQy!2R^3hOhHCc0$ixJzs@>n9Yd<8U45ykzy4RmIK~$g0 zg&u6<%=SmI;bRp<44wMn24Z7kZz6N@uuUNLRcWStP7*HHUAvz)@2O%}HBLs2b2gJ$ z=;&p$X%fA7V)@L>X**1_ys_;2E@~Vf^?jq8cJ$1tPjnk0Ez`eog7EC<{q6Zj8|{OQ z{fG4Y!Or{v?%QoTHcs1hC-ZLW_ei6CM7QTV2ip&~X){a4=Z$V=5>L*MP(Gcmu!~aY z*{>-biqz2PS~KYAGeeU&zg8p)^2El*Ml+Y;Zq;54DIzNdX03s&reULjZ;kUy%aSB! zmQOA(R*Rl*wr4n!a^kzuCHy)hri*!t9OjY*-CHx6xB1bt-6tA{t9~MJ)n<*wq?bl) z){Z{B;_`{I9c}&0sd$u`xIxAk_>NA7;n5%6zo3iTqqB*A;HaLTTbNPDw!UK`m+53= z*U9Z61^2L>m2}BL5u2U_cy41yrV_JZ+X-f^Au-oIp@%1 zX6mdYJ8^F|)?n*eQoa}^Qw9Wm)3S%?j{HJdiSUWGUL8-f%w*~(FBLbn>2J2a$I5Y2 zBo}8<>;^88y%h{}olG%~%s#P=E|wkZp6vKFv*KdMhS4^@k$|1{RXbmK9Wt4i)CKj_ywfsj*(?%(WVxFbZ=u*$anUC7R=y>ZI^#i^`eyAQIsU8-~`NvyX!ef#h#xJ+$45~6o z9X=EjxTAQi@6EFQVXZ9GQN15EtDe&7jILU z4X7A!-Z(epJF-T7cT=07-L#-D>J`b&UTrD~8b?VvxzV%84E2fpM`SdI)7Fcg6&gRM zD4Zpai3jTUHysmh@M6kV=_CUXU@xLy8Z^(}+cE!nfi^BC)7iLMAE;nOl6m er3#j6bD~0cs8mQ&m1431rn^*_qyBKyss9HJQ<=j6 delta 1257 zcmYk*O-R#m9LMor?!i4dA2Lf@?!k1KT5gtyb*M~;B#PN7+73geWVHo4QVa$K)uG7v z(IM!tQzFqJb}EEU9U`KG9ioFlbg)AZREMHN@6S@`%YJ+P_uv2b^!@(+FXF#D%WEyp z`-V6`3(;1#7;_vm4!(#vr!hS^k3Ov6E_{ql_zJh-2W-P{=*D`NF)bLxL5yM$$I**9 z+-XeNT;PH}<|ek|ZQP2FP!l}IdVGyqz$$j&8piM!@-ZQ1)dVqY#009}(G5?a`lnI- zGw5f2bA=1-{5tky1(l6Acm(ShMGHHIN=g1YO2*V8wif3>f?_w8zLK0%!90X11 zL2aNJS)&<7ZD0ho(CHxg@8P1v4aPPPQ43f`4X}br^-E0QXVi0H3aaP&QKdPIns@~D z|0wRk^u~QHqMN3J_kXmh{`+a_q?&6no1qM7wF(_bWhg<@zzUT>q0A_BNFy}uOy@?K z>!&HSd)98kG;K_;q~1EsUyA|0b&8e7WbMws8flk0t@~)(X>6z#&3vo2+Pz*^g-*Zf z-m4#kGN%KmP}yQMm3uR&mW{i5?Ri((M%`ofn!DYZigeG|@9tC8kY~){9U4d`BFRK5 zVT=BSz{y-;s+60`ry}_o`^A6GrUMi9U0~5x8)ki@#fj3Td||dYW0!+*JJ{&5>%l_x IY}2IUFTsUw!T, 2014 # Lory977 , 2015 +# Roberto Rosario, 2016 msgid "" msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:13-0400\n" -"PO-Revision-Date: 2016-03-21 21:10+0000\n" +"PO-Revision-Date: 2016-05-09 01:40+0000\n" "Last-Translator: Roberto Rosario\n" -"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/" -"language/es/)\n" -"Language: es\n" +"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: apps.py:33 @@ -31,7 +31,7 @@ msgstr "Etiqueta" #: apps.py:62 models.py:25 msgid "Dynamic label" -msgstr "" +msgstr "Etiqueta dinámica" #: apps.py:66 apps.py:71 models.py:27 models.py:124 msgid "Enabled" @@ -145,20 +145,18 @@ msgstr "está en la expresión regular (no sensible a mayúsculas)" #: models.py:21 models.py:114 msgid "" "Enter a template to render. Use Django's default templating language " -"(https://docs.djangoproject.com/en/1.7/ref/templates/builtins/). The " -"{{ document }} context variable is available." -msgstr "" +"(https://docs.djangoproject.com/en/1.7/ref/templates/builtins/). The {{ " +"document }} context variable is available." +msgstr "Introduzca una plantilla para generar. Use el lenguaje de plantillas de Django (https://docs.djangoproject.com/en/1.7/ref/templates/builtins/). La variable {{ document }} está disponible en el contexto de la plantilla." #: models.py:43 #, python-format msgid "Error generating dynamic label; %s" -msgstr "" +msgstr "Error generando etiqueta dinámica; %s" #: models.py:52 msgid "This smart link is not allowed for the selected document's type." -msgstr "" -"Este enlace inteligente no está permitido para el tipo de documento " -"seleccionado." +msgstr "Este enlace inteligente no está permitido para el tipo de documento seleccionado." #: models.py:88 models.py:100 msgid "Smart link" @@ -224,17 +222,16 @@ msgstr "Documentos en enlace inteligente: %s" #: views.py:81 #, python-format -msgid "" -"Documents in smart link \"%(smart_link)s\" as related to \"%(document)s\"" -msgstr "" +msgid "Documents in smart link \"%(smart_link)s\" as related to \"%(document)s\"" +msgstr "Los documentos en enlace inteligente \"%(smart_link)s\" en relación con \"%(document)s\"" #: views.py:97 msgid "Available document types" -msgstr "" +msgstr "Tipos de documentos disponibles" #: views.py:99 msgid "Document types enabled" -msgstr "" +msgstr "Tipos de documentos seleccionados" #: views.py:108 #, python-format @@ -253,8 +250,9 @@ msgstr "Editar enlace inteligente: %s" #: views.py:210 #, python-format +#| msgid "Delete smart links" msgid "Delete smart link: %s" -msgstr "" +msgstr "Borrar enlace inteligente: %s" #: views.py:222 #, python-format @@ -272,8 +270,9 @@ msgstr "Editar condición de enlace inteligente" #: views.py:334 #, python-format +#| msgid "Edit smart link condition" msgid "Delete smart link condition: \"%s\"?" -msgstr "" +msgstr "¿Borrar condición de enlace inteligente: \"%s\"?" #~ msgid "Smart link condition: \"%s\" created successfully." #~ msgstr "Smart link condition: \"%s\" created successfully." @@ -379,14 +378,14 @@ msgstr "" #~ msgstr "What are smart links?" #~ msgid "" -#~ "Smart links are a set of conditional statements that are used to query " -#~ "the database using the current document the user is accessing as the data " -#~ "source, the results of these queries are a list of documents that relate " -#~ "in some manner to the document being displayed and allow users the " -#~ "ability to jump to and from linked documents very easily." +#~ "Smart links are a set of conditional statements that are used to query the " +#~ "database using the current document the user is accessing as the data " +#~ "source, the results of these queries are a list of documents that relate in " +#~ "some manner to the document being displayed and allow users the ability to " +#~ "jump to and from linked documents very easily." #~ msgstr "" -#~ "Smart links are a set of conditional statements that are used to query " -#~ "the database using the current document the user is accessing as the data " -#~ "source, the results of these queries are a list of documents that relate " -#~ "in some manner to the document being displayed and allow users the " -#~ "ability to jump to and from linked documents very easily." +#~ "Smart links are a set of conditional statements that are used to query the " +#~ "database using the current document the user is accessing as the data " +#~ "source, the results of these queries are a list of documents that relate in " +#~ "some manner to the document being displayed and allow users the ability to " +#~ "jump to and from linked documents very easily." diff --git a/mayan/apps/mailer/locale/es/LC_MESSAGES/django.mo b/mayan/apps/mailer/locale/es/LC_MESSAGES/django.mo index d301d1323acc1765881a3ed8eec409d50d96a846..3dc483650fb9fd59f2da2d526e6969802a89111c 100644 GIT binary patch literal 3414 zcmcJR%WoS+9LEP*UWS%Z-q6CYph$_@jh&<~Tt%o!T&YqGAu&bbQjK>f_N40_GqW4l ziYjqI0wfR@&IkeGfO4q#2SDKf;(~w!J%Gdkap%a1?{9bgOj3G)QS8soc;+|1_vW|5 z`#%&IgwGNF+#$qq=AHP$_!fK{{0`g?uIv-y0QeesAE>~mKm$GjzMKF433w3m8{lE^ zEAV0PC$Iqi2|f+}1s(+tLijQ81b9FA63Fsj2k!<0@E-7LP6s}Z`6h@z@e#gQ|4+fk z!LLEye-mVTeg})-fxCp51?Rz&U>iIGeg=L3{t7+|M!57n_~L!=bIgz2o9Xcl_yFeL z=llg^{r>=;1ouH{w&N&x2z(KI1Y8Cm1r^Bt+XPwvcfjYsEpQ6_0pxvugM97~ob@0$ zk@FPDc2z(=R|VNWZEz0kfRo@CAWRlNgRg)$!5VlR&gJ==;0pL7cm<^@0e{g)EwsDl6;Ny_ZfZxWC3Q%6h?|N6<0mZ@#bw&u z>`&PkiAaER8dY0<=F+nROd$5&zQ2X4oDvHr z=!zv7E0Phk(JhtDvZq`RV&!zyAZ4ww6q<%u+CxQANez)fV3l+EtY^>Iv`iD@JKWG3 zZoHbG;73}+)jdgL+uX>HnUG66&y0FgTr#jIimg_z|J)T-*s5#_m@KL=LpGGCCN3uU zbVCR5RZO9hSTNBbTGL`xMM3)2*OOAsH?+(GJoe+zdQ#_LiPgmSap77LhFy9iQ3+Bc zwOfUHL)k9%k4%f2YPCa-9B&v-n>?AY+@d<-%Sx!*-0w0){`E*|SC+K5f6w@#vC9m} z)cUL|A_ zC(AQ)crKN&(OXd)n&pn{JLQ#Lpwdiv?)32zM&S|?(W_Y*Ib?&eWm++HWzkqxjFVOy zY={~Oa@eaW*(%d&TSnS7X|fr|?Q*f$>2#)JKCai)wQ1k9iZ(lFi!HXsQ$foW!(2#F zx#Cozda+s=7(FvxDlD2PMlpG{ZW|WG>RMbxcIxOH`Aun^isxUgUGUBh_VJBt%6gT^ zHvs}#rn7Y&_mwS^a)sqEu`={7Ad^wlQ9GTw`Pp-nJEvLS1SaD@P{_+DfP{AvbHd(3u~jjqNSdZ@fEH7faeI-`6mdx9?)SsIbC= zCTeypWNme9SKgDeRTYKOSG|MTjM@^~j=GgQ`|t^uZR!=Z=?P_NyPY2ji@}=@!jPf? z-g7VwX|nw>d#JZMy12+;cWn~|D)O}yLt1kZxVD0?Gl!=M z!K=H)dKm>9>kx<2%`9YlD^jTxKTW~ZkX??BOYgg5THH#gOV$;d4tr-ep{zU-BDHXD ziG29h%4Kp;38_2MY~-iCMUGf59U8>mN{;z8Pw$a{!wH=2{H6*xZ?aa?zy1U@WkaU# oEZECM;dCR>=!|SXXZz?oYw*(gpV|%HOoM_+ea8R8jkJ`109SeP;{X5v delta 690 zcmX}p%PT~26u|M{of$J`JjVMms2LM^h8Z=Q4GAl$k%f|Gro0wHA+ca5PxJ^8?3~8^kE)ljyG&Vhf}GLQhO@MMG-fKQ9e9@9-OvK zVVHUeWg$l>3q8eJyheFGi=Fs{J@}0g?BJz-oW&Ss@R-d#pqu&Cv|FiS{z%#`V?FgY zvO=Y?3~#XtvsjIJloR>HF#cdOhFMKJj-foahVtG%`tbt!sVjzN=2s>cysL5;#b<28 z^1{Cz$1y=Yh*NlK*KasUJ;1Rg@erkJ(iS#nO)eXg2$0einMc|rCs#nukyh|6t6x&c zu4JWh3eqzPX^n*RQck0WWS##ZJCrs`&|<~uTT#xa6V6thapufb*NUM}+*`hAccd>E x>5KQqwBNH+Jf2=z+)OXd$Ak0h`oJ@zKRjLft}tYb=vQyGS?_H$%u(Nv;}?I*L>&MC diff --git a/mayan/apps/mailer/locale/es/LC_MESSAGES/django.po b/mayan/apps/mailer/locale/es/LC_MESSAGES/django.po index 975e5e2128..044ed22df7 100644 --- a/mayan/apps/mailer/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/mailer/locale/es/LC_MESSAGES/django.po @@ -1,29 +1,28 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Lory977 , 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: 2016-04-27 14:13-0400\n" -"PO-Revision-Date: 2016-03-21 21:07+0000\n" +"PO-Revision-Date: 2016-05-09 01:36+0000\n" "Last-Translator: Roberto Rosario\n" -"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/" -"language/es/)\n" -"Language: es\n" +"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: apps.py:25 msgid "Mailer" -msgstr "" +msgstr "Correspondencia" #: apps.py:37 msgid "Date and time" @@ -55,7 +54,7 @@ msgstr "Enviar enlace" #: links.py:22 views.py:31 msgid "Document mailing error log" -msgstr "" +msgstr "Biracora de errores de envío" #: literals.py:7 #, python-format @@ -64,7 +63,7 @@ msgid "" "\n" " --------\n" " This email has been sent from %(project_title)s (%(project_website)s)" -msgstr "" +msgstr "Se adjunta a este correo electrónico es el documento: {{ document }}\n\n\n--------\nEste correo electrónico ha sido enviado desde %(project_title)s (%(project_website)s)" #: literals.py:13 #, python-format @@ -73,7 +72,7 @@ msgid "" "\n" "--------\n" " This email has been sent from %(project_title)s (%(project_website)s)" -msgstr "" +msgstr "Para acceder a este documento, haga clic en el siguiente enlace: {{ link }}\n\n\n--------\nEste correo electrónico ha sido enviado desde %(project_title)s (%(project_website)s)" #: models.py:13 msgid "Date time" @@ -101,7 +100,7 @@ msgstr "Enviar documento por correo electrónico" #: permissions.py:16 msgid "View document mailing error log" -msgstr "" +msgstr "Ver bitácora de errores de envío" #: settings.py:14 msgid "Link for document: {{ document }}" @@ -109,15 +108,11 @@ msgstr "Enlace para el documento: {{ documento }}" #: settings.py:15 msgid "Template for the document link email form subject line." -msgstr "" -"Plantilla para la línea de asunto del correo electrónico para envío de " -"enlace del documento." +msgstr "Plantilla para la línea de asunto del correo electrónico para envío de enlace del documento." #: settings.py:20 msgid "Template for the document link email form body line." -msgstr "" -"Plantilla para el cuerpo del correo electrónico de envío de enlace de " -"documento." +msgstr "Plantilla para el cuerpo del correo electrónico de envío de enlace de documento." #: settings.py:24 msgid "Document: {{ document }}" @@ -125,15 +120,11 @@ msgstr "Documento: {{ document }}" #: settings.py:25 msgid "Template for the document email form subject line." -msgstr "" -"Plantilla para la línea de sujeto del correo electrónico de envio de " -"documento." +msgstr "Plantilla para la línea de sujeto del correo electrónico de envio de documento." #: settings.py:30 msgid "Template for the document email form body line." -msgstr "" -"Plantilla para la línea de cuerpo del correo electrónico para envío de " -"documento." +msgstr "Plantilla para la línea de cuerpo del correo electrónico para envío de documento." #: views.py:56 msgid "Must provide at least one document." @@ -141,9 +132,7 @@ msgstr "Debe proveer al menos un documento" #: views.py:105 msgid "Successfully queued for delivery via email." -msgstr "" -"Añadido de forma exitosa a la lista de espera para envío de correo " -"electrónico" +msgstr "Añadido de forma exitosa a la lista de espera para envío de correo electrónico" #: views.py:114 msgid "Send" diff --git a/mayan/apps/metadata/locale/es/LC_MESSAGES/django.mo b/mayan/apps/metadata/locale/es/LC_MESSAGES/django.mo index 785f8d21c2b56b3d4cc6d93f9cfc19014e265a52..c127b53f98954759baf6792a6f4ffd87dcab2430 100644 GIT binary patch delta 2010 zcmZwHU2GIp7{>8aTB`lpet`wr!f8vPwRBl3i?pbvlp-3ys!&u&?35kK#_i6!vs(o( zR<4MN5X?lv1;&sN(qK#sO^h+buL~1Qyfe`Y0~iyc-U!A^Q~W=(OGAt&yz@IV-8tvH z@0`Oz>}0%fqp9M3L)%TX5r>x;xP0^I#V?;&WJs4tAl3YcVL@e}-Dy&!~m`f>Hbj^)W()S?Fe;N7jNmEMMCWh-FX1Nq z5u31z^fhrCK8rEji*KRczm6^VlkS<{+@YgP@1Zj5swtMd2UU@A)Iz38p2e5A{{pq( z7QRb8uEsSO#c|w+O5{V-ICH3RKF1jThJ_dCtR$UDOrbLQ9<`8rs0k`qHp!V9RHc?< zFSepG9Ya;(W#pThcT3N&;OR0Jiak8v(@wV)Yn#T<6vS=0irqTauT{4+mr*^IX_j;(y3_4qt$oa0T@-_m)T2inaSku{iG zsMBy4_3b01If*^!;yb8K^e2*>`3qI*GLC>Iu0}1W4L9OCv^arU_#3Esf&v{)e5vHG zsEIo{Bl_Vm?!!a)B3?n(WEN1rYhac$TiRg)Bqzmh;O2f)m3~IBb4iLOr!SDWn^EQk5J=$irPb8 zVZYA*w{$e{-#CO-9BM6KC+d73PNCo)CTWPC_MCmYWG}tYKms@gy-oD1rM; zRnezgL#X1~7j?`Z9vPM7e(R;f=Lt6mN7R&;{_q&;8;=p%d{IK5Y!{)upcW@oy>3GL zN2S;P8X?vZYJAbfrn$^0@hGAHMAWttI(}-F=u;>7U}?}YGV3H$&Q!{^Gj7gFI624W zj%VB;S~=C`rrexsbI1Pkw;|i@56_>eyigv|Pkrn7esVhPCgyGR%_X(RlK$dYL4Q^E z*nWOw4rCbHH4{!MNyp2omk;mruH}uim$P2lwcgQi!c5kiO(xug^)k7nm-eGUecj#a zczgNPr4_ZFj>-06w~H9ma?->%FB{A>$dr{qp4GlPrgUUmuF!G{G3DT IcUsQ;3;UuAi2wiq delta 1572 zcmYk*OGs346vy$SqoYlxqot)~Udyt4HNMR(HF^=fP|HL}2OUJQ6d#Zp47ReOT-<^z zf?CufDncRL25sEcq9}?U3s)f_t!g2Cf8#7V%$d)fd++=o=l}mtR;~oXU(@357;%u? zLKelEwP9TxU&OV0`?&v8{#V+$1oA6G1V+= zcez-{jiu zs0p=TKK)x87nH&#Q3G(JzQ*(X{)H67j;%FI!PA(79e4)A$e8Rcs+~`$c79?2Gg-GL zJdU0C05yOW469)e(^E-&sG0atGtI+nY>nO@#hWo^*Kim2H!>P^*nkc;;aMEUjkth} z!G53yycGSt&c8aLOh5JC%marTRLkm6e>{R}_yShoAXegI%*W3d88|OF{Pv+XVaVrA!VQ)12J(*GMh)l*?!lMn;CIx3VS~95thNScD&ukHvFlYA_3{uo(yNI%>dw zQ4M)G0=bxu+Wpn22~4BfnZYW2fqQWgbvnX1)VqU=3Dlz=*+43^WW^*W(s(@*8azS${|jvrh1Mo7a<#f4_i7)ucAlZc?RI=((ca&Gx$P zg12+-Xu>_u+#lcjSpV2y$j%OS2S-A7F4#XBat|dh`^t;UN}aOO+CaHmpE90wB6z81 zG}sfWbwb1Ld`i3P_`kZ@sl#)#sU2}{eR|?tRYr{`y`^_>z#6+oMuYvm H&b;*xuDy~M diff --git a/mayan/apps/metadata/locale/es/LC_MESSAGES/django.po b/mayan/apps/metadata/locale/es/LC_MESSAGES/django.po index 3fb4dfa9b8..7822c8e832 100644 --- a/mayan/apps/metadata/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/metadata/locale/es/LC_MESSAGES/django.po @@ -1,25 +1,25 @@ # 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: # jmcainzos , 2014 # Lory977 , 2015 # Roberto Rosario, 2012,2015 +# Roberto Rosario, 2016 msgid "" msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:13-0400\n" -"PO-Revision-Date: 2016-03-21 21:03+0000\n" +"PO-Revision-Date: 2016-05-09 01:52+0000\n" "Last-Translator: Roberto Rosario\n" -"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/" -"language/es/)\n" -"Language: es\n" +"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: apps.py:52 apps.py:142 links.py:39 permissions.py:7 settings.py:10 @@ -38,9 +38,7 @@ msgstr "" msgid "" "Queryset containing a MetadataType instance reference and a value for that " "metadata type" -msgstr "" -"QuerySet que contiene una referencia de instancia de tipo de meta datos y un " -"valor para ese tipo de meta datos " +msgstr "QuerySet que contiene una referencia de instancia de tipo de meta datos y un valor para ese tipo de meta datos " #: apps.py:118 msgid "Metadata type name" @@ -102,6 +100,7 @@ msgid "Default value error: %s" msgstr "" #: forms.py:116 +#| msgid " Available models: %s" msgid " Available template context variables: " msgstr "" @@ -146,6 +145,7 @@ msgid "Metadata types" msgstr "Tipos de metadatos" #: models.py:42 +#| msgid "Do not use python reserved words, or spaces." msgid "" "Name used by other apps to reference this value. Do not use python reserved " "words, or spaces." @@ -168,8 +168,8 @@ msgstr "Por defecto" #: models.py:60 msgid "" "Enter a template to render. Must result in a comma delimited string. Use " -"Django's default templating language (https://docs.djangoproject.com/en/1.7/" -"ref/templates/builtins/)." +"Django's default templating language " +"(https://docs.djangoproject.com/en/1.7/ref/templates/builtins/)." msgstr "" #: models.py:65 @@ -184,11 +184,12 @@ msgstr "" #: models.py:72 msgid "Validator" -msgstr "" +msgstr "Validador" #: models.py:76 msgid "" -"The parser will reformat the value entered to conform to the expected format." +"The parser will reformat the value entered to conform to the expected " +"format." msgstr "" #: models.py:78 @@ -197,11 +198,11 @@ msgstr "" #: models.py:124 msgid "This metadata is required for this document type." -msgstr "" +msgstr "Este metadato es requerido para este tipo de documento." #: models.py:131 msgid "Value is not one of the provided options." -msgstr "" +msgstr "El valor no es una de las opciones provistas." #: models.py:153 msgid "Document" @@ -314,25 +315,20 @@ msgstr[1] "Editar meta datos de documentos" msgid "" "Error adding metadata type \"%(metadata_type)s\" to document: %(document)s; " "%(exception)s" -msgstr "" -"Error al añadir tipo de metadatos \"%(metadata_type)s\" al documento: " -"%(document)s; %(exception)s" +msgstr "Error al añadir tipo de metadatos \"%(metadata_type)s\" al documento: %(document)s; %(exception)s" #: views.py:272 #, python-format msgid "" -"Metadata type: %(metadata_type)s successfully added to document %(document)s." -msgstr "" -"Tipo de metadatos: %(metadata_type)s añadido con éxito al documento " +"Metadata type: %(metadata_type)s successfully added to document " "%(document)s." +msgstr "Tipo de metadatos: %(metadata_type)s añadido con éxito al documento %(document)s." #: views.py:282 #, python-format msgid "" "Metadata type: %(metadata_type)s already present in document %(document)s." -msgstr "" -"Tipo de metadatos: %(metadata_type)s ya presente en el documento " -"%(document)s." +msgstr "Tipo de metadatos: %(metadata_type)s ya presente en el documento %(document)s." #: views.py:313 msgid "Add metadata types to document" @@ -345,18 +341,14 @@ msgstr[1] "Añadir tipos de meta datos a los documentos" msgid "" "Successfully remove metadata type \"%(metadata_type)s\" from document: " "%(document)s." -msgstr "" -"Remoción con éxito el tipo de meta datos \"%(metadata_type)s\" del " -"documento: %(document)s." +msgstr "Remoción con éxito el tipo de meta datos \"%(metadata_type)s\" del documento: %(document)s." #: views.py:439 #, python-format msgid "" "Error removing metadata type \"%(metadata_type)s\" from document: " "%(document)s; %(exception)s" -msgstr "" -"Error al eliminar el tipo de metadatos \"%(metadata_type)s\" del documento: " -"%(document)s; %(exception)s" +msgstr "Error al eliminar el tipo de metadatos \"%(metadata_type)s\" del documento: %(document)s; %(exception)s" #: views.py:461 msgid "Remove metadata types from the document" @@ -375,8 +367,9 @@ msgstr "Crear tipo de metadatos" #: views.py:529 #, python-format +#| msgid "Delete metadata types" msgid "Delete the metadata type: %s?" -msgstr "" +msgstr "¿Borrar el tipo de metadato: %s?" #: views.py:542 #, python-format @@ -388,12 +381,13 @@ msgid "Internal name" msgstr "Nombre interno" #: views.py:568 +#| msgid "View metadata types" msgid "Available metadata types" -msgstr "" +msgstr "Tipos de metadatos disponibles" #: views.py:569 msgid "Metadata types assigned" -msgstr "" +msgstr "Tipos de metadatos asignados" #: views.py:600 #, python-format @@ -565,47 +559,47 @@ msgstr "Tipos de metadata requerida para tipo de documento: %s" #~ msgstr "What are metadata sets?" #~ msgid "" -#~ "A metadata set is a group of one or more metadata types. Metadata sets " -#~ "are useful when creating new documents; selecing a metadata set " -#~ "automatically attaches it's member metadata types to said document." +#~ "A metadata set is a group of one or more metadata types. Metadata sets are " +#~ "useful when creating new documents; selecing a metadata set automatically " +#~ "attaches it's member metadata types to said document." #~ msgstr "" -#~ "A metadata set is a group of one or more metadata types. Metadata sets " -#~ "are useful when creating new documents; selecing a metadata set " -#~ "automatically attaches it's member metadata types to said document." +#~ "A metadata set is a group of one or more metadata types. Metadata sets are " +#~ "useful when creating new documents; selecing a metadata set automatically " +#~ "attaches it's member metadata types to said document." #~ msgid "What are metadata types?" #~ msgstr "What are metadata types?" #~ msgid "" -#~ "A metadata type defines the characteristics of a value of some kind that " -#~ "can be attached to a document. Examples of metadata types are: a client " -#~ "name, a date, or a project to which several documents belong. A metadata " -#~ "type's name is the internal identifier with which it can be referenced to " -#~ "by other modules such as the indexing module, the title is the value that " -#~ "is shown to the users, the default value is the value an instance of this " -#~ "metadata type will have initially, and the lookup value turns an instance " -#~ "of a metadata of this type into a choice list which options are the " -#~ "result of the lookup's code execution." +#~ "A metadata type defines the characteristics of a value of some kind that can" +#~ " be attached to a document. Examples of metadata types are: a client name, " +#~ "a date, or a project to which several documents belong. A metadata type's " +#~ "name is the internal identifier with which it can be referenced to by other " +#~ "modules such as the indexing module, the title is the value that is shown to" +#~ " the users, the default value is the value an instance of this metadata type" +#~ " will have initially, and the lookup value turns an instance of a metadata " +#~ "of this type into a choice list which options are the result of the lookup's" +#~ " code execution." #~ msgstr "" -#~ "A metadata type defines the characteristics of a value of some kind that " -#~ "can be attached to a document. Examples of metadata types are: a client " -#~ "name, a date, or a project to which several documents belong. A metadata " -#~ "type's name is the internal identifier with which it can be referenced to " -#~ "by other modules such as the indexing module, the title is the value that " -#~ "is shown to the users, the default value is the value an instance of this " -#~ "metadata type will have initially, and the lookup value turns an instance " -#~ "of a metadata of this type into a choice list which options are the " -#~ "result of the lookup's code execution." +#~ "A metadata type defines the characteristics of a value of some kind that can" +#~ " be attached to a document. Examples of metadata types are: a client name, " +#~ "a date, or a project to which several documents belong. A metadata type's " +#~ "name is the internal identifier with which it can be referenced to by other " +#~ "modules such as the indexing module, the title is the value that is shown to" +#~ " the users, the default value is the value an instance of this metadata type" +#~ " will have initially, and the lookup value turns an instance of a metadata " +#~ "of this type into a choice list which options are the result of the lookup's" +#~ " code execution." #~ msgid " Available functions: %s" #~ msgstr " Available functions: %s" #~ msgid "" -#~ "Enter a string to be evaluated. Example: [user.get_full_name() for user " -#~ "in User.objects.all()].%s" +#~ "Enter a string to be evaluated. Example: [user.get_full_name() for user in " +#~ "User.objects.all()].%s" #~ msgstr "" -#~ "Enter a string to be evaluated. Example: [user.get_full_name() for user " -#~ "in User.objects.all()].%s" +#~ "Enter a string to be evaluated. Example: [user.get_full_name() for user in " +#~ "User.objects.all()].%s" #~ msgid "Error deleting document indexes; %s" #~ msgstr "Error deleting document indexes; %s" diff --git a/mayan/apps/ocr/locale/es/LC_MESSAGES/django.mo b/mayan/apps/ocr/locale/es/LC_MESSAGES/django.mo index d61d7d6f11e2e86815aacd16016030d8dab62e95..9de25753b41d84c7bea247355129718db25ab79e 100644 GIT binary patch delta 1173 zcmYk*OGs2v9LMo9zDCVnW|~%ZG)Hlvm}QV;2nH=Ode|Z)h^upziRs>H?wzm{g%%M} zt0AhD(W;g*QbbE3!Zt111Q8@e5N>lLNZ;RdGyibsa~}7e^FNRISpT|l?ptlyV?(s_ z9N-y_8PkU|CHxQ~>v`>_?b<0;&0 z%$ymf&_Kgj)Nu#vso#&<=W!SHH`t3GPy?>xIjkqEZcHL`nLO^sCs>WIP!lg=9e%Z&oQBq+ug!wxE6IZ(3_y%f}MBg< zi}QFK%eS%r+Om@r4&xwd#Yxma0qSU;A!D0`sQ+EmzKq(L71WVb*BG-C6WED;s5^BH zb>=gu#2!RGuVMdVG-xsv@(ST)cI=wg%Z^9G^;`=L51#&E?%oDgmy~N$fMm+ zC`m1(mgf+UF(ZF(ucfF9Ph!P?0u(P#IqGgGYaM}tdsjSH?byFy1B#*5R^)$|xb2ST z`JtUic}bf|PK18wPKDN;a>sL_GnRI(6ZYFgkiSy;HWA*=xHfRZFy&1K=CnVayWx7F zRdcY}o{yJpG@T#1WV3FNOEa>cwaMsJMkW%wP3E%BcxtKO z*(9HYsfPdh2gAo(7 z8?+hE><-@V;D@-t4F16gj)lx-F@sTjf-x-N0Is<48jdo4i`Q`*ui!Tv!XJ3etZEJS zpox7vh=t7xm_+?S5tp!nIsA;gYNwdMGmK*s2Qk7fJ8=}da2!)O?R8RA7@G5@ADg2JQ6X&S2OLYI=P}+G9J?498?a%`47;ATs(`g-(5>hB(KCiYG)Ok@= z>!;}w>3rIuvmcp{K4`?6wQRiT J)joEoynneOPR0NL diff --git a/mayan/apps/ocr/locale/es/LC_MESSAGES/django.po b/mayan/apps/ocr/locale/es/LC_MESSAGES/django.po index 05c5e0f8fa..600e2774be 100644 --- a/mayan/apps/ocr/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/ocr/locale/es/LC_MESSAGES/django.po @@ -1,25 +1,24 @@ # 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: # jmcainzos , 2014 # Lory977 , 2015 -# Roberto Rosario, 2015 +# Roberto Rosario, 2015-2016 msgid "" msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:14-0400\n" -"PO-Revision-Date: 2016-03-21 21:11+0000\n" +"PO-Revision-Date: 2016-05-09 01:31+0000\n" "Last-Translator: Roberto Rosario\n" -"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/" -"language/es/)\n" -"Language: es\n" +"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: apps.py:58 apps.py:116 apps.py:154 links.py:14 permissions.py:7 @@ -65,6 +64,7 @@ msgid "Contents" msgstr "Contenido" #: links.py:18 links.py:25 +#| msgid "Submit documents for OCR" msgid "Submit for OCR" msgstr "Enviar para OCR" @@ -94,11 +94,11 @@ msgstr "Automatically queue newly created documents for OCR." #: models.py:24 msgid "Document type settings" -msgstr "" +msgstr "Configuración del tipo de documento" #: models.py:25 msgid "Document types settings" -msgstr "" +msgstr "Configuraciones de tipos de documento" #: models.py:31 msgid "Document version" @@ -129,6 +129,7 @@ msgid "Document page content" msgstr "Contenido de página de documento" #: models.py:63 +#| msgid "Document pages content clean up error: %s" msgid "Document pages contents" msgstr "Contenido de página de documento" @@ -140,7 +141,7 @@ msgstr "Error interpretando página: %s " #: parsers.py:130 #, python-format msgid "Cannot find pdftotext executable at: %s" -msgstr "" +msgstr "Si no encontró el ejecutable pdftotext en: %s" #: permissions.py:10 msgid "Submit documents for OCR" @@ -155,15 +156,15 @@ msgid "Change document type OCR settings" msgstr "" #: settings.py:10 +#| msgid "File path to unpaper program." msgid "File path to tesseract program." msgstr "" #: settings.py:15 msgid "" -"File path to poppler's pdftotext program used to extract text from PDF files." -msgstr "" -"Ruta de acceso al programa de poppler llamado pdftotext utilizado para " -"extraer texto de archivos PDF." +"File path to poppler's pdftotext program used to extract text from PDF " +"files." +msgstr "Ruta de acceso al programa de poppler llamado pdftotext utilizado para extraer texto de archivos PDF." #: settings.py:22 msgid "Full path to the backend to be used to do OCR." @@ -174,6 +175,7 @@ msgid "Set new document types to perform OCR automatically by default." msgstr "" #: views.py:28 +#| msgid "Submit documents for OCR" msgid "Submit all documents for OCR?" msgstr "¿Enviar todos los documentos para OCR?" @@ -193,17 +195,18 @@ msgid "Document: %(document)s was added to the OCR queue." msgstr "Documento: %(document)s fue añadido a la lista de espera de OCR" #: views.py:87 +#| msgid "Submit documents for OCR" msgid "Submit the selected documents to the OCR queue?" msgstr "" #: views.py:94 +#| msgid "Submit documents for OCR" msgid "Submit all documents of a type for OCR" msgstr "" #: views.py:109 #, python-format -msgid "" -"%(count)d documents of type \"%(document_type)s\" added to the OCR queue." +msgid "%(count)d documents of type \"%(document_type)s\" added to the OCR queue." msgstr "" #: views.py:132 @@ -213,8 +216,9 @@ msgstr "" #: views.py:154 #, python-format +#| msgid "Queued documents: %d" msgid "OCR result for document: %s" -msgstr "" +msgstr "Resultados del OCR para documento: %s" #~ msgid "Delete" #~ msgstr "delete" @@ -384,11 +388,11 @@ msgstr "" #~ msgstr "Are you sure you wish to activate document queue: %s" #~ msgid "" -#~ "Amount of seconds to delay OCR of documents to allow for the node's " -#~ "storage replication overhead." +#~ "Amount of seconds to delay OCR of documents to allow for the node's storage " +#~ "replication overhead." #~ msgstr "" -#~ "Amount of seconds to delay OCR of documents to allow for the node's " -#~ "storage replication overhead." +#~ "Amount of seconds to delay OCR of documents to allow for the node's storage " +#~ "replication overhead." #~ msgid "Maximum amount of concurrent document OCRs a node can perform." #~ msgstr "Maximum amount of concurrent document OCRs a node can perform." @@ -445,11 +449,9 @@ msgstr "" #~ msgstr "Error deleting queue transformation; %(error)s" #~ msgid "" -#~ "Are you sure you wish to delete queue transformation \"%(transformation)s" -#~ "\"" +#~ "Are you sure you wish to delete queue transformation \"%(transformation)s\"" #~ msgstr "" -#~ "Are you sure you wish to delete queue transformation \"%(transformation)s" -#~ "\"" +#~ "Are you sure you wish to delete queue transformation \"%(transformation)s\"" #~ msgid "Queue transformation created successfully" #~ msgstr "Queue transformation created successfully" diff --git a/mayan/apps/smart_settings/locale/es/LC_MESSAGES/django.mo b/mayan/apps/smart_settings/locale/es/LC_MESSAGES/django.mo index 5277c9c7664cf59513758420bd83589dc875e58b..a59d8a9e3abf4685790400f056611cd9bdd55802 100644 GIT binary patch delta 347 zcmXZXKT88K7{~D^XZ2d_308$FR^khgR@A}104E*oP+g9a9=D{>Ybj`-KB$r zvxD!z`W}jdFTl}37r#*-^2;X)A%AA!S2%hrCJt}~$GC|1=+Ak;1$@FgB_nxe;5VMIx`gLg!AtZHxxx*+#So|HANq*v z_=5g|Ij-S5(&UqlqoqK61%Ld0)DQh#c^QA~sAU(ao2ZeRfzC{?m)azA6E!Rx?bVKT vZNGltwt{On4VuN%*e3lrF?DS+_Z_^J8>XvU9otTmem8EV9cwbN)mVN2ln61y delta 284 zcmXZWyJ`YK6vpwh7hM-Gs6;S9$rdRD5pP9;pf6zFAR(}VY`0Cc+9C)xf`T$6g>PUh z)>al4K7;RIYnA_?hxz8m%z?wXI!EW{oVS04N|F*8ksLV@U0FjUjXAXO8H@OG|Lzt diff --git a/mayan/apps/smart_settings/locale/es/LC_MESSAGES/django.po b/mayan/apps/smart_settings/locale/es/LC_MESSAGES/django.po index a0ea2b2b91..bf309b85cf 100644 --- a/mayan/apps/smart_settings/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/smart_settings/locale/es/LC_MESSAGES/django.po @@ -1,25 +1,24 @@ # 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: # Lory977 , 2015 # Roberto Rosario, 2012 -# Roberto Rosario, 2015 +# Roberto Rosario, 2015-2016 msgid "" msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:15-0400\n" -"PO-Revision-Date: 2016-03-21 21:02+0000\n" +"PO-Revision-Date: 2016-05-09 01:32+0000\n" "Last-Translator: Roberto Rosario\n" -"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/" -"language/es/)\n" -"Language: es\n" +"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: apps.py:18 permissions.py:7 @@ -52,7 +51,7 @@ msgstr "Ajustes" #: permissions.py:10 msgid "View settings" -msgstr "" +msgstr "Ver configuraciones" #: views.py:15 msgid "Setting namespaces" diff --git a/mayan/apps/sources/locale/es/LC_MESSAGES/django.mo b/mayan/apps/sources/locale/es/LC_MESSAGES/django.mo index 704a4c700fc960a879e89680deaf4855c6553fd7..551d91245c8dc1dc6d2453f813b14d44f5380060 100644 GIT binary patch delta 2930 zcmZ9MTWl0n7{^abTUw}KD-?<#!$m+W1uRrrp=H&UqTEUgBKPU;&~Dw`DLYeWDdfCWOSx?>{?Rg_HTt@0>Yj&UZcY zMcv)T%+>OOEn81pLJT0}?NS8Pl<+#m87tYH2g90$*b^RJ*jxe0m9ExHDH z7mkE=CB{sI5%@6N45t{AF?$$j!!gKXPKNV$p$EsbZjwbx?+^fK%aGC`(-^#fPB|It6vmAmlOU z=@g;QVGaBaYF}BYG3YiGQ0vp699aYvp%%Cp{icA5h=Fk5>%MN3aoIgezdlnCv;NFw@P8Eev?fXW_yXD9f)wS$Y#n z;cduc?$9Y>Be9xtG2@|XrxGeIp*Gd2h50?*-m=7Ufn z{szk9-=Ge>17(OdZv%yJCX7NEd%v3SJ8S^`of&vnxT#kl%KL>J8O+D1Xo1hHc3m=6Cpl-<^)V@!kJiHE7v^Swb zUx;;Dp9pJVEhLp0lVreS(sbH*7~-^f3rf)t)CcFo_kV^QgiZbf z_x(_gy#i&}VR#h|z(U>sG-gs)rVlp5L$DoQhN{w;xaYzeNFA9|5U0!;h%M$4R4RUi zQgjRIygN|)iwUQ0NhMSbOo7@Lfg{mxS{TfR>!5xReQ*vu0?CRw8}d^4{svUdloC&d zrX9-A-B1emLEVx!U>v>)mqX=GwG)9Ya1G2n#^3}4@d8xnet`;=N>>&aL)AhRlz|OU z3fDtFDY^x@B*D!ALDTJ7sr*Y(8?qQtzH+UB!KQFRB!`;}P@9G1 zBMXsML~Uo#8}kBG1fE0WsoHvE2clZZwI#~`v&>!$-z>zU<1;D=%=K% z4%v>3KvWA`k&Vb)M2*M?sR|}^HMs$-LNcr93K4EYPy@PZjmTzX8lpUwAi1WSVI#`> zT0}P?*Hm23Aj)|)G96itsCLvStKjE08#W`<NF3az7EZg_(Xjjrn`Alu!+8a+Ktf-sv?Rd%ycHHy5mEv2^ zvQsf@kDcgstR6d_W}jJ9S zyW*TW{NC!abBF4nUFh)tw_H8cReC*dW1H`$9m`4D@r2dk#`;b6g}%@5t#B>_iZH?Ae|@ zE7VN{vdZ&6ZN13S0>#w@ zi_o-QO!7?$GNdS9R9rz4C6uy8{}>S?$PpD(1pRqc#EQP(yXQr8*zftAd!PF}=XcKe zo&DAI@sj*xb^PT(+eXw8HKifsF;T{aR$d-LHC9B{;cPy)Vh#30p9j!Kb|ZgbAD2!% zfLG!Lti>_B4!^~Ehx#Y_L0tudaHE-v544~!%wQ6i;T-J6#W;i}G8)}~7iaPLQ+yRC zaVGA+Dug&5!fWs)tiqF+aH^;2_`?h6z@K9SPN13ofexIUG5w+x`l5x%U+Ce|jvLW| zo<|-DhtZWghECuOWUk>nF2YM#-q6V{*u^r4CNM`qFI zhLFFoi%S;{<0?FdJ|Ab6k76ZO;y%oK;~*U~9zioajt=x1`omMmUpUK!@(3THwektN zML(el{f7L7Ke?Dl84nj%4t-CGi%Z{u#R*li{yx~p7Y?`u2QiDy_#T?r_t=fU;yg_A z7VmFHmpG3mK7!ZdD`)~|(S$yX?th66Jc$eNN7uiF&TQ5{jd!CD?8O&L*h{>b&ozvq zOVQfc9(e$p_&kbEIaLLA)B*^QG^97~QfQ`u%gr@eBE5bbRq?G}ABeCY(g8 zKh7ERhmGhAJJF)-K_(Znn87E}Ej)!L^fr2b49O*YjlTbP%;41Y_xaFHh4_Qj=pGIt zV~3q+BE!-BQS=38&>3As6B4EXEJL zbX>aaID|P|j^k)eRI?AOu>t4fBatKM%AG?K7)KNP3f<$s(L}1)cn54kCzM8i*Nu5Q zJL%kkFQ8j+5h?y+#ji!1HDdF0cw(&Pb%fRIGn)wqd5}mE|8LgNokS_Ioai8E&VM>f z?IJv%jf6|LfnX8BLSiN1KHF|59w5@hUBouRJ$D=3!i_|X$Pk`$8;en_2Uozho|y0W z7MX1c@er|!mc>!O9S5TRib(g|ZL{4ivne*~fBEWpg_^ g8h7kD+MFCH97!ID7c#Y5OA34DJ{~JPQGY1*FZ~0w_5c6? diff --git a/mayan/apps/sources/locale/es/LC_MESSAGES/django.po b/mayan/apps/sources/locale/es/LC_MESSAGES/django.po index b6bb0e9cdc..b30ec33594 100644 --- a/mayan/apps/sources/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/sources/locale/es/LC_MESSAGES/django.po @@ -1,26 +1,25 @@ # 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: # jmcainzos , 2014 # jmcainzos , 2015 # Lory977 , 2015 -# Roberto Rosario, 2015 +# Roberto Rosario, 2015-2016 msgid "" msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:15-0400\n" -"PO-Revision-Date: 2016-03-21 21:11+0000\n" +"PO-Revision-Date: 2016-05-09 01:31+0000\n" "Last-Translator: Roberto Rosario\n" -"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/" -"language/es/)\n" -"Language: es\n" +"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: apps.py:37 links.py:31 models.py:145 views.py:521 @@ -28,6 +27,7 @@ msgid "Sources" msgstr "Fuentes" #: apps.py:53 +#| msgid "Create new document sources" msgid "Create a document source" msgstr "Crear una nueva fuente de documentos" @@ -36,10 +36,7 @@ msgid "" "Document sources are the way in which new documents are feed to Mayan EDMS, " "create at least a web form source to be able to upload documents from a " "browser." -msgstr "" -"Las fuentes de documentos son la manera en la que se almacenan nuevos " -"documentos en Mayan EDMS. Crea por lo menos una fuente del tipo formulario " -"web para poder cargar documentos desde un navegador." +msgstr "Las fuentes de documentos son la manera en la que se almacenan nuevos documentos en Mayan EDMS. Crea por lo menos una fuente del tipo formulario web para poder cargar documentos desde un navegador." #: apps.py:65 msgid "Created" @@ -67,8 +64,7 @@ msgstr "Expandir archivos comprimidos" #: forms.py:46 msgid "Upload a compressed file's contained files as individual documents" -msgstr "" -"Subir los archivos de un archivo comprimido como documentos individuales" +msgstr "Subir los archivos de un archivo comprimido como documentos individuales" #: forms.py:67 views.py:432 msgid "Staging file" @@ -250,8 +246,7 @@ msgstr "Intérvalo" #: models.py:273 msgid "Assign a document type to documents uploaded from this source." -msgstr "" -"Asignar un tipo de documento a los documentos subidos desde esta fuente" +msgstr "Asignar un tipo de documento a los documentos subidos desde esta fuente" #: models.py:275 msgid "Document type" @@ -281,9 +276,7 @@ msgstr "SSL" msgid "" "Typical choices are 110 for POP3, 995 for POP3 over SSL, 143 for IMAP, 993 " "for IMAP over SSL." -msgstr "" -"Las opciones típicas son 110 para POP3, 995 para POP3 sobre SSL, 143 para " -"IMAP, 993 para IMAP sobre SSL." +msgstr "Las opciones típicas son 110 para POP3, 995 para POP3 sobre SSL, 143 para IMAP, 993 para IMAP sobre SSL." #: models.py:338 msgid "Port" @@ -302,7 +295,7 @@ msgid "" "Name of the attachment that will contains the metadata type names and value " "pairs to be assigned to the rest of the downloaded attachments. Note: This " "attachment has to be the first attachment." -msgstr "" +msgstr "Nombre del archivo adjunto que contiene los nombres de los tipos de metadatos y los pares de valores que se asignará al resto de los archivos adjuntos descargados. Nota: Este anejo tiene que ser el primer archivo adjunto." #: models.py:349 msgid "Metadata attachment name" @@ -315,8 +308,9 @@ msgid "" msgstr "" #: models.py:356 +#| msgid "Current metadata" msgid "Subject metadata type" -msgstr "" +msgstr "Tipo de metadatos de asunto " #: models.py:360 msgid "" @@ -326,15 +320,15 @@ msgstr "" #: models.py:363 msgid "From metadata type" -msgstr "" +msgstr "Tipo de metadato de remitente" #: models.py:367 msgid "Store the body of the email as a text document." -msgstr "" +msgstr "Almacenar el cuerpo del correo electrónico como un documento de texto." #: models.py:368 msgid "Store email body" -msgstr "" +msgstr "Almacenar cuerpo del correo electrónico" #: models.py:377 #, python-format @@ -417,6 +411,7 @@ msgstr "" #: tasks.py:31 #, python-format +#| msgid "Error creating source; %s" msgid "Error processing source: %s" msgstr "Error procesando fuente: %s" @@ -431,13 +426,12 @@ msgstr "Entradas de bitácora para fuente: %s" #: views.py:129 wizards.py:49 msgid "" -"No interactive document sources have been defined or none have been enabled, " -"create one before proceeding." -msgstr "" -"No se han definido fuentes de documentos interactivos o no hay ninguna " -"habilitada, cree una antes de continuar." +"No interactive document sources have been defined or none have been enabled," +" create one before proceeding." +msgstr "No se han definido fuentes de documentos interactivos o no hay ninguna habilitada, cree una antes de continuar." #: views.py:155 views.py:173 +#| msgid "Document sources" msgid "Document properties" msgstr "Propiedades de documento" @@ -460,10 +454,9 @@ msgid "Document \"%s\" is blocked from uploading new versions." msgstr "" #: views.py:381 -msgid "New document version queued for uploaded and will be available shortly." -msgstr "" -"Nueva versión del documento en cola para ser cargado, estará disponible en " -"breve." +msgid "" +"New document version queued for uploaded and will be available shortly." +msgstr "Nueva versión del documento en cola para ser cargado, estará disponible en breve." #: views.py:419 #, python-format @@ -477,6 +470,7 @@ msgstr "Crear nuevo tipo de fuente: %s" #: views.py:480 #, python-format +#| msgid "Delete document sources" msgid "Delete the source: %s?" msgstr "¿Eliminar la fuente: %s?" @@ -595,11 +589,9 @@ msgstr "" #~ msgstr "Error deleting source transformation; %(error)s" #~ msgid "" -#~ "Are you sure you wish to delete source transformation \"%(transformation)s" -#~ "\"" +#~ "Are you sure you wish to delete source transformation \"%(transformation)s\"" #~ msgstr "" -#~ "Are you sure you wish to delete source transformation \"%(transformation)s" -#~ "\"" +#~ "Are you sure you wish to delete source transformation \"%(transformation)s\"" #~ msgid "Source transformation created successfully" #~ msgstr "Source transformation created successfully" diff --git a/mayan/apps/tags/locale/es/LC_MESSAGES/django.mo b/mayan/apps/tags/locale/es/LC_MESSAGES/django.mo index 095653d97cd57cc73c7c9e77e5c8ead47c7b6f5c..7194a45dbcca4eefc6769147a81e6bc21a998ebd 100644 GIT binary patch delta 1145 zcmYk*Jxo(k7{>78Qb_qvJ|L+hj; zp+DSZOh0ay@kQG#H)byuFpArF7@I4Msl@ZRALCeqS5fQ7a5qlkKD>?Ra1nd)?an-7 z3Jj{a5aMao*or~y!X}I%OH2Z_Zmf9!Cbl!5MLs6SR~zQB1wUX17H|(%u^ZhFp*Glu zVUsatn1Oy^Q9Heldhuh7;Tyb&g`#1e7H2+&B*Q$#0nFhbenCC2F|f1oK5Ss#j}g3% z3NVdryx%M{ctYA=-~r}cY;OpMFoX|~AWW_}&*MSntEkkkAwM-=u@-;eDE`DtI7n0~ z=`v~~@9_|R#tduB76a}07ZRkYC(rfRgnD2URl5Pyi{|kpE}>HT3VZMq>TLW$ou>xs zsoxLdQB2?oTto$$uO|Px@s11H={hR%TEe=5*YGl~pkBOzIy~QS1Vfy-RvbsA^d2_j zBh|8blQ0by^gLlDu6R|wNv!4 zKiWyPqSpqrsbh52UyTI$twr@OHO`G+@8hU?s|1QlB`P)j69~ebE?&?%aOfn&j}ZKf zP)Wb3Ov;=Y@;o~+<#;yv-_Y?^H_LBSL=rZccD$5hi;Gf@H|08$sfmTV?u-}B#sjZ| z7dpFRPWRb(Pj)M?l${HXSB=`44f0rvh>FMXbKKGpSJb&X`aqnky_`Nauh#0Y2 zVK#(^mHaWjhRkZPjJNO`UdB+^EP^p?z$7+e8ufe*tFVBzIE5K}jDxs-cJ5i3gE}sp zU_Cm_>R=moU;?>i!>H$S!Tm|>;d~nT*&2V>@HJk=9qh$2R^xGS{{)qwOLm>+nWZ?; z3*)FvpQ1ke9Pi*;R7c8z5oXJBo_8xIDsT6AojPYVKklmB1@(!w<+K zwu_!J{mcQy*$-^NU#JOxqt>jNzUxC-ynzo;6+FWMe23Z-``C|1sP}7G&m_k1I*y*>ET-Qa>M|Bj>BL3#J^5$eO6s78mTUo}PfZBu182@NHu3R6TUL0(r?qd|34gsRb->V?)A9463bo#9ZO{4D{|DL|S_TbO+q!oYdKoS)N4K4U{!H4< kq_gQ#!da;+%q-2nn3xrsAeltI%vFo3ZD~D, 2014 # Lory977 , 2015 -# Roberto Rosario, 2015 +# Roberto Rosario, 2015-2016 msgid "" msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:16-0400\n" -"PO-Revision-Date: 2016-03-21 21:12+0000\n" +"PO-Revision-Date: 2016-05-09 01:32+0000\n" "Last-Translator: Roberto Rosario\n" -"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/" -"language/es/)\n" -"Language: es\n" +"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: apps.py:33 apps.py:73 apps.py:90 forms.py:34 forms.py:52 links.py:40 @@ -37,7 +36,7 @@ msgstr "Documentos" #: forms.py:53 msgid "Tags to attach to the document." -msgstr "" +msgstr "Etiquetas para anejar al documento." #: links.py:14 msgid "Remove tag" @@ -190,16 +189,22 @@ msgstr "Quitar etiqueta de los documentos: %s." #: views.py:344 #, python-format +#| msgid "" +#| "u sure you wish to remove the tag \"%(tag)s\" from the document: ment)s?" msgid "Remove the tag \"%(tag)s\" from the document: %(document)s?" msgstr "¿Remover la etiqueta \"%(tag)s\" del documento: %(document)s?" #: views.py:351 #, python-format +#| msgid "" +#| "u sure you wish to remove the tag \"%(tag)s\" from the documents: ments)s?" msgid "Remove the tag \"%(tag)s\" from the documents: %(documents)s?" msgstr "¿Remover la etiqueta \"%(tag)s\" de los documentos: %(documents)s?" #: views.py:360 #, python-format +#| msgid "" +#| "u sure you wish to remove the tags: %(tags)s from the document: ment)s?" msgid "Remove the tags: %(tags)s from the document: %(document)s?" msgstr "¿Remover las etiquetas: %(tags)s del documento: %(document)s?" @@ -216,8 +221,7 @@ msgstr "Documento \"%(document)s\" no estaba etiquetado como \"%(tag)s \"" #: views.py:388 #, python-format msgid "Tag \"%(tag)s\" removed successfully from document \"%(document)s\"." -msgstr "" -"Etiqueta \"%(tag)s\" eliminada con éxito del documento \"%(document)s\"." +msgstr "Etiqueta \"%(tag)s\" eliminada con éxito del documento \"%(document)s\"." #~ msgid "remove tags" #~ msgstr "remove tags" diff --git a/mayan/apps/user_management/locale/es/LC_MESSAGES/django.mo b/mayan/apps/user_management/locale/es/LC_MESSAGES/django.mo index 744b313d9a581a8245bbefc5806a08421c2dcc44..3b05df345ad9cc893dcf5cc2fb0afb3edb6325a3 100644 GIT binary patch delta 1160 zcmX}sJ7`l;9LMovO|>_TNsX=b8DotmX^lpMQWHw+16*1kU>y{})P{H=q$QWAxCDg? zMMW^wse*%(IEc~3r3ku+YgZq16DI}5LGk-bPWz`PpL5T-Ip=>K>66G}r1mN7n=?e3 zvW+so%9!J-ujYeD_>5VDNep2cgE)d+c-ppKw$IbnTezP7hqnKzZGVLt?>%lbre;1; z>7ilC`Ukst4z;)1V@Q+9qS}XX1D-=AauwI%b>z>?@R7v3co<)!gWpjT|3bb07sJeN zI%(Cw5nPKI`F zR7l2TQHhM8RydCLISv;Y)BI)`O6VV|zsuh;hWg$hYA44~?_II|RqL$ne~cQhfwe7E z-cZrmFCu4Re&8l_I*n0(ALDa$DO!nki}z5r>w!p6c2V@dK@qC=_;SIc*Ya*DKT#?~t6rhfIOVJO{D)HM zBhmDMY$j9x&~dYV*0~TE&6kVSe6f&?7QFg1r`$d6Rr3{h%8O3A-t<)2WdyI$>v!7! E0~Ksyo&W#< delta 1108 zcmXxjPe>GD7{~Fa9Bp=5*ZfnhYp!FZt(B`gR)QUhJXBE7LGa+EEteIdk|ctH_EH@L z5n8?5p-V^?&q?5|KetjkBwbUY@X#^({>FD7eCPAdJG1ZmKF>RT%`Rmtn=Rg=5d*X% zw1qupqnNDYLZm&j25iSB3^9d+cmOXrZ#awC%=iP;`_J6?0&1SucnFvApjpM%c02YB z+j#KX-Fx+BbS;A#@4{9*gWA9qY{YTo&q`eS@D85CMNHr))WYki_rGHcZettk+dn${ z7-;1!E!2U^U=X|T5+?B$9>x2p4ZOrGzCykC9&`8uCosXJlUPDM|KQw0RVMJ+IO|)6 zjusA48J@*Cj^QdYmu--SHnfR){>SMBaS1JrdY(r;zvvuu&!PMU`+2wO|<|e1ezpEh@vmsCgPFpWbUk&fL0D6&X%a zf0DFu2DFizsEHq8H_oCmTgD+=#lyIRCoteZ^B7@27I6mW@deg#PFiRdb#!mA13#nI z{h6Zv+R+XJn%HOCRNhX}^h1R*SCC9xC4E%2(B}GTH>hm+oZ@6Oe4M6*@-(fZ&{3a` zdt6xGsCK-2z6;w+Q|7%ig~~><)=tyMrs^n2(2mh`9LlH`IXX(D7ANWGzeu4Y(SLQP zZitZ9*~3L2gF+=$nFe%2q^dpM`ITvJ+6#vIqe2)JMha1N%YU4_R=ih!SS*)D!qQCj Qc4DIXF>!b0df?ap2eyk+qW}N^ diff --git a/mayan/apps/user_management/locale/es/LC_MESSAGES/django.po b/mayan/apps/user_management/locale/es/LC_MESSAGES/django.po index 2fea756543..8af4d77d6a 100644 --- a/mayan/apps/user_management/locale/es/LC_MESSAGES/django.po +++ b/mayan/apps/user_management/locale/es/LC_MESSAGES/django.po @@ -1,26 +1,26 @@ # 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: # jmcainzos , 2014 # jmcainzos , 2015 # Lory977 , 2015 # Roberto Rosario, 2012,2015 +# Roberto Rosario, 2016 msgid "" msgstr "" "Project-Id-Version: Mayan EDMS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-04-27 14:16-0400\n" -"PO-Revision-Date: 2016-03-21 21:12+0000\n" +"PO-Revision-Date: 2016-05-09 01:33+0000\n" "Last-Translator: Roberto Rosario\n" -"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/" -"language/es/)\n" -"Language: es\n" +"Language-Team: Spanish (http://www.transifex.com/rosarior/mayan-edms/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: apps.py:29 permissions.py:7 @@ -130,12 +130,13 @@ msgstr "Editar grupo: %s" #: views.py:66 #, python-format +#| msgid "Delete existing groups" msgid "Delete the group: %s?" msgstr "¿Borrar el grupo: %s?" #: views.py:72 msgid "Available users" -msgstr "" +msgstr "Usuarios disponibles" #: views.py:73 msgid "Members of groups" @@ -177,9 +178,7 @@ msgstr "Debe indicar al menos un usuario." msgid "" "Super user and staff user deleting is not allowed, use the admin interface " "for these cases." -msgstr "" -"No se permite eliminar el super usuario y usuario de personal. Use la " -"interfaz de administración para estos casos." +msgstr "No se permite eliminar el super usuario y usuario de personal. Use la interfaz de administración para estos casos." #: views.py:237 #, python-format @@ -193,11 +192,13 @@ msgstr "Error eliminando el usuario \"%(user)s\": %(error)s " #: views.py:255 #, python-format +#| msgid "Delete existing users" msgid "Delete the user: %s?" msgstr "¿Borrar el usuario: %s?" #: views.py:257 #, python-format +#| msgid "Delete existing users" msgid "Delete the users: %s?" msgstr "¿Borrar los usuarios: %s?" @@ -209,9 +210,7 @@ msgstr "Las contraseñas no coinciden. Vuelva a intentarlo." msgid "" "Super user and staff user password reseting is not allowed, use the admin " "interface for these cases." -msgstr "" -"No se permite cambiar la contraseña del super usuario y del usuario de " -"personal. Use la interfaz de administración para estos casos." +msgstr "No se permite cambiar la contraseña del super usuario y del usuario de personal. Use la interfaz de administración para estos casos." #: views.py:319 #, python-format @@ -221,8 +220,7 @@ msgstr "Contraseña restablecida para el usuario: %s." #: views.py:325 #, python-format msgid "Error reseting password for user \"%(user)s\": %(error)s" -msgstr "" -"Error restaurando la contraseña para el usuario \"%(user)s\": %(error)s " +msgstr "Error restaurando la contraseña para el usuario \"%(user)s\": %(error)s " #: views.py:342 #, python-format From 8d549df088da88f0f853d6c6d5e4a6af996967de Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 9 May 2016 19:54:32 -0400 Subject: [PATCH 06/36] Index the is_stub and is_deleted document boolean fields. --- .../migrations/0034_auto_20160509_2321.py | 24 +++++++++++++++++++ mayan/apps/documents/models.py | 8 ++++--- 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 mayan/apps/documents/migrations/0034_auto_20160509_2321.py diff --git a/mayan/apps/documents/migrations/0034_auto_20160509_2321.py b/mayan/apps/documents/migrations/0034_auto_20160509_2321.py new file mode 100644 index 0000000000..bdcae825f8 --- /dev/null +++ b/mayan/apps/documents/migrations/0034_auto_20160509_2321.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('documents', '0033_auto_20160325_0052'), + ] + + operations = [ + migrations.AlterField( + model_name='document', + name='in_trash', + field=models.BooleanField(default=False, verbose_name='In trash?', db_index=True, editable=False), + ), + migrations.AlterField( + model_name='document', + name='is_stub', + field=models.BooleanField(default=True, editable=False, help_text='A document stub is a document with an entry on the database but no file uploaded. This could be an interrupted upload or a deferred upload via the API.', verbose_name='Is stub?', db_index=True), + ), + ] diff --git a/mayan/apps/documents/models.py b/mayan/apps/documents/models.py index bf41bc742e..c866e3491e 100644 --- a/mayan/apps/documents/models.py +++ b/mayan/apps/documents/models.py @@ -169,7 +169,8 @@ class Document(models.Model): verbose_name=_('Language') ) in_trash = models.BooleanField( - default=False, editable=False, verbose_name=_('In trash?') + db_index=True, default=False, editable=False, + verbose_name=_('In trash?') ) # TODO: set editable to False deleted_date_time = models.DateTimeField( @@ -177,10 +178,11 @@ class Document(models.Model): verbose_name=_('Date and time trashed') ) is_stub = models.BooleanField( - default=True, editable=False, help_text=_( + db_index=True, default=True, editable=False, help_text=_( 'A document stub is a document with an entry on the database but ' 'no file uploaded. This could be an interrupted upload or a ' - 'deferred upload via the API.'), verbose_name=_('Is stub?') + 'deferred upload via the API.' + ), verbose_name=_('Is stub?') ) objects = DocumentManager() From 55d53bf4d550b545e21338b501facd35cef1e5d9 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 9 May 2016 19:55:03 -0400 Subject: [PATCH 07/36] 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. --- mayan/apps/navigation/classes.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mayan/apps/navigation/classes.py b/mayan/apps/navigation/classes.py index 2151585b08..d63d9b4fb3 100644 --- a/mayan/apps/navigation/classes.py +++ b/mayan/apps/navigation/classes.py @@ -349,7 +349,10 @@ class SourceColumn(object): try: return cls._registry[source.__class__] except KeyError: - return () + try: + return cls._registry[source._meta.parents.items()[0][0]] + except IndexError: + return () except TypeError: # unhashable type: list return () From f80fa491666e3c7a0889ba5b9cbcc0244c673537 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 9 May 2016 19:56:38 -0400 Subject: [PATCH 08/36] Defer heavy fields when showing a simple list of all documents. --- mayan/apps/documents/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mayan/apps/documents/views.py b/mayan/apps/documents/views.py index 9cdcabf951..5b0fd94d57 100644 --- a/mayan/apps/documents/views.py +++ b/mayan/apps/documents/views.py @@ -85,7 +85,7 @@ class DocumentListView(SingleObjectListView): object_permission = permission_document_view def get_document_queryset(self): - return Document.objects.all() + return Document.objects.defer('description', 'uuid', 'date_added', 'language', 'in_trash', 'deleted_date_time').all() def get_queryset(self): self.queryset = self.get_document_queryset().filter(is_stub=False) From 8ef65a82f5f46a1bfdc3deb056d14775a2f6c7ec Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 9 May 2016 20:27:09 -0400 Subject: [PATCH 09/36] Add missing minor migrations --- .../migrations/0006_auto_20160510_0025.py | 19 +++++++++++ .../migrations/0005_auto_20160510_0025.py | 34 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 mayan/apps/django_gpg/migrations/0006_auto_20160510_0025.py create mode 100644 mayan/apps/motd/migrations/0005_auto_20160510_0025.py diff --git a/mayan/apps/django_gpg/migrations/0006_auto_20160510_0025.py b/mayan/apps/django_gpg/migrations/0006_auto_20160510_0025.py new file mode 100644 index 0000000000..b2a65a9abd --- /dev/null +++ b/mayan/apps/django_gpg/migrations/0006_auto_20160510_0025.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('django_gpg', '0005_remove_key_key_id'), + ] + + operations = [ + migrations.AlterField( + model_name='key', + name='key_data', + field=models.TextField(help_text='ASCII armored version of the key.', verbose_name='Key data'), + ), + ] diff --git a/mayan/apps/motd/migrations/0005_auto_20160510_0025.py b/mayan/apps/motd/migrations/0005_auto_20160510_0025.py new file mode 100644 index 0000000000..2f87651d4c --- /dev/null +++ b/mayan/apps/motd/migrations/0005_auto_20160510_0025.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('motd', '0004_auto_20160314_0040'), + ] + + operations = [ + migrations.AlterField( + model_name='message', + name='end_datetime', + field=models.DateTimeField(help_text='Date and time until when this message is to be displayed.', null=True, verbose_name='End date time', blank=True), + ), + migrations.AlterField( + model_name='message', + name='label', + field=models.CharField(help_text='Short description of this message.', max_length=32, verbose_name='Label'), + ), + migrations.AlterField( + model_name='message', + name='message', + field=models.TextField(help_text='The actual message to be displayed.', verbose_name='Message'), + ), + migrations.AlterField( + model_name='message', + name='start_datetime', + field=models.DateTimeField(help_text='Date and time after which this message will be displayed.', null=True, verbose_name='Start date time', blank=True), + ), + ] From f4a415a3e84b464b2aed3c3b5c5c65814baba142 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 10 May 2016 01:11:38 -0400 Subject: [PATCH 10/36] Add metadata type API tests. --- mayan/apps/metadata/tests/test_api.py | 86 +++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 mayan/apps/metadata/tests/test_api.py diff --git a/mayan/apps/metadata/tests/test_api.py b/mayan/apps/metadata/tests/test_api.py new file mode 100644 index 0000000000..bfa049db46 --- /dev/null +++ b/mayan/apps/metadata/tests/test_api.py @@ -0,0 +1,86 @@ +from __future__ import unicode_literals + +from django.contrib.auth import get_user_model +from django.core.urlresolvers import reverse +from django.test import override_settings + +from rest_framework.test import APITestCase + +from documents.models import DocumentType +from documents.tests import TEST_DOCUMENT_TYPE, TEST_SMALL_DOCUMENT_PATH +from user_management.tests.literals import ( + TEST_ADMIN_EMAIL, TEST_ADMIN_PASSWORD, TEST_ADMIN_USERNAME +) + +from ..models import DocumentMetadata, DocumentTypeMetadataType, MetadataType + +from .literals import ( + TEST_METADATA_TYPE_LABEL, TEST_METADATA_TYPE_LABEL_2, + TEST_METADATA_TYPE_NAME, TEST_METADATA_TYPE_NAME_2 +) + + +class MetadataTypeAPITestCase(APITestCase): + def setUp(self): + self.admin_user = get_user_model().objects.create_superuser( + username=TEST_ADMIN_USERNAME, email=TEST_ADMIN_EMAIL, + password=TEST_ADMIN_PASSWORD + ) + + self.client.login( + username=TEST_ADMIN_USERNAME, password=TEST_ADMIN_PASSWORD + ) + + def tearDown(self): + self.admin_user.delete() + + def test_metadata_type_create(self): + response = self.client.post( + reverse('rest_api:metadatatype-list'), data={ + 'label': TEST_METADATA_TYPE_LABEL, + 'name': TEST_METADATA_TYPE_NAME + } + ) + + metadata_type = MetadataType.objects.first() + + self.assertEqual(response.status_code, 201) + self.assertEqual(response.data['id'], metadata_type.pk) + self.assertEqual(response.data['label'], TEST_METADATA_TYPE_LABEL) + self.assertEqual(response.data['name'], TEST_METADATA_TYPE_NAME) + + self.assertEqual(metadata_type.label, TEST_METADATA_TYPE_LABEL) + self.assertEqual(metadata_type.name, TEST_METADATA_TYPE_NAME) + + def test_metadata_type_delete(self): + metadata_type = MetadataType.objects.create( + label=TEST_METADATA_TYPE_LABEL, name=TEST_METADATA_TYPE_NAME + ) + + response = self.client.delete( + reverse('rest_api:metadatatype-detail', args=(metadata_type.pk,)) + ) + + self.assertEqual(response.status_code, 204) + + self.assertEqual(MetadataType.objects.count(), 0) + + def test_metadata_type_edit(self): + metadata_type = MetadataType.objects.create( + label=TEST_METADATA_TYPE_LABEL, name=TEST_METADATA_TYPE_NAME + ) + + response = self.client.put( + reverse('rest_api:metadatatype-detail', args=(metadata_type.pk,)), + data={ + 'label': TEST_METADATA_TYPE_LABEL_2, + 'name': TEST_METADATA_TYPE_NAME_2 + } + ) + + self.assertEqual(response.status_code, 200) + + metadata_type.refresh_from_db() + + self.assertEqual(metadata_type.label, TEST_METADATA_TYPE_LABEL_2) + self.assertEqual(metadata_type.name, TEST_METADATA_TYPE_NAME_2) From a817aa887f62af4ab8de8da510c5589769c609f0 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 10 May 2016 16:52:29 -0400 Subject: [PATCH 11/36] Add document type metadata type API tests. Improve document type metadata type delete API view. --- mayan/apps/metadata/api_views.py | 29 ++++---- mayan/apps/metadata/serializers.py | 2 +- mayan/apps/metadata/tests/test_api.py | 95 +++++++++++++++++++++++++++ mayan/apps/metadata/urls.py | 10 +-- 4 files changed, 117 insertions(+), 19 deletions(-) diff --git a/mayan/apps/metadata/api_views.py b/mayan/apps/metadata/api_views.py index efc4a72300..6dfbf40db2 100644 --- a/mayan/apps/metadata/api_views.py +++ b/mayan/apps/metadata/api_views.py @@ -15,7 +15,7 @@ from permissions import Permission from rest_api.filters import MayanObjectPermissionsFilter from rest_api.permissions import MayanPermission -from .models import DocumentMetadata, MetadataType +from .models import DocumentMetadata, DocumentTypeMetadataType, MetadataType from .permissions import ( permission_metadata_document_add, permission_metadata_document_remove, permission_metadata_document_edit, permission_metadata_document_view, @@ -265,10 +265,15 @@ class APIDocumentTypeMetadataTypeOptionalListView(generics.ListCreateAPIView): metadata_type = get_object_or_404( MetadataType, pk=serializer.data['metadata_type_pk'] ) - document_type.metadata_type.add( - metadata_type, required=self.required_metadata + document_type_metadata_type = document_type.metadata.create( + metadata_type=metadata_type, required=self.required_metadata + ) + return Response( + status=status.HTTP_201_CREATED, + data={ + 'pk': document_type_metadata_type.pk + } ) - return Response(status=status.HTTP_201_CREATED) else: return Response(status=status.HTTP_400_BAD_REQUEST) @@ -291,18 +296,19 @@ class APIDocumentTypeMetadataTypeRequiredListView(APIDocumentTypeMetadataTypeOpt """ return super( APIDocumentTypeMetadataTypeRequiredListView, self - ).get(*args, **kwargs) + ).post(request, *args, **kwargs) -class APIDocumentTypeMetadataTypeRequiredView(views.APIView): +class APIDocumentTypeMetadataTypeView(views.APIView): def delete(self, request, *args, **kwargs): """ Remove a metadata type from a document type. """ - document_type = get_object_or_404( - DocumentType, pk=self.kwargs['document_type_pk'] + document_type_metadata_type = get_object_or_404( + DocumentTypeMetadataType, pk=self.kwargs['pk'] ) + try: Permission.check_permissions( self.request.user, (permission_document_type_edit,) @@ -310,11 +316,8 @@ class APIDocumentTypeMetadataTypeRequiredView(views.APIView): except PermissionDenied: AccessControlList.objects.check_access( permission_document_type_edit, self.request.user, - document_type + document_type_metadata_type.document_type ) - metadata_type = get_object_or_404( - MetadataType, pk=self.kwargs['metadata_type_pk'] - ) - document_type.metadata_type.remove(metadata_type) + document_type_metadata_type.delete() return Response(status=status.HTTP_204_NO_CONTENT) diff --git a/mayan/apps/metadata/serializers.py b/mayan/apps/metadata/serializers.py index bdecbabd68..cb59e3678a 100644 --- a/mayan/apps/metadata/serializers.py +++ b/mayan/apps/metadata/serializers.py @@ -38,6 +38,6 @@ class DocumentNewMetadataSerializer(serializers.Serializer): class DocumentTypeNewMetadataTypeSerializer(serializers.Serializer): - metadata_type = serializers.IntegerField( + metadata_type_pk = serializers.IntegerField( help_text=_('Primary key of the metadata type to be added.') ) diff --git a/mayan/apps/metadata/tests/test_api.py b/mayan/apps/metadata/tests/test_api.py index bfa049db46..652bd3e70a 100644 --- a/mayan/apps/metadata/tests/test_api.py +++ b/mayan/apps/metadata/tests/test_api.py @@ -84,3 +84,98 @@ class MetadataTypeAPITestCase(APITestCase): self.assertEqual(metadata_type.label, TEST_METADATA_TYPE_LABEL_2) self.assertEqual(metadata_type.name, TEST_METADATA_TYPE_NAME_2) + + +class DocumentTypeMetadataTypeAPITestCase(APITestCase): + def setUp(self): + self.admin_user = get_user_model().objects.create_superuser( + username=TEST_ADMIN_USERNAME, email=TEST_ADMIN_EMAIL, + password=TEST_ADMIN_PASSWORD + ) + + self.client.login( + username=TEST_ADMIN_USERNAME, password=TEST_ADMIN_PASSWORD + ) + + self.document_type = DocumentType.objects.create( + label=TEST_DOCUMENT_TYPE + ) + + self.metadata_type = MetadataType.objects.create( + label=TEST_METADATA_TYPE_LABEL, name=TEST_METADATA_TYPE_NAME + ) + + def tearDown(self): + self.admin_user.delete() + self.document_type.delete() + + def test_document_type_metadata_type_optional_create(self): + response = self.client.post( + reverse( + 'rest_api:documenttypeoptionalmetadatatype-list', + args=(self.document_type.pk,) + ), data={'metadata_type_pk': self.metadata_type.pk} + ) + + self.assertEqual(response.status_code, 201) + + document_type_metadata_type = DocumentTypeMetadataType.objects.filter(document_type=self.document_type, required=False).first() + + self.assertEqual(response.data['pk'], document_type_metadata_type.pk) + + self.assertEqual( + document_type_metadata_type.metadata_type, self.metadata_type + ) + + def test_document_type_metadata_type_required_create(self): + response = self.client.post( + reverse( + 'rest_api:documenttyperequiredmetadatatype-list', + args=(self.document_type.pk,) + ), data={'metadata_type_pk': self.metadata_type.pk} + ) + + self.assertEqual(response.status_code, 201) + + document_type_metadata_type = DocumentTypeMetadataType.objects.filter(document_type=self.document_type, required=True).first() + + self.assertEqual(response.data['pk'], document_type_metadata_type.pk) + + self.assertEqual( + document_type_metadata_type.metadata_type, self.metadata_type + ) + + + def test_document_type_metadata_type_required_create(self): + response = self.client.post( + reverse( + 'rest_api:documenttyperequiredmetadatatype-list', + args=(self.document_type.pk,) + ), data={'metadata_type_pk': self.metadata_type.pk} + ) + + self.assertEqual(response.status_code, 201) + + document_type_metadata_type = DocumentTypeMetadataType.objects.filter(document_type=self.document_type, required=True).first() + + self.assertEqual(response.data['pk'], document_type_metadata_type.pk) + + self.assertEqual( + document_type_metadata_type.metadata_type, self.metadata_type + ) + + def test_document_type_metadata_type_delete(self): + document_type_metadata_type = self.document_type.metadata.create( + metadata_type=self.metadata_type, required=True + ) + + response = self.client.delete( + reverse( + 'rest_api:documenttypemetadatatype-detail', + args=(document_type_metadata_type.pk,) + ), + ) + + self.assertEqual(response.status_code, 204) + + self.assertEqual(self.document_type.metadata.all().count(), 0) diff --git a/mayan/apps/metadata/urls.py b/mayan/apps/metadata/urls.py index e0eea49a8a..79e1505a20 100644 --- a/mayan/apps/metadata/urls.py +++ b/mayan/apps/metadata/urls.py @@ -6,7 +6,7 @@ from .api_views import ( APIDocumentMetadataListView, APIDocumentMetadataView, APIDocumentTypeMetadataTypeOptionalListView, APIDocumentTypeMetadataTypeRequiredListView, - APIDocumentTypeMetadataTypeRequiredView, APIMetadataTypeListView, + APIDocumentTypeMetadataTypeView, APIMetadataTypeListView, APIMetadataTypeView ) from .views import ( @@ -93,16 +93,16 @@ api_urls = patterns( url( r'^document_type/(?P[0-9]+)/metadatatypes/optional/$', APIDocumentTypeMetadataTypeOptionalListView.as_view(), - name='documenttypemetadatatype-list' + name='documenttypeoptionalmetadatatype-list' ), url( r'^document_type/(?P[0-9]+)/metadatatypes/required/$', APIDocumentTypeMetadataTypeRequiredListView.as_view(), - name='documenttypemetadatatype-list' + name='documenttyperequiredmetadatatype-list' ), url( - r'^document_type/(?P[0-9]+)/metadatatypes/(?P[0-9]+)/$', - APIDocumentTypeMetadataTypeRequiredView.as_view(), + r'^document_type_metadata_type/(?P\d+)/$', + APIDocumentTypeMetadataTypeView.as_view(), name='documenttypemetadatatype-detail' ), ) From 5a15a348188f836d7df7f432b42fedc4ca5a6d68 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 10 May 2016 18:57:50 -0400 Subject: [PATCH 12/36] Add document metadata API tests. Fix document metadata list API view. --- HISTORY.rst | 1 + mayan/apps/metadata/api_views.py | 23 ++-- mayan/apps/metadata/apps.py | 2 +- mayan/apps/metadata/serializers.py | 22 +++- mayan/apps/metadata/tests/test_api.py | 154 ++++++++++++++++++++++---- mayan/apps/metadata/urls.py | 10 +- 6 files changed, 175 insertions(+), 37 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index d78952dbf9..9beabfa2b6 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -33,6 +33,7 @@ - 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) ================== diff --git a/mayan/apps/metadata/api_views.py b/mayan/apps/metadata/api_views.py index 6dfbf40db2..569a95277d 100644 --- a/mayan/apps/metadata/api_views.py +++ b/mayan/apps/metadata/api_views.py @@ -23,8 +23,9 @@ from .permissions import ( permission_metadata_type_edit, permission_metadata_type_view ) from .serializers import ( - DocumentMetadataSerializer, DocumentTypeNewMetadataTypeSerializer, - MetadataTypeSerializer, DocumentTypeMetadataTypeSerializer + DocumentMetadataSerializer, DocumentNewMetadataSerializer, + DocumentTypeNewMetadataTypeSerializer, MetadataTypeSerializer, + DocumentTypeMetadataTypeSerializer ) @@ -89,15 +90,14 @@ class APIMetadataTypeView(generics.RetrieveUpdateDestroyAPIView): class APIDocumentMetadataListView(generics.ListCreateAPIView): permission_classes = (MayanPermission,) - serializer_class = DocumentMetadataSerializer def get_document(self): - return get_object_or_404(Document, pk=self.kwargs['document_pk']) + return get_object_or_404(Document, pk=self.kwargs['pk']) def get_queryset(self): document = self.get_document() - if self.request == 'GET': + if self.request.method == 'GET': # Make sure the use has the permission to see the metadata for # this document try: @@ -111,7 +111,7 @@ class APIDocumentMetadataListView(generics.ListCreateAPIView): ) else: return document.metadata.all() - elif self.request == 'POST': + elif self.request.method == 'POST': # Make sure the use has the permission to add metadata to this # document try: @@ -126,8 +126,11 @@ class APIDocumentMetadataListView(generics.ListCreateAPIView): else: return document.metadata.all() - def pre_save(self, serializer): - serializer.document = self.get_document() + def get_serializer_class(self): + if self.request.method == 'GET': + return DocumentMetadataSerializer + elif self.request.method == 'POST': + return DocumentNewMetadataSerializer def get(self, *args, **kwargs): """ @@ -135,6 +138,10 @@ class APIDocumentMetadataListView(generics.ListCreateAPIView): """ return super(APIDocumentMetadataListView, self).get(*args, **kwargs) + def perform_create(self, serializer): + serializer.document = self.get_document() + serializer.save() + def post(self, *args, **kwargs): """ Add an existing metadata type and value to the selected document. diff --git a/mayan/apps/metadata/apps.py b/mayan/apps/metadata/apps.py index 8bb0df6364..75b0e38bf7 100644 --- a/mayan/apps/metadata/apps.py +++ b/mayan/apps/metadata/apps.py @@ -66,7 +66,7 @@ class MetadataApp(MayanAppConfig): DocumentTypeMetadataType = self.get_model('DocumentTypeMetadataType') MetadataType = self.get_model('MetadataType') - APIEndPoint(app=self, version_string='1') + APIEndPoint(app=self, version_string='2') Document.add_to_class( 'metadata_value_of', DocumentMetadataHelper.constructor diff --git a/mayan/apps/metadata/serializers.py b/mayan/apps/metadata/serializers.py index cb59e3678a..3dfa602d01 100644 --- a/mayan/apps/metadata/serializers.py +++ b/mayan/apps/metadata/serializers.py @@ -19,6 +19,7 @@ class DocumentMetadataSerializer(serializers.ModelSerializer): class Meta: fields = ('document', 'id', 'metadata_type', 'value',) model = DocumentMetadata + read_only_fields = ('metadata_type',) class DocumentTypeMetadataTypeSerializer(serializers.ModelSerializer): @@ -28,14 +29,31 @@ class DocumentTypeMetadataTypeSerializer(serializers.ModelSerializer): class DocumentNewMetadataSerializer(serializers.Serializer): - metadata_type = serializers.IntegerField( - help_text=_('Primary key of the metadata type to be added.') + metadata_type_pk = serializers.IntegerField( + help_text=_('Primary key of the metadata type to be added.'), + write_only=True ) + + metadata_type = MetadataTypeSerializer(read_only=True) + + pk = serializers.IntegerField( + help_text=_('Primary key of the document metadata type.'), + read_only=True + ) + value = serializers.CharField( max_length=255, help_text=_('Value of the corresponding metadata type instance.') ) + def create(self, validated_data): + metadata_type = MetadataType.objects.get( + pk=validated_data['metadata_type_pk'] + ) + instance = self.document.metadata.create( + metadata_type=metadata_type, value=validated_data['value'] + ) + return instance class DocumentTypeNewMetadataTypeSerializer(serializers.Serializer): metadata_type_pk = serializers.IntegerField( diff --git a/mayan/apps/metadata/tests/test_api.py b/mayan/apps/metadata/tests/test_api.py index 652bd3e70a..da70c338f2 100644 --- a/mayan/apps/metadata/tests/test_api.py +++ b/mayan/apps/metadata/tests/test_api.py @@ -19,6 +19,9 @@ from .literals import ( TEST_METADATA_TYPE_NAME, TEST_METADATA_TYPE_NAME_2 ) +TEST_METADATA_VALUE = 'test value' +TEST_METADATA_VALUE_EDITED = 'test value edited' + class MetadataTypeAPITestCase(APITestCase): def setUp(self): @@ -119,7 +122,9 @@ class DocumentTypeMetadataTypeAPITestCase(APITestCase): self.assertEqual(response.status_code, 201) - document_type_metadata_type = DocumentTypeMetadataType.objects.filter(document_type=self.document_type, required=False).first() + document_type_metadata_type = DocumentTypeMetadataType.objects.filter( + document_type=self.document_type, required=False + ).first() self.assertEqual(response.data['pk'], document_type_metadata_type.pk) @@ -137,26 +142,9 @@ class DocumentTypeMetadataTypeAPITestCase(APITestCase): self.assertEqual(response.status_code, 201) - document_type_metadata_type = DocumentTypeMetadataType.objects.filter(document_type=self.document_type, required=True).first() - - self.assertEqual(response.data['pk'], document_type_metadata_type.pk) - - self.assertEqual( - document_type_metadata_type.metadata_type, self.metadata_type - ) - - - def test_document_type_metadata_type_required_create(self): - response = self.client.post( - reverse( - 'rest_api:documenttyperequiredmetadatatype-list', - args=(self.document_type.pk,) - ), data={'metadata_type_pk': self.metadata_type.pk} - ) - - self.assertEqual(response.status_code, 201) - - document_type_metadata_type = DocumentTypeMetadataType.objects.filter(document_type=self.document_type, required=True).first() + document_type_metadata_type = DocumentTypeMetadataType.objects.filter( + document_type=self.document_type, required=True + ).first() self.assertEqual(response.data['pk'], document_type_metadata_type.pk) @@ -179,3 +167,127 @@ class DocumentTypeMetadataTypeAPITestCase(APITestCase): self.assertEqual(response.status_code, 204) self.assertEqual(self.document_type.metadata.all().count(), 0) + + +class DocumentMetadataAPITestCase(APITestCase): + @override_settings(OCR_AUTO_OCR=False) + def setUp(self): + self.admin_user = get_user_model().objects.create_superuser( + username=TEST_ADMIN_USERNAME, email=TEST_ADMIN_EMAIL, + password=TEST_ADMIN_PASSWORD + ) + + self.client.login( + username=TEST_ADMIN_USERNAME, password=TEST_ADMIN_PASSWORD + ) + + self.document_type = DocumentType.objects.create( + label=TEST_DOCUMENT_TYPE + ) + + self.metadata_type = MetadataType.objects.create( + label=TEST_METADATA_TYPE_LABEL, name=TEST_METADATA_TYPE_NAME + ) + + self.document_type.metadata.create( + metadata_type=self.metadata_type, required=False + ) + + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: + self.document = self.document_type.new_document( + file_object=file_object, + ) + + def tearDown(self): + self.admin_user.delete() + self.document_type.delete() + + def test_document_metadata_create(self): + response = self.client.post( + reverse( + 'rest_api:documentmetadata-list', + args=(self.document.pk,) + ), data={ + 'metadata_type_pk': self.metadata_type.pk, + 'value': TEST_METADATA_VALUE + } + ) + + document_metadata = DocumentMetadata.objects.get( + document=self.document + ) + + self.assertEqual(response.status_code, 201) + + self.assertEqual(response.data['pk'], document_metadata.pk) + + self.assertEqual(document_metadata.metadata_type, self.metadata_type) + self.assertEqual(document_metadata.value, TEST_METADATA_VALUE) + + def test_document_metadata_list(self): + document_metadata = self.document.metadata.create( + metadata_type=self.metadata_type, value=TEST_METADATA_VALUE + ) + + response = self.client.get( + reverse( + 'rest_api:documentmetadata-list', args=(self.document.pk,) + ) + ) + + self.assertEqual(response.status_code, 200) + + self.assertEqual( + response.data['results'][0]['document'], self.document.pk + ) + self.assertEqual( + response.data['results'][0]['metadata_type'], self.metadata_type.pk + ) + self.assertEqual( + response.data['results'][0]['value'], TEST_METADATA_VALUE + ) + self.assertEqual( + response.data['results'][0]['id'], document_metadata.pk + ) + + def test_document_metadata_edit(self): + document_metadata = self.document.metadata.create( + metadata_type=self.metadata_type, value=TEST_METADATA_VALUE + ) + + response = self.client.put( + reverse( + 'rest_api:documentmetadata-detail', + args=(document_metadata.pk,) + ), data={ + 'value': TEST_METADATA_VALUE_EDITED + } + ) + + self.assertEqual(response.status_code, 200) + + self.assertEqual( + response.data['document'], self.document.pk + ) + self.assertEqual( + response.data['metadata_type'], self.metadata_type.pk + ) + self.assertEqual( + response.data['value'], TEST_METADATA_VALUE_EDITED + ) + + def test_document_metadata_delete(self): + document_metadata = self.document.metadata.create( + metadata_type=self.metadata_type, value=TEST_METADATA_VALUE + ) + + response = self.client.delete( + reverse( + 'rest_api:documentmetadata-detail', + args=(document_metadata.pk,) + ) + ) + + self.assertEqual(response.status_code, 204) + + self.assertEqual(self.document.metadata.all().count(), 0) diff --git a/mayan/apps/metadata/urls.py b/mayan/apps/metadata/urls.py index 79e1505a20..b94acc25a3 100644 --- a/mayan/apps/metadata/urls.py +++ b/mayan/apps/metadata/urls.py @@ -75,11 +75,11 @@ urlpatterns = patterns( api_urls = patterns( '', url( - r'^metadatatypes/$', APIMetadataTypeListView.as_view(), + r'^metadata_types/$', APIMetadataTypeListView.as_view(), name='metadatatype-list' ), url( - r'^metadatatypes/(?P[0-9]+)/$', APIMetadataTypeView.as_view(), + r'^metadata_types/(?P[0-9]+)/$', APIMetadataTypeView.as_view(), name='metadatatype-detail' ), url( @@ -87,16 +87,16 @@ api_urls = patterns( APIDocumentMetadataView.as_view(), name='documentmetadata-detail' ), url( - r'^document/(?P[0-9]+)/metadata/$', + r'^document/(?P\d+)/metadata/$', APIDocumentMetadataListView.as_view(), name='documentmetadata-list' ), url( - r'^document_type/(?P[0-9]+)/metadatatypes/optional/$', + r'^document_type/(?P[0-9]+)/metadata_types/optional/$', APIDocumentTypeMetadataTypeOptionalListView.as_view(), name='documenttypeoptionalmetadatatype-list' ), url( - r'^document_type/(?P[0-9]+)/metadatatypes/required/$', + r'^document_type/(?P[0-9]+)/metadata_types/required/$', APIDocumentTypeMetadataTypeRequiredListView.as_view(), name='documenttyperequiredmetadatatype-list' ), From 6dcbd62c1553b5c908ffbce6738d83609edc1490 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 10 May 2016 19:02:31 -0400 Subject: [PATCH 13/36] Update all mention of "deleted documents" to "trashed documents" in the document app API. GitLab issue #276. --- mayan/apps/documents/api_views.py | 8 ++++---- mayan/apps/documents/urls.py | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mayan/apps/documents/api_views.py b/mayan/apps/documents/api_views.py index a604ad76c6..c33ecfd8e7 100644 --- a/mayan/apps/documents/api_views.py +++ b/mayan/apps/documents/api_views.py @@ -39,7 +39,7 @@ logger = logging.getLogger(__name__) class APIDeletedDocumentListView(generics.ListAPIView): """ - Returns a list of all the deleted documents. + Returns a list of all the trashed documents. """ filter_backends = (MayanObjectPermissionsFilter,) @@ -51,7 +51,7 @@ class APIDeletedDocumentListView(generics.ListAPIView): class APIDeletedDocumentView(generics.RetrieveDestroyAPIView): """ - Returns the selected deleted document details. + Returns the selected trashed document details. """ mayan_object_permissions = { @@ -63,7 +63,7 @@ class APIDeletedDocumentView(generics.RetrieveDestroyAPIView): def delete(self, *args, **kwargs): """ - Delete the selected document. + Delete the trashed document. """ return super(APIDeletedDocumentView, self).delete(*args, **kwargs) @@ -71,7 +71,7 @@ class APIDeletedDocumentView(generics.RetrieveDestroyAPIView): class APIDeletedDocumentRestoreView(generics.GenericAPIView): """ - Restore a deleted document. + Restore a trashed document. """ mayan_object_permissions = { diff --git a/mayan/apps/documents/urls.py b/mayan/apps/documents/urls.py index 53e10a759f..c7dfd59cfd 100644 --- a/mayan/apps/documents/urls.py +++ b/mayan/apps/documents/urls.py @@ -243,16 +243,16 @@ urlpatterns = patterns( api_urls = patterns( '', url( - r'^deleted_documents/$', APIDeletedDocumentListView.as_view(), - name='deleteddocument-list' + r'^trashed_documents/$', APIDeletedDocumentListView.as_view(), + name='trasheddocument-list' ), url( - r'^deleted_documents/(?P[0-9]+)/$', - APIDeletedDocumentView.as_view(), name='deleteddocument-detail' + r'^trashed_documents/(?P[0-9]+)/$', + APIDeletedDocumentView.as_view(), name='trasheddocument-detail' ), url( - r'^deleted_documents/(?P[0-9]+)/restore/$', - APIDeletedDocumentRestoreView.as_view(), name='deleteddocument-restore' + r'^trashed_documents/(?P[0-9]+)/restore/$', + APIDeletedDocumentRestoreView.as_view(), name='trasheddocument-restore' ), url(r'^documents/$', APIDocumentListView.as_view(), name='document-list'), url( From 80e12b2020a6ecd78b9d66ee5a57270a7f1b9cfb Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 10 May 2016 19:56:20 -0400 Subject: [PATCH 14/36] Create a sample document index after the initial setup. GitLab issue #275. --- mayan/apps/document_indexing/apps.py | 10 ++++++-- mayan/apps/document_indexing/handlers.py | 30 ++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/mayan/apps/document_indexing/apps.py b/mayan/apps/document_indexing/apps.py index 3e0bf296ea..ec9d1e8ee6 100644 --- a/mayan/apps/document_indexing/apps.py +++ b/mayan/apps/document_indexing/apps.py @@ -15,6 +15,7 @@ from common import ( menu_setup, menu_tools ) from common.classes import Package +from common.signals import post_initial_setup from common.widgets import two_state_template from documents.signals import post_document_created from mayan.celery import app @@ -22,8 +23,9 @@ from navigation import SourceColumn from rest_api.classes import APIEndPoint from .handlers import ( - document_created_index_update, document_index_delete, - document_metadata_index_update, document_metadata_index_post_delete + document_created_index_update, create_default_document_index, + document_index_delete, document_metadata_index_update, + document_metadata_index_post_delete ) from .links import ( link_document_index_list, link_index_main_menu, link_index_setup, @@ -232,6 +234,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. document_created_index_update, dispatch_uid='document_created_index_update', sender=Document ) + post_initial_setup.connect( + create_default_document_index, + dispatch_uid='create_default_document_index' + ) post_save.connect( document_metadata_index_update, dispatch_uid='document_metadata_index_update', diff --git a/mayan/apps/document_indexing/handlers.py b/mayan/apps/document_indexing/handlers.py index 77322cfb65..eadc8fbceb 100644 --- a/mayan/apps/document_indexing/handlers.py +++ b/mayan/apps/document_indexing/handlers.py @@ -1,8 +1,38 @@ from __future__ import unicode_literals +from django.apps import apps +from django.utils.translation import ugettext_lazy as _ + from .tasks import task_delete_empty_index_nodes, task_index_document +def create_default_document_index(sender, **kwargs): + DocumentType = apps.get_model( + app_label='documents', model_name='DocumentType' + ) + Index = apps.get_model( + app_label='document_indexing', model_name='Index' + ) + + if not Index.objects.count(): + index = Index.objects.create( + label=_('Creation date'), slug='creation_date' + ) + for document_type in DocumentType.objects.all(): + index.document_types.add(document_type) + + root_template_node = index.template_root + node = root_template_node.get_children().create( + expression='{{ document.date_added|date:"Y" }}', index=index, + parent=root_template_node + ) + node.get_children().create( + expression='{{ document.date_added|date:"m" }}', + index=index, link_documents=True, parent=node + ) + + + def document_created_index_update(sender, **kwargs): task_index_document.apply_async( kwargs=dict(document_id=kwargs['instance'].pk) From 24df09ba7181da4283f8d3c8932d786dffb3e08d Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 11 May 2016 00:40:22 -0400 Subject: [PATCH 15/36] Fix switch name, fake initial migrations not all. --- mayan/apps/common/management/commands/performupgrade.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mayan/apps/common/management/commands/performupgrade.py b/mayan/apps/common/management/commands/performupgrade.py index 0060ace44a..69fa4cd4b4 100644 --- a/mayan/apps/common/management/commands/performupgrade.py +++ b/mayan/apps/common/management/commands/performupgrade.py @@ -9,7 +9,7 @@ class Command(management.BaseCommand): help = 'Performs the required steps after a version upgrade.' def handle(self, *args, **options): - management.call_command('migrate', fake=True, interactive=False) + management.call_command('migrate', fake_initial=True, interactive=False) management.call_command('purgeperiodictasks', interactive=False) perform_upgrade.send(sender=self) post_upgrade.send(sender=self) From 39ba60107464eb06093cf1bf013f5652b0ca1c31 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 11 May 2016 00:40:42 -0400 Subject: [PATCH 16/36] Fix API endpoint view name in trashed document API tests. --- mayan/apps/documents/tests/test_api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mayan/apps/documents/tests/test_api.py b/mayan/apps/documents/tests/test_api.py index c258b04b37..579104e5a8 100644 --- a/mayan/apps/documents/tests/test_api.py +++ b/mayan/apps/documents/tests/test_api.py @@ -173,7 +173,7 @@ class DocumentAPITestCase(APITestCase): self.assertEqual(Document.trash.count(), 1) self.client.delete( - reverse('rest_api:deleteddocument-detail', args=(document.pk,)) + reverse('rest_api:trasheddocument-detail', args=(document.pk,)) ) self.assertEqual(Document.trash.count(), 0) @@ -187,7 +187,7 @@ class DocumentAPITestCase(APITestCase): document.delete() self.client.post( - reverse('rest_api:deleteddocument-restore', args=(document.pk,)) + reverse('rest_api:trasheddocument-restore', args=(document.pk,)) ) self.assertEqual(Document.trash.count(), 0) From 9c22fc97147d8c3c1dda5e7ba2d627904e17cf8f Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 11 May 2016 03:37:51 -0400 Subject: [PATCH 17/36] Fix link related object ACL resolution. GitLab issue #274. Thanks to Baptiste GAILLET @bat79a. --- mayan/apps/acls/links.py | 10 +-- mayan/apps/acls/tests/test_links.py | 103 ++++++++++++++++++++++++++++ mayan/apps/navigation/classes.py | 3 +- 3 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 mayan/apps/acls/tests/test_links.py diff --git a/mayan/apps/acls/links.py b/mayan/apps/acls/links.py index 45037f2019..0a40753e8a 100644 --- a/mayan/apps/acls/links.py +++ b/mayan/apps/acls/links.py @@ -23,8 +23,9 @@ 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', @@ -35,6 +36,7 @@ link_acl_create = Link( 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' ) diff --git a/mayan/apps/acls/tests/test_links.py b/mayan/apps/acls/tests/test_links.py new file mode 100644 index 0000000000..f7edc1a51c --- /dev/null +++ b/mayan/apps/acls/tests/test_links.py @@ -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) + ) diff --git a/mayan/apps/navigation/classes.py b/mayan/apps/navigation/classes.py index d63d9b4fb3..d61ae56ed5 100644 --- a/mayan/apps/navigation/classes.py +++ b/mayan/apps/navigation/classes.py @@ -212,6 +212,7 @@ class Link(object): self.keep_query = keep_query self.kwargs = kwargs or {} self.permissions = permissions or [] + self.permissions_related = permissions_related self.remove_from_query = remove_from_query or [] self.tags = tags self.text = text @@ -246,7 +247,7 @@ class Link(object): try: AccessControlList.objects.check_access( self.permissions, request.user, resolved_object, - related=getattr(self, 'permissions_related', None) + related=self.permissions_related ) except PermissionDenied: return None From bc79798723c6420d267d694bc86f75a0237d2f97 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 11 May 2016 03:39:07 -0400 Subject: [PATCH 18/36] Improve printable ACL representation. --- mayan/apps/acls/models.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mayan/apps/acls/models.py b/mayan/apps/acls/models.py index a17612a95c..03db1cbebd 100644 --- a/mayan/apps/acls/models.py +++ b/mayan/apps/acls/models.py @@ -45,7 +45,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( From 516920f833d3e23be62ee134c067a36cad9cc906 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Thu, 12 May 2016 01:33:10 -0400 Subject: [PATCH 19/36] Be more explicit about which requied metadata type is missing. --- mayan/apps/metadata/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mayan/apps/metadata/models.py b/mayan/apps/metadata/models.py index 619a19aa4a..8ff7609517 100644 --- a/mayan/apps/metadata/models.py +++ b/mayan/apps/metadata/models.py @@ -121,7 +121,7 @@ class MetadataType(models.Model): if not value and self.get_required_for(document_type=document_type): raise ValidationError( - _('This metadata is required for this document type.') + _('"%s" is required for this document type.') % self.label ) if self.lookup: From 084f6d4b2f5c247e46f4d8efccbc5113583f9411 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Thu, 12 May 2016 01:35:08 -0400 Subject: [PATCH 20/36] Add an aditional step to verify that the update button is checked on required metadata types. --- mayan/apps/metadata/forms.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mayan/apps/metadata/forms.py b/mayan/apps/metadata/forms.py index d6a5a93cd6..e40ea1aab4 100644 --- a/mayan/apps/metadata/forms.py +++ b/mayan/apps/metadata/forms.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals from django import forms +from django.core.exceptions import ValidationError from django.forms.formsets import formset_factory from django.utils.translation import string_concat, ugettext_lazy as _ @@ -81,6 +82,19 @@ class MetadataForm(forms.Form): ) def clean(self): + metadata_type = getattr(self, 'metadata_type', None) + + if metadata_type: + required = self.metadata_type.get_required_for( + document_type=self.document_type + ) + if required and not self.cleaned_data.get('update'): + raise ValidationError( + _( + '"%s" is required for this document type.' + ) % self.metadata_type.label + ) + if self.cleaned_data.get('update') and hasattr(self, 'metadata_type'): self.cleaned_data['value'] = self.metadata_type.validate_value( document_type=self.document_type, From 7da6408de0474811b16e2c061189a597fbd0c670 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Thu, 12 May 2016 01:48:42 -0400 Subject: [PATCH 21/36] Add second attempt to match a navigation object as an instance of a source. Use for instances from a queryset using .defer() or .only(). --- mayan/apps/navigation/classes.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mayan/apps/navigation/classes.py b/mayan/apps/navigation/classes.py index d61ae56ed5..04cc418a81 100644 --- a/mayan/apps/navigation/classes.py +++ b/mayan/apps/navigation/classes.py @@ -136,6 +136,19 @@ class Menu(object): resolved_links.append(resolved_link) # No need for further content object match testing break + else: + # Second try for objects using .defer() or .only() + if inspect.isclass(bound_source) and isinstance(resolved_navigation_object, bound_source): + for link in links: + resolved_link = link.resolve( + context=context, + resolved_object=resolved_navigation_object + ) + if resolved_link: + resolved_links.append(resolved_link) + # No need for further content object match testing + break + except TypeError: # When source is a dictionary pass From fdf4984468fae52d22eb7350e5267e1089428f23 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Thu, 12 May 2016 03:12:14 -0400 Subject: [PATCH 22/36] Add jquery plugin matchHeigh and use it for the tools and setup buttons. GitLab issue #274. --- .../appearance/packages/jquery.matchHeight-min.js | 12 ++++++++++++ .../appearance/generic_list_horizontal.html | 10 ++++++++++ 2 files changed, 22 insertions(+) create mode 100644 mayan/apps/appearance/static/appearance/packages/jquery.matchHeight-min.js diff --git a/mayan/apps/appearance/static/appearance/packages/jquery.matchHeight-min.js b/mayan/apps/appearance/static/appearance/packages/jquery.matchHeight-min.js new file mode 100644 index 0000000000..495e112ea3 --- /dev/null +++ b/mayan/apps/appearance/static/appearance/packages/jquery.matchHeight-min.js @@ -0,0 +1,12 @@ +/* +* jquery-match-height 0.7.0 by @liabru +* http://brm.io/jquery-match-height/ +* License MIT +*/ +!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):"undefined"!=typeof module&&module.exports?module.exports=t(require("jquery")):t(jQuery)}(function(t){var e=-1,o=-1,i=function(t){return parseFloat(t)||0},a=function(e){var o=1,a=t(e),n=null,r=[];return a.each(function(){var e=t(this),a=e.offset().top-i(e.css("margin-top")),s=r.length>0?r[r.length-1]:null;null===s?r.push(e):Math.floor(Math.abs(n-a))<=o?r[r.length-1]=s.add(e):r.push(e),n=a}),r},n=function(e){var o={ +byRow:!0,property:"height",target:null,remove:!1};return"object"==typeof e?t.extend(o,e):("boolean"==typeof e?o.byRow=e:"remove"===e&&(o.remove=!0),o)},r=t.fn.matchHeight=function(e){var o=n(e);if(o.remove){var i=this;return this.css(o.property,""),t.each(r._groups,function(t,e){e.elements=e.elements.not(i)}),this}return this.length<=1&&!o.target?this:(r._groups.push({elements:this,options:o}),r._apply(this,o),this)};r.version="0.7.0",r._groups=[],r._throttle=80,r._maintainScroll=!1,r._beforeUpdate=null, +r._afterUpdate=null,r._rows=a,r._parse=i,r._parseOptions=n,r._apply=function(e,o){var s=n(o),h=t(e),l=[h],c=t(window).scrollTop(),p=t("html").outerHeight(!0),d=h.parents().filter(":hidden");return d.each(function(){var e=t(this);e.data("style-cache",e.attr("style"))}),d.css("display","block"),s.byRow&&!s.target&&(h.each(function(){var e=t(this),o=e.css("display");"inline-block"!==o&&"flex"!==o&&"inline-flex"!==o&&(o="block"),e.data("style-cache",e.attr("style")),e.css({display:o,"padding-top":"0", +"padding-bottom":"0","margin-top":"0","margin-bottom":"0","border-top-width":"0","border-bottom-width":"0",height:"100px",overflow:"hidden"})}),l=a(h),h.each(function(){var e=t(this);e.attr("style",e.data("style-cache")||"")})),t.each(l,function(e,o){var a=t(o),n=0;if(s.target)n=s.target.outerHeight(!1);else{if(s.byRow&&a.length<=1)return void a.css(s.property,"");a.each(function(){var e=t(this),o=e.attr("style"),i=e.css("display");"inline-block"!==i&&"flex"!==i&&"inline-flex"!==i&&(i="block");var a={ +display:i};a[s.property]="",e.css(a),e.outerHeight(!1)>n&&(n=e.outerHeight(!1)),o?e.attr("style",o):e.css("display","")})}a.each(function(){var e=t(this),o=0;s.target&&e.is(s.target)||("border-box"!==e.css("box-sizing")&&(o+=i(e.css("border-top-width"))+i(e.css("border-bottom-width")),o+=i(e.css("padding-top"))+i(e.css("padding-bottom"))),e.css(s.property,n-o+"px"))})}),d.each(function(){var e=t(this);e.attr("style",e.data("style-cache")||null)}),r._maintainScroll&&t(window).scrollTop(c/p*t("html").outerHeight(!0)), +this},r._applyDataApi=function(){var e={};t("[data-match-height], [data-mh]").each(function(){var o=t(this),i=o.attr("data-mh")||o.attr("data-match-height");i in e?e[i]=e[i].add(o):e[i]=o}),t.each(e,function(){this.matchHeight(!0)})};var s=function(e){r._beforeUpdate&&r._beforeUpdate(e,r._groups),t.each(r._groups,function(){r._apply(this.elements,this.options)}),r._afterUpdate&&r._afterUpdate(e,r._groups)};r._update=function(i,a){if(a&&"resize"===a.type){var n=t(window).width();if(n===e)return;e=n; +}i?-1===o&&(o=setTimeout(function(){s(a),o=-1},r._throttle)):s(a)},t(r._applyDataApi),t(window).bind("load",function(t){r._update(!1,t)}),t(window).bind("resize orientationchange",function(t){r._update(!0,t)})}); \ No newline at end of file diff --git a/mayan/apps/appearance/templates/appearance/generic_list_horizontal.html b/mayan/apps/appearance/templates/appearance/generic_list_horizontal.html index 97bf5c3ab6..3f04c576a0 100644 --- a/mayan/apps/appearance/templates/appearance/generic_list_horizontal.html +++ b/mayan/apps/appearance/templates/appearance/generic_list_horizontal.html @@ -1,6 +1,7 @@ {% extends 'appearance/base.html' %} {% load i18n %} +{% load static %} {% load navigation_tags %} @@ -24,3 +25,12 @@ {% endblock %} + +{% block javascript %} + + +{% endblock %} From 5a885868f8ef19d10589e4c7144920f6f4bb0601 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 13 May 2016 21:02:40 -0400 Subject: [PATCH 23/36] Remove unpaper from installation scripts. --- contrib/scripts/install/development.sh | 2 +- contrib/scripts/install/production.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/scripts/install/development.sh b/contrib/scripts/install/development.sh index 587d27ef8a..a8c9497c46 100644 --- a/contrib/scripts/install/development.sh +++ b/contrib/scripts/install/development.sh @@ -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 diff --git a/contrib/scripts/install/production.sh b/contrib/scripts/install/production.sh index 66abf7d01b..67a14e6490 100644 --- a/contrib/scripts/install/production.sh +++ b/contrib/scripts/install/production.sh @@ -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} From 7fc5f24da9509e8428982a178f49ec18767c03ec Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 13 May 2016 21:02:55 -0400 Subject: [PATCH 24/36] Update release notes. --- docs/releases/2.0.rst | 8 +++---- docs/releases/2.1.rst | 51 +++++++++++++++++++++++++++++++++-------- docs/releases/index.rst | 5 ++-- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/docs/releases/2.0.rst b/docs/releases/2.0.rst index 6487d479d6..2adf8d505c 100644 --- a/docs/releases/2.0.rst +++ b/docs/releases/2.0.rst @@ -27,7 +27,7 @@ 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 @@ -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 @@ -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 diff --git a/docs/releases/2.1.rst b/docs/releases/2.1.rst index cbf2a47ec9..15a30cf918 100644 --- a/docs/releases/2.1.rst +++ b/docs/releases/2.1.rst @@ -1,13 +1,13 @@ -=============================== +============================= Mayan EDMS v2.1 release notes -=============================== +============================= -Released: April, 2016 +Released: May 14, 2016 What's new ========== -Upgrade to use Django 1.8.11 +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 @@ -33,13 +33,13 @@ 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 explcit in describing what the view has or was trying +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 decissions of Mayan EDMS +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 @@ -48,7 +48,7 @@ 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 techique used involved detecting the MIME type of +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. @@ -84,7 +84,13 @@ Fixed date locale handling in document properties, checkout and user detail view 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 happeding, this has been fully fixed. +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 ------------------- @@ -98,7 +104,7 @@ 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 experiation date and +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. @@ -112,7 +118,7 @@ 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 iterface, the way keys are handled has been +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 @@ -136,6 +142,13 @@ Other changes - 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. Removals -------- @@ -190,11 +203,29 @@ Backward incompatible changes Bugs fixed or issues closed =========================== +* `GitLab issue #137 `_ Add app creation chapter to documentation. +* `GitLab issue #147 `_ Add in app document signing. +* `GitLab issue #161 `_ Email backend setup documentation. * `GitLab issue #162 `_ Add HTML5 file uploader. +* `GitLab issue #191 `_ Split index contents title into title and path/breadcrumb widget. +* `GitLab issue #206 `_ Support for dynamic LOGIN_EXEMPT_URLS. +* `GitLab issue #208 `_ Add tagging step to upload wizard. +* `GitLab issue #218 `_ Cookie cutter template for Mayan apps. * `GitLab issue #222 `_ Add notice board or Message of the Day. * `GitLab issue #225 `_ Remove hard coded User model. * `GitLab issue #232 `_ "Create documents" is a blanket permission for a user to create a document of any document type. * `GitLab issue #246 `_ Upgrade to Django version 1.8 as Django 1.7 is end-of-life. +* `GitLab issue #251 `_ Add method to disable metadata edit form "update" checkbox when not needed. * `GitLab issue #255 `_ UnicodeDecodeError in apps/common/middleware/strip_spaces_widdleware.py. +* `GitLab issue #256 `_ typo in locale settings (Dutch). +* `GitLab issue #261 `_ Feature: Document Access Audit Logging. +* `GitLab issue #265 `_ Indexes show list (show indexe only if the user has ACLs on document type). +* `GitLab issue #266 `_ Smart links : Dynamic label with Postgresql. +* `GitLab issue #267 `_ Release 2.1 RC1 : Notes and ideas. +* `GitLab issue #268 `_ Release 2.1 RC1 : Bug to access inside an indexes. +* `GitLab issue #270 `_ Release 2.1 RC1 : Bug statistics. +* `GitLab issue #274 `_ [Release 2.1 RC2] Web Tests. +* `GitLab issue #275 `_ [Release 2.1 RC2] Notes. +* `GitLab issue #276 `_ [Release 2.1 RC2] API Tests. .. _PyPI: https://pypi.python.org/pypi/mayan-edms/ diff --git a/docs/releases/index.rst b/docs/releases/index.rst index e639f5381c..e22b2d91ad 100644 --- a/docs/releases/index.rst +++ b/docs/releases/index.rst @@ -22,9 +22,10 @@ versions of the documentation contain the release notes for any later releases. .. toctree:: :maxdepth: 1 - 2.0 - 2.0.1 + 2.1 2.0.2 + 2.0.1 + 2.0 1.0 series ---------- From 3f9d21167d42ef0f2fba2eb53b3e56c50ff48be0 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 13 May 2016 21:03:12 -0400 Subject: [PATCH 25/36] Update requirements in setup.py --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 385b765c87..bae3406036 100644 --- a/setup.py +++ b/setup.py @@ -56,13 +56,13 @@ def find_packages(directory): return packages install_requires = """ -Django==1.8.11 +Django==1.8.13 Pillow==3.1.0 PyYAML==3.11 celery==3.1.19 cssmin==0.2.0 django-activity-stream==0.6.0 -django-autoadmin==1.1.0 +django-autoadmin==1.1.1 django-celery==3.1.17 django-colorful==1.1.0 django-compressor==2.0 From 715d3c6768ee30a43605d2d02db7b299337086b2 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 13 May 2016 21:15:54 -0400 Subject: [PATCH 26/36] Change log updates. --- HISTORY.rst | 6 +++--- docs/releases/2.1.rst | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 9beabfa2b6..fe0c85c4af 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,6 +1,6 @@ -2.1 (2016-XX) -============= -- Upgrade to use Django 1.8.8. Issue #246. +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'. diff --git a/docs/releases/2.1.rst b/docs/releases/2.1.rst index 15a30cf918..09a6706176 100644 --- a/docs/releases/2.1.rst +++ b/docs/releases/2.1.rst @@ -149,6 +149,13 @@ Other changes - 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 -------- From 7a746653dad87b526feed15a38f0728e1a3a0f35 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 13 May 2016 21:16:05 -0400 Subject: [PATCH 27/36] Bump version to 2.1 --- mayan/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mayan/__init__.py b/mayan/__init__.py index c8419b3fcf..fe54d02e0a 100644 --- a/mayan/__init__.py +++ b/mayan/__init__.py @@ -1,10 +1,10 @@ from __future__ import unicode_literals __title__ = 'Mayan EDMS' -__version__ = '2.1rc2' +__version__ = '2.1' __build__ = 0x020100 __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' From 352457f576e29fc97b56d60d403b01b9405d7ae7 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sat, 14 May 2016 01:49:29 -0400 Subject: [PATCH 28/36] Don't add the current user to the template context to avoid triggering user managment action links. --- mayan/apps/common/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mayan/apps/common/views.py b/mayan/apps/common/views.py index 87598c1f17..5e8f47481d 100644 --- a/mayan/apps/common/views.py +++ b/mayan/apps/common/views.py @@ -33,13 +33,13 @@ class CurrentUserDetailsView(SingleObjectDetailView): def get_extra_context(self, **kwargs): return { - 'object': self.get_object(), + 'object': None, 'title': _('Current user details'), } class CurrentUserEditView(SingleObjectEditView): - extra_context = {'title': _('Edit current user details')} + extra_context = {'object': None, 'title': _('Edit current user details')} form_class = UserForm post_action_redirect = reverse_lazy('common:current_user_details') From 3d722325ca6c1840131f5c98c90f73f38b078eed Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 17 May 2016 01:36:12 -0400 Subject: [PATCH 29/36] Fix navigation object column resolution. Fixes GitLab issue #288. --- HISTORY.rst | 6 ++ docs/releases/2.1.1.rst | 77 +++++++++++++++ docs/releases/index.rst | 1 + mayan/apps/navigation/classes.py | 4 +- mayan/apps/sources/tests/test_views.py | 129 ++++++++++++++++++++++++- 5 files changed, 214 insertions(+), 3 deletions(-) create mode 100644 docs/releases/2.1.1.rst diff --git a/HISTORY.rst b/HISTORY.rst index fe0c85c4af..5d7b8a9f52 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,3 +1,8 @@ +2.1.1 (2016-05-17) +================== +- Fix navigation issue that make it impossible to add new sources. GitLab issue #288. + + 2.1 (2016-05-14) ================ - Upgrade to use Django 1.8.13. Issue #246. @@ -35,6 +40,7 @@ - Add roadmap documentation chapter. - API updates. + 2.0.2 (2016-02-09) ================== - Install testing dependencies when installing development dependencies. diff --git a/docs/releases/2.1.1.rst b/docs/releases/2.1.1.rst new file mode 100644 index 0000000000..1a13ef1b42 --- /dev/null +++ b/docs/releases/2.1.1.rst @@ -0,0 +1,77 @@ +=============================== +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 + + + +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 `_ Can't add sources in mayan-edms 2.1. + + +.. _PyPI: https://pypi.python.org/pypi/mayan-edms/ diff --git a/docs/releases/index.rst b/docs/releases/index.rst index e22b2d91ad..ef8f792541 100644 --- a/docs/releases/index.rst +++ b/docs/releases/index.rst @@ -22,6 +22,7 @@ versions of the documentation contain the release notes for any later releases. .. toctree:: :maxdepth: 1 + 2.1.1 2.1 2.0.2 2.0.1 diff --git a/mayan/apps/navigation/classes.py b/mayan/apps/navigation/classes.py index 04cc418a81..6edbf818dc 100644 --- a/mayan/apps/navigation/classes.py +++ b/mayan/apps/navigation/classes.py @@ -364,8 +364,10 @@ class SourceColumn(object): return cls._registry[source.__class__] except KeyError: try: + # Special case for queryset items produced from + # .defer() or .only() optimizations return cls._registry[source._meta.parents.items()[0][0]] - except IndexError: + except (KeyError, IndexError): return () except TypeError: # unhashable type: list diff --git a/mayan/apps/sources/tests/test_views.py b/mayan/apps/sources/tests/test_views.py index 038ccd0882..2ad5038f77 100644 --- a/mayan/apps/sources/tests/test_views.py +++ b/mayan/apps/sources/tests/test_views.py @@ -25,9 +25,12 @@ from user_management.tests import ( from ..links import link_upload_version from ..literals import SOURCE_CHOICE_WEB_FORM from ..models import StagingFolderSource, WebFormSource -from ..permissions import permission_staging_file_delete +from ..permissions import ( + permission_sources_setup_create, permission_sources_setup_delete, + permission_sources_setup_view, permission_staging_file_delete +) -TEST_SOURCE_LABEL = 'test' +TEST_SOURCE_LABEL = 'test source' TEST_SOURCE_UNCOMPRESS_N = 'n' TEST_STAGING_PREVIEW_WIDTH = 640 @@ -285,3 +288,125 @@ class StagingFolderTestCase(GenericViewTestCase): self.assertContains(response, 'deleted', status_code=200) self.assertEqual(len(list(staging_folder.get_files())), 0) + + +class SourcesTestCase(GenericDocumentViewTestCase): + def create_web_source(self): + self.source = WebFormSource.objects.create( + enabled=True, label=TEST_SOURCE_LABEL, + uncompress=TEST_SOURCE_UNCOMPRESS_N + ) + + def test_source_list_view_with_permission(self): + self.create_web_source() + + self.login( + username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD + ) + + self.role.permissions.add( + permission_sources_setup_view.stored_permission + ) + + response = self.get(viewname='sources:setup_source_list') + + self.assertContains(response, text=self.source.label, status_code=200) + + def test_source_list_view_no_permission(self): + self.create_web_source() + + self.login( + username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD + ) + + response = self.get(viewname='sources:setup_source_list') + + self.assertEqual(response.status_code, 403) + + def test_source_create_view_with_permission(self): + self.login( + username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD + ) + + self.role.permissions.add( + permission_sources_setup_create.stored_permission + ) + self.role.permissions.add( + permission_sources_setup_view.stored_permission + ) + + response = self.post( + args=(SOURCE_CHOICE_WEB_FORM,), follow=True, + viewname='sources:setup_source_create', data={ + 'enabled': True, 'label': TEST_SOURCE_LABEL, + 'uncompress': TEST_SOURCE_UNCOMPRESS_N + } + ) + + webform_source = WebFormSource.objects.first() + + self.assertEqual(webform_source.label, TEST_SOURCE_LABEL) + self.assertEqual(webform_source.uncompress, TEST_SOURCE_UNCOMPRESS_N) + + self.assertEquals(response.status_code, 200) + + def test_source_create_view_no_permission(self): + self.login( + username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD + ) + + self.role.permissions.add( + permission_sources_setup_view.stored_permission + ) + + response = self.post( + args=(SOURCE_CHOICE_WEB_FORM,), follow=True, + viewname='sources:setup_source_create', data={ + 'enabled': True, 'label': TEST_SOURCE_LABEL, + 'uncompress': TEST_SOURCE_UNCOMPRESS_N + } + ) + + self.assertEqual(response.status_code, 403) + self.assertEqual(WebFormSource.objects.count(), 0) + + def test_source_delete_view_with_permission(self): + self.create_web_source() + + self.login( + username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD + ) + + self.role.permissions.add( + permission_sources_setup_delete.stored_permission + ) + self.role.permissions.add( + permission_sources_setup_view.stored_permission + ) + + response = self.post( + args=(self.source.pk,), follow=True, + viewname='sources:setup_source_delete' + ) + + self.assertEqual(response.status_code, 200) + self.assertEqual(WebFormSource.objects.count(), 0) + + def test_source_delete_view_no_permission(self): + self.create_web_source() + + self.login( + username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD + ) + + self.role.permissions.add( + permission_sources_setup_view.stored_permission + ) + + response = self.post( + args=(self.source.pk,), follow=True, + viewname='sources:setup_source_delete' + ) + + self.assertEqual(response.status_code, 403) + self.assertEqual(WebFormSource.objects.count(), 1) From 4e55b28c43b85215a58e5fc619cec3428e080406 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 17 May 2016 01:37:03 -0400 Subject: [PATCH 30/36] Update build status badge URL. --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index b1e6aee675..518b9e1ef4 100644 --- a/README.rst +++ b/README.rst @@ -59,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 From 27aae995f036b9ac7c168fe39f5950a5604e1821 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 17 May 2016 03:49:23 -0400 Subject: [PATCH 31/36] The Tesseract OCR backend now reports if the requested language file is missing. GitLab issue #289. --- HISTORY.rst | 2 +- docs/releases/2.1.1.rst | 6 +++++- mayan/apps/ocr/backends/tesseract.py | 28 ++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 5d7b8a9f52..e259526c82 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,7 +1,7 @@ 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. 2.1 (2016-05-14) ================ diff --git a/docs/releases/2.1.1.rst b/docs/releases/2.1.1.rst index 1a13ef1b42..e5268e6550 100644 --- a/docs/releases/2.1.1.rst +++ b/docs/releases/2.1.1.rst @@ -16,7 +16,10 @@ 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. Removals -------- @@ -72,6 +75,7 @@ Bugs fixed or issues closed =========================== * `GitLab issue #288 `_ Can't add sources in mayan-edms 2.1. +* `GitLab issue #289 `_ OCR fails with Exception. .. _PyPI: https://pypi.python.org/pypi/mayan-edms/ diff --git a/mayan/apps/ocr/backends/tesseract.py b/mayan/apps/ocr/backends/tesseract.py index 45fd9d152c..b157787928 100644 --- a/mayan/apps/ocr/backends/tesseract.py +++ b/mayan/apps/ocr/backends/tesseract.py @@ -2,6 +2,8 @@ from __future__ import unicode_literals import logging +import sh + from PIL import Image import pytesseract @@ -13,6 +15,23 @@ logger = logging.getLogger(__name__) class Tesseract(OCRBackendBase): + def __init__(self, *args, **kwargs): + super(Tesseract, self).__init__(*args, **kwargs) + try: + self.binary = sh.Command(setting_tesseract_path.value) + except sh.CommandNotFound: + self.binary = None + + def get_languages(self): + if self.binary: + result = self.binary(list_langs=True) + + return [ + language for language in result.stderr.split('\n') if language + ] + else: + return () + def execute(self, *args, **kwargs): """ Execute the command line binary of tesseract @@ -29,7 +48,16 @@ class Tesseract(OCRBackendBase): # re-run it with no language parameter except Exception as exception: error_message = 'Exception calling pytesseract with language option: {}; {}'.format(self.language, exception) + + if self.binary: + if self.language not in self.get_languages(): + error_message = '{}\nThe requested Tesseract language file for "{}" is not available and needs to be installed.\nIf using Debian or Ubuntu run: apt-get install tesseract-ocr-{}'.format(error_message, self.language, self.language) + logger.error(error_message) raise OCRError(error_message) return result + + + + From 0bebef5ba92d9004e2c29b9157fcdd24e20670e7 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 17 May 2016 04:07:03 -0400 Subject: [PATCH 32/36] Add documentation chapter on document languages. --- docs/topics/index.rst | 1 + docs/topics/languages.rst | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 docs/topics/languages.rst diff --git a/docs/topics/index.rst b/docs/topics/index.rst index e576ad56fa..5213486084 100644 --- a/docs/topics/index.rst +++ b/docs/topics/index.rst @@ -17,6 +17,7 @@ Introductions to all the key parts of Mayan EDMS you'll need to know: signatures ocr_backend indexes + languages smart_links tags mailing diff --git a/docs/topics/languages.rst b/docs/topics/languages.rst new file mode 100644 index 0000000000..277ed0a38a --- /dev/null +++ b/docs/topics/languages.rst @@ -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. From c97208f60993a136d2fd326e6e9cb4fa939e866d Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 17 May 2016 05:02:57 -0400 Subject: [PATCH 33/36] Ensure that the automatic index is created after the default document type is created. --- mayan/apps/document_indexing/apps.py | 10 +++++--- mayan/apps/document_indexing/handlers.py | 32 ++++++++++++------------ mayan/apps/documents/handlers.py | 10 +++++++- mayan/apps/documents/literals.py | 1 + mayan/apps/documents/signals.py | 3 +++ 5 files changed, 36 insertions(+), 20 deletions(-) diff --git a/mayan/apps/document_indexing/apps.py b/mayan/apps/document_indexing/apps.py index ec9d1e8ee6..7796b732a1 100644 --- a/mayan/apps/document_indexing/apps.py +++ b/mayan/apps/document_indexing/apps.py @@ -17,7 +17,7 @@ from common import ( from common.classes import Package from common.signals import post_initial_setup from common.widgets import two_state_template -from documents.signals import post_document_created +from documents.signals import post_document_created, post_initial_document_type from mayan.celery import app from navigation import SourceColumn from rest_api.classes import APIEndPoint @@ -56,6 +56,10 @@ class DocumentIndexingApp(MayanAppConfig): app_label='documents', model_name='Document' ) + DocumentType = apps.get_model( + app_label='documents', model_name='DocumentType' + ) + DocumentMetadata = apps.get_model( app_label='metadata', model_name='DocumentMetadata' ) @@ -234,9 +238,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. document_created_index_update, dispatch_uid='document_created_index_update', sender=Document ) - post_initial_setup.connect( + post_initial_document_type.connect( create_default_document_index, - dispatch_uid='create_default_document_index' + dispatch_uid='create_default_document_index', sender=DocumentType ) post_save.connect( document_metadata_index_update, diff --git a/mayan/apps/document_indexing/handlers.py b/mayan/apps/document_indexing/handlers.py index eadc8fbceb..ecf1604892 100644 --- a/mayan/apps/document_indexing/handlers.py +++ b/mayan/apps/document_indexing/handlers.py @@ -3,6 +3,8 @@ from __future__ import unicode_literals from django.apps import apps from django.utils.translation import ugettext_lazy as _ +from documents.literals import DEFAULT_DOCUMENT_TYPE_LABEL + from .tasks import task_delete_empty_index_nodes, task_index_document @@ -14,23 +16,21 @@ def create_default_document_index(sender, **kwargs): app_label='document_indexing', model_name='Index' ) - if not Index.objects.count(): - index = Index.objects.create( - label=_('Creation date'), slug='creation_date' - ) - for document_type in DocumentType.objects.all(): - index.document_types.add(document_type) - - root_template_node = index.template_root - node = root_template_node.get_children().create( - expression='{{ document.date_added|date:"Y" }}', index=index, - parent=root_template_node - ) - node.get_children().create( - expression='{{ document.date_added|date:"m" }}', - index=index, link_documents=True, parent=node - ) + index = Index.objects.create( + label=_('Creation date'), slug='creation_date' + ) + for document_type in DocumentType.objects.all(): + index.document_types.add(document_type) + root_template_node = index.template_root + node = root_template_node.get_children().create( + expression='{{ document.date_added|date:"Y" }}', index=index, + parent=root_template_node + ) + node.get_children().create( + expression='{{ document.date_added|date:"m" }}', + index=index, link_documents=True, parent=node + ) def document_created_index_update(sender, **kwargs): diff --git a/mayan/apps/documents/handlers.py b/mayan/apps/documents/handlers.py index bcde760c69..0182ee86eb 100644 --- a/mayan/apps/documents/handlers.py +++ b/mayan/apps/documents/handlers.py @@ -3,6 +3,9 @@ from __future__ import unicode_literals from django.apps import apps from django.utils.translation import ugettext_lazy as _ +from .literals import DEFAULT_DOCUMENT_TYPE_LABEL +from .signals import post_initial_document_type + def create_default_document_type(sender, **kwargs): DocumentType = apps.get_model( @@ -10,4 +13,9 @@ def create_default_document_type(sender, **kwargs): ) if not DocumentType.objects.count(): - DocumentType.objects.create(label=_('Default')) + document_type = DocumentType.objects.create( + label=DEFAULT_DOCUMENT_TYPE_LABEL + ) + post_initial_document_type.send( + sender=DocumentType, instance=document_type + ) diff --git a/mayan/apps/documents/literals.py b/mayan/apps/documents/literals.py index d32efaee0a..8d8da36711 100644 --- a/mayan/apps/documents/literals.py +++ b/mayan/apps/documents/literals.py @@ -11,6 +11,7 @@ DELETE_STALE_STUBS_INTERVAL = 60 * 10 # 10 minutes DEFAULT_DELETE_PERIOD = 30 DEFAULT_DELETE_TIME_UNIT = TIME_DELTA_UNIT_DAYS DEFAULT_ZIP_FILENAME = 'document_bundle.zip' +DEFAULT_DOCUMENT_TYPE_LABEL = _('Default') DOCUMENT_IMAGE_TASK_TIMEOUT = 20 STUB_EXPIRATION_INTERVAL = 60 * 60 * 24 # 24 hours UPDATE_PAGE_COUNT_RETRY_DELAY = 10 diff --git a/mayan/apps/documents/signals.py b/mayan/apps/documents/signals.py index b0832d66bf..0ec434bee1 100644 --- a/mayan/apps/documents/signals.py +++ b/mayan/apps/documents/signals.py @@ -7,3 +7,6 @@ post_document_type_change = Signal( providing_args=('instance',), use_caching=True ) post_document_created = Signal(providing_args=('instance',), use_caching=True) +post_initial_document_type = Signal( + providing_args=('instance',), use_caching=True +) From 11da3035293c051fb2ff04069438845daa32ac98 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 17 May 2016 05:04:27 -0400 Subject: [PATCH 34/36] Update changelog. --- HISTORY.rst | 1 + docs/releases/2.1.1.rst | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index e259526c82..5fba951d48 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -2,6 +2,7 @@ ================== - 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) ================ diff --git a/docs/releases/2.1.1.rst b/docs/releases/2.1.1.rst index e5268e6550..c830e69789 100644 --- a/docs/releases/2.1.1.rst +++ b/docs/releases/2.1.1.rst @@ -21,6 +21,12 @@ 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 From 8712c6ee371082e70475ce2d6ac8722a4b64ac22 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 17 May 2016 05:08:21 -0400 Subject: [PATCH 35/36] PEP8 cleanups. --- mayan/apps/document_indexing/apps.py | 1 - mayan/apps/document_indexing/handlers.py | 2 -- mayan/apps/documents/handlers.py | 1 - mayan/apps/metadata/serializers.py | 1 + mayan/apps/mirroring/management/commands/mountindex.py | 8 ++------ mayan/apps/ocr/backends/tesseract.py | 4 ---- mayan/apps/user_management/serializers.py | 6 +++--- mayan/apps/user_management/tests/test_api.py | 5 ++--- 8 files changed, 8 insertions(+), 20 deletions(-) diff --git a/mayan/apps/document_indexing/apps.py b/mayan/apps/document_indexing/apps.py index 7796b732a1..6633c11ee0 100644 --- a/mayan/apps/document_indexing/apps.py +++ b/mayan/apps/document_indexing/apps.py @@ -15,7 +15,6 @@ from common import ( menu_setup, menu_tools ) from common.classes import Package -from common.signals import post_initial_setup from common.widgets import two_state_template from documents.signals import post_document_created, post_initial_document_type from mayan.celery import app diff --git a/mayan/apps/document_indexing/handlers.py b/mayan/apps/document_indexing/handlers.py index ecf1604892..175fbfcd39 100644 --- a/mayan/apps/document_indexing/handlers.py +++ b/mayan/apps/document_indexing/handlers.py @@ -3,8 +3,6 @@ from __future__ import unicode_literals from django.apps import apps from django.utils.translation import ugettext_lazy as _ -from documents.literals import DEFAULT_DOCUMENT_TYPE_LABEL - from .tasks import task_delete_empty_index_nodes, task_index_document diff --git a/mayan/apps/documents/handlers.py b/mayan/apps/documents/handlers.py index 0182ee86eb..d4c82f861b 100644 --- a/mayan/apps/documents/handlers.py +++ b/mayan/apps/documents/handlers.py @@ -1,7 +1,6 @@ from __future__ import unicode_literals from django.apps import apps -from django.utils.translation import ugettext_lazy as _ from .literals import DEFAULT_DOCUMENT_TYPE_LABEL from .signals import post_initial_document_type diff --git a/mayan/apps/metadata/serializers.py b/mayan/apps/metadata/serializers.py index 3dfa602d01..828a7792d5 100644 --- a/mayan/apps/metadata/serializers.py +++ b/mayan/apps/metadata/serializers.py @@ -55,6 +55,7 @@ class DocumentNewMetadataSerializer(serializers.Serializer): ) return instance + class DocumentTypeNewMetadataTypeSerializer(serializers.Serializer): metadata_type_pk = serializers.IntegerField( help_text=_('Primary key of the metadata type to be added.') diff --git a/mayan/apps/mirroring/management/commands/mountindex.py b/mayan/apps/mirroring/management/commands/mountindex.py index b416a11154..7244716dae 100644 --- a/mayan/apps/mirroring/management/commands/mountindex.py +++ b/mayan/apps/mirroring/management/commands/mountindex.py @@ -213,13 +213,9 @@ class Command(management.BaseCommand): help = 'Mount an index as a FUSE filesystem.' def add_arguments(self, parser): - parser.add_argument('slug', nargs='?', - help='Index slug' - ) + parser.add_argument('slug', nargs='?', help='Index slug') - parser.add_argument('mount_point', nargs='?', - help='Mount point' - ) + parser.add_argument('mount_point', nargs='?', help='Mount point') def handle(self, *args, **options): if not options.get('slug') or not options.get('mount_point'): diff --git a/mayan/apps/ocr/backends/tesseract.py b/mayan/apps/ocr/backends/tesseract.py index b157787928..cf27a3eea9 100644 --- a/mayan/apps/ocr/backends/tesseract.py +++ b/mayan/apps/ocr/backends/tesseract.py @@ -57,7 +57,3 @@ class Tesseract(OCRBackendBase): raise OCRError(error_message) return result - - - - diff --git a/mayan/apps/user_management/serializers.py b/mayan/apps/user_management/serializers.py index dbe030719f..2430629d35 100644 --- a/mayan/apps/user_management/serializers.py +++ b/mayan/apps/user_management/serializers.py @@ -40,14 +40,14 @@ class UserSerializer(serializers.HyperlinkedModelSerializer): write_only_fields = ('password',) def create(self, validated_data): - groups = validated_data.pop('groups') - is_active = validated_data.pop('is_active') + validated_data.pop('groups') + validated_data.pop('is_active') user = get_user_model().objects.create_user(**validated_data) return user def update(self, instance, validated_data): - groups = validated_data.pop('groups') + validated_data.pop('groups') if 'password' in validated_data: instance.set_password(validated_data['password']) diff --git a/mayan/apps/user_management/tests/test_api.py b/mayan/apps/user_management/tests/test_api.py index 1864960744..e5eb2b561c 100644 --- a/mayan/apps/user_management/tests/test_api.py +++ b/mayan/apps/user_management/tests/test_api.py @@ -4,7 +4,6 @@ from django.contrib.auth import get_user_model from django.core.urlresolvers import reverse -from rest_framework import status from rest_framework.test import APITestCase from ..tests.literals import ( @@ -12,8 +11,8 @@ from ..tests.literals import ( ) from .literals import ( - TEST_GROUP, TEST_USER_EMAIL, TEST_USER_PASSWORD, TEST_USER_PASSWORD_EDITED, - TEST_USER_USERNAME, TEST_USER_USERNAME_EDITED + TEST_USER_EMAIL, TEST_USER_PASSWORD, TEST_USER_USERNAME, + TEST_USER_USERNAME_EDITED ) From 004b8c90547e111ad0dad5761038a3d9692cfc13 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 17 May 2016 05:08:45 -0400 Subject: [PATCH 36/36] Bump version to 2.1.1 --- mayan/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mayan/__init__.py b/mayan/__init__.py index fe54d02e0a..195d1759f5 100644 --- a/mayan/__init__.py +++ b/mayan/__init__.py @@ -1,8 +1,8 @@ from __future__ import unicode_literals __title__ = 'Mayan EDMS' -__version__ = '2.1' -__build__ = 0x020100 +__version__ = '2.1.1' +__build__ = 0x020101 __author__ = 'Roberto Rosario' __author_email__ = 'roberto.rosario@mayan-edms.com' __description__ = 'Free Open Source Electronic Document Management System'