From 675bdd6112eec8680d45089fe5285e55df6aff1b Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Thu, 28 Apr 2011 21:30:37 -0400 Subject: [PATCH] Added tag editing view and listing documents with an specific tag --- apps/documents/forms.py | 2 +- .../documents/locale/es/LC_MESSAGES/django.po | 158 +++++++++--------- apps/documents/views.py | 18 +- .../templatetags/navigation_tags.py | 17 +- apps/tags/__init__.py | 17 +- apps/tags/admin.py | 5 - apps/tags/forms.py | 12 ++ apps/tags/locale/es/LC_MESSAGES/django.mo | Bin 1402 -> 2846 bytes apps/tags/locale/es/LC_MESSAGES/django.po | 108 ++++++++++-- apps/tags/models.py | 2 +- apps/tags/urls.py | 2 + apps/tags/utils.py | 14 +- apps/tags/views.py | 53 ++++-- 13 files changed, 271 insertions(+), 137 deletions(-) diff --git a/apps/documents/forms.py b/apps/documents/forms.py index 1a41729708..6d213da598 100644 --- a/apps/documents/forms.py +++ b/apps/documents/forms.py @@ -365,7 +365,7 @@ class MetaDataImageWidget(forms.widgets.Widget): output.append(u'
') for document in value['group_data']: tags_template = [] - tag_block_template = u'
%s
' + tag_block_template = u'
%s
' tag_count = document.tags.count() if tag_count: tags_template.append(u'
') diff --git a/apps/documents/locale/es/LC_MESSAGES/django.po b/apps/documents/locale/es/LC_MESSAGES/django.po index 8810486df1..ba4ddc35c3 100644 --- a/apps/documents/locale/es/LC_MESSAGES/django.po +++ b/apps/documents/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-04-28 00:37-0400\n" +"POT-Creation-Date: 2011-04-28 21:29-0400\n" "PO-Revision-Date: 2011-04-28 00:17\n" "Last-Translator: Roberto Rosario \n" "Language-Team: LANGUAGE \n" @@ -195,11 +195,11 @@ msgstr "Documentos" msgid "thumbnail" msgstr "miniatura" -#: __init__.py:136 views.py:295 views.py:852 +#: __init__.py:136 views.py:297 views.py:846 msgid "metadata" msgstr "metadatos" -#: __init__.py:143 __init__.py:149 models.py:65 views.py:76 +#: __init__.py:143 __init__.py:149 models.py:65 views.py:74 msgid "documents" msgstr "documentos" @@ -268,15 +268,15 @@ msgstr "paso 2 de 2: Metadatos de documento" msgid "Tags" msgstr "Etiquetas" -#: forms.py:406 views.py:277 +#: forms.py:402 views.py:274 msgid "Pages" msgstr "Páginas" -#: forms.py:407 +#: forms.py:403 msgid "Select" msgstr "Seleccionar" -#: forms.py:416 +#: forms.py:412 msgid "Click on the image for full size view of the first page." msgstr "Haga clic en la imagen para ver la primera página en tamaño completo" @@ -309,7 +309,7 @@ msgid "description" msgstr "descripción" #: models.py:64 models.py:238 models.py:265 models.py:436 models.py:450 -#: views.py:383 +#: views.py:373 msgid "document" msgstr "documento" @@ -398,7 +398,7 @@ msgstr "índices de metadatos" msgid "metadata value" msgstr "datos de metadato" -#: models.py:246 models.py:247 views.py:91 +#: models.py:246 models.py:247 views.py:88 msgid "document metadata" msgstr "metadatos de documento" @@ -570,15 +570,15 @@ msgstr "artículo de grupo de documentos" msgid "group items" msgstr "artículos de grupos de documentos" -#: models.py:411 views.py:668 +#: models.py:411 views.py:658 msgid "order" msgstr "orden" -#: models.py:412 views.py:669 views.py:709 +#: models.py:412 views.py:659 views.py:699 msgid "transformation" msgstr "transformación" -#: models.py:413 views.py:670 +#: models.py:413 views.py:660 msgid "arguments" msgstr "argumentos" @@ -607,7 +607,7 @@ msgstr "accesado" msgid "recent document" msgstr "documento reciente" -#: models.py:447 views.py:1041 +#: models.py:447 views.py:1023 msgid "recent documents" msgstr "documentos recientes" @@ -659,223 +659,215 @@ msgstr "Páginas de documentos en la base de datos: %d" msgid "Document statistics" msgstr "Estadísticas de documentos" -#: views.py:150 +#: views.py:147 #, python-format msgid "Extracted file: %s, uploaded successfully." msgstr "Archivo extraido: %s, ha subido con éxito." -#: views.py:176 +#: views.py:173 msgid "Document uploaded successfully." msgstr "Documento subido con éxito." -#: views.py:194 +#: views.py:191 #, python-format msgid "Staging file: %s, uploaded successfully." msgstr "Archivo de ensayo: %s, ha subido con éxito." -#: views.py:198 +#: views.py:195 #, python-format msgid "Staging file: %s, deleted successfully." msgstr "Archivo de ensayo: %s, eliminado con éxito." -#: views.py:212 +#: views.py:209 msgid "upload a local document" msgstr "subir un documento local" -#: views.py:230 +#: views.py:227 msgid "files in staging" msgstr "archivos de ensayo" -#: views.py:239 +#: views.py:236 msgid "upload a document from staging" msgstr "subir un documento de ensayo" -#: views.py:248 +#: views.py:245 msgid "Current metadata" msgstr "metadatos actuales" -#: views.py:266 +#: views.py:263 msgid "Filename" msgstr "Nombre del archivo" -#: views.py:267 +#: views.py:264 msgid "File extension" msgstr "Extensión de archivo" -#: views.py:268 +#: views.py:265 msgid "File mimetype" msgstr "Tipo MIME del archivo" -#: views.py:269 +#: views.py:266 msgid "File mime encoding" msgstr "Codificación de archivos MIME" -#: views.py:270 +#: views.py:267 msgid "File size" msgstr "Tamaños del archivo" -#: views.py:271 +#: views.py:268 msgid "Exists in storage" msgstr "Existe en el almacenamiento" -#: views.py:272 +#: views.py:269 msgid "File path in storage" msgstr "Ruta de archivos en el almacenamiento" -#: views.py:273 +#: views.py:270 msgid "Date added" msgstr "Fecha en que se agregó" -#: views.py:274 +#: views.py:271 msgid "Time added" msgstr "El tiempo añadido" -#: views.py:275 +#: views.py:272 msgid "Checksum" msgstr "Suma de comprobación" -#: views.py:276 +#: views.py:273 msgid "UUID" msgstr "UUID" -#: views.py:287 views.py:843 +#: views.py:284 views.py:833 msgid "document properties" msgstr "propiedades del documento" -#: views.py:297 views.py:854 +#: views.py:299 views.py:848 msgid "value" msgstr "valor" -#: views.py:305 views.py:862 +#: views.py:307 views.py:856 #, python-format msgid "Document group query error: %s" msgstr "Drror de consulta de grupo de documentos: %s" -#: views.py:315 views.py:872 +#: views.py:317 views.py:866 #, python-format msgid "document groups (%s)" msgstr "grupo de documentos (%s)" -#: views.py:328 views.py:888 -msgid "tags" -msgstr "etiquetas" - -#: views.py:331 views.py:891 -msgid "color" -msgstr "color" - -#: views.py:340 +#: views.py:330 msgid "index links" msgstr "enlaces de índice" -#: views.py:363 views.py:467 views.py:787 +#: views.py:353 views.py:457 views.py:777 msgid "Must provide at least one document." msgstr "Debe proveer al menos un documento." -#: views.py:374 +#: views.py:364 #, python-format msgid "Document: %s deleted successfully." msgstr "Documento: %s eliminado con éxito." -#: views.py:376 +#: views.py:366 #, python-format msgid "Document: %(document)s delete error: %(error)s" msgstr "Documento: %(document)s, error de eliminación: %(error)s " -#: views.py:390 +#: views.py:380 #, python-format msgid "Are you sure you wish to delete the document: %s?" msgstr "¿Está seguro que desea eliminar el documento: %s?" -#: views.py:392 +#: views.py:382 #, python-format msgid "Are you sure you wish to delete the documents: %s?" msgstr "¿Está seguro que desea eliminar los documentos: %s?" -#: views.py:431 +#: views.py:421 #, python-format msgid "Document %s edited successfully." msgstr "Documento %s editado con éxito." -#: views.py:440 +#: views.py:430 msgid "Document filesystem links updated successfully." msgstr "Enlaces del documento actualizados con éxito." -#: views.py:464 +#: views.py:454 msgid "All documents must be from the same type." msgstr "Todos los documentos deben ser del mismo tipo." -#: views.py:499 +#: views.py:489 #, python-format msgid "Error deleting filesystem links for document: %(document)s; %(error)s" msgstr "" "Error al eliminar los enlaces del sistema de archivos para el documento: " "%(document)s; %(error)s " -#: views.py:502 +#: views.py:492 #, python-format msgid "Metadata for document %s edited successfully." msgstr "Metadatos para documento %s editado con éxito." -#: views.py:511 +#: views.py:501 #, python-format msgid "Filesystem links updated successfully for document: %s." msgstr "" "Enlaces del sistema de archivos actualizados con éxito para el documento: %s." -#: views.py:513 +#: views.py:503 #, python-format msgid "Error creating filesystem links for document: %(document)s; %(error)s" msgstr "" "Error al crear vínculos de sistema de archivos para el documento: " "%(document)s; %(error)s " -#: views.py:527 +#: views.py:517 #, python-format msgid "Edit metadata for document: %s" msgstr "Editar de metadatos para el documento: %s" -#: views.py:529 +#: views.py:519 #, python-format msgid "Edit metadata for documents: %s" msgstr "Editar metadatos para los documentos: %s" -#: views.py:551 +#: views.py:541 #, python-format msgid "Page transformation error: %s" msgstr "Error de transformación de página: %s" -#: views.py:612 +#: views.py:602 #, python-format msgid "Staging file transformation error: %(error)s" msgstr "Error de transformación de archivo de ensayo: %(error)s " -#: views.py:641 +#: views.py:631 msgid "Staging file delete successfully." msgstr "Archivo de ensayo eliminado con éxito." -#: views.py:665 +#: views.py:655 #, python-format msgid "transformations for: %s" msgstr "transformaciones para: %s" -#: views.py:694 +#: views.py:684 #, python-format msgid "Create new transformation for page: %(page)s of document: %(document)s" msgstr "" "Crear nueva transformación de la página: %(page)s del documento: " "%(document)s " -#: views.py:710 +#: views.py:700 #, python-format msgid "Edit transformation \"%(transformation)s\" for: %(document_page)s" msgstr "Editar transformación \" %(transformation)s\" para: %(document_page)s" -#: views.py:731 views.py:807 +#: views.py:721 views.py:797 msgid "document transformation" msgstr "transformación de documento" -#: views.py:732 +#: views.py:722 #, python-format msgid "" "Are you sure you wish to delete transformation \"%(transformation)s\" for: " @@ -884,17 +876,17 @@ msgstr "" "¿Está seguro que desea eliminar la transformación \"%(transformation)s\" " "para: %(document_page)s" -#: views.py:753 views.py:913 +#: views.py:743 views.py:895 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." -#: views.py:767 +#: views.py:757 msgid "duplicated documents" msgstr "documentos duplicados" -#: views.py:799 +#: views.py:789 #, python-format msgid "" "All the page transformations for document: %s, have been deleted " @@ -903,7 +895,7 @@ msgstr "" "Todas las transformaciones de la página de documento: %s, se han eliminado " "con éxito." -#: views.py:801 +#: views.py:791 #, python-format msgid "" "Error deleting the page transformations for document: %(document)s; " @@ -912,7 +904,7 @@ msgstr "" "Error al eliminar las transformaciones de página para el documento: " "%(document)s; %(error)s." -#: views.py:815 +#: views.py:805 #, python-format msgid "" "Are you sure you wish to clear all the page transformations for document: %s?" @@ -920,7 +912,7 @@ msgstr "" "¿Está seguro que desea eliminar todas las transformaciones de página del " "documento: %s?" -#: views.py:817 +#: views.py:807 #, python-format msgid "" "Are you sure you wish to clear all the page transformations for documents: " @@ -929,37 +921,37 @@ msgstr "" "¿Está seguro que desea eliminar las transformaciones de página de los " "documentos: %s?" -#: views.py:923 +#: views.py:905 msgid "missing documents" msgstr "documentos perdidos" -#: views.py:939 views.py:958 +#: views.py:921 views.py:940 #, python-format msgid "details for: %s" msgstr "detalles para: %s" -#: views.py:979 +#: views.py:961 msgid "Document page edited successfully." msgstr "Página del documento se ha editado correctamente." -#: views.py:987 +#: views.py:969 #, python-format msgid "edit: %s" msgstr "editar: %s" -#: views.py:998 +#: views.py:980 msgid "There are no more pages in this document" msgstr "No hay más páginas en este documento" -#: views.py:1011 +#: views.py:993 msgid "You are already at the first page of this document" msgstr "Usted ya está en la primera página de este documento" -#: views.py:1109 +#: views.py:1091 msgid "No action selected." msgstr "Ninguna acción seleccionada." -#: views.py:1125 +#: views.py:1107 #, python-format msgid "documents in group: %(group)s, for document: %(document)s" msgstr "grupo de documentos: %(group)s, para el documento: %(document)s " @@ -968,6 +960,12 @@ msgstr "grupo de documentos: %(group)s, para el documento: %(document)s " msgid "Rotate [degrees]" msgstr "Rotar [degrees]" +#~ msgid "tags" +#~ msgstr "etiquetas" + +#~ msgid "color" +#~ msgstr "color" + #~ msgid "metadata groups (%s)" #~ msgstr "grupos de metadatos (%s)" diff --git a/apps/documents/views.py b/apps/documents/views.py index 9c9c6afe3e..1556358fd8 100644 --- a/apps/documents/views.py +++ b/apps/documents/views.py @@ -66,19 +66,15 @@ PICTURE_UNKNOWN_SMALL = u'1299549572_unknown2.png' PICTURE_UNKNOWN_MEDIUM = u'1299549805_unknown.png' -def document_list(request): +def document_list(request, object_list=None, title=None): check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW]) - return object_list( - request, - queryset=Document.objects.only('file_filename', 'file_extension').all(), - template_name='generic_list.html', - extra_context={ - 'title': _(u'documents'), - 'multi_select_as_buttons': True, - 'hide_links': True, - }, - ) + return render_to_response('generic_list.html', { + 'object_list': object_list if object_list else Document.objects.only('file_filename', 'file_extension').all(), + 'title': title if title else _(u'documents'), + 'multi_select_as_buttons': True, + 'hide_links': True, + }, context_instance=RequestContext(request)) def document_create(request, multiple=True): diff --git a/apps/navigation/templatetags/navigation_tags.py b/apps/navigation/templatetags/navigation_tags.py index d117dc2339..f256d0ff36 100644 --- a/apps/navigation/templatetags/navigation_tags.py +++ b/apps/navigation/templatetags/navigation_tags.py @@ -130,6 +130,17 @@ def _get_object_navigation_links(context, menu_name=None, links_dict=object_navi current_view = resolve_to_name(current_path) context_links = [] + try: + """ + Override the navigation links dictionary with the provided + link list + """ + navigation_object_links = Variable('navigation_object_links').resolve(context) + if navigation_object_links: + return navigation_object_links + except VariableDoesNotExist: + pass + try: object_name = Variable('navigation_object_name').resolve(context) except VariableDoesNotExist: @@ -139,12 +150,6 @@ def _get_object_navigation_links(context, menu_name=None, links_dict=object_navi obj = Variable(object_name).resolve(context) except VariableDoesNotExist: obj = None - - try: - navigation_object_links = Variable('navigation_object_links').resolve(context) - links_dict = navigation_object_links if navigation_object_links else object_navigation - except VariableDoesNotExist: - pass try: links = links_dict[menu_name][current_view]['links'] diff --git a/apps/tags/__init__.py b/apps/tags/__init__.py index fb6caeab5c..38e74d814c 100644 --- a/apps/tags/__init__.py +++ b/apps/tags/__init__.py @@ -24,9 +24,23 @@ register_permissions('tags', [ tag_list = {'text': _('tags'), 'view': 'tag_list', 'famfam': 'tag_blue'} tag_document_remove = {'text': _('delete'), 'view': 'tag_remove', 'args': ['object.id', 'document.id'], 'famfam': 'tag_blue_delete', 'permissions': {'namespace': 'tags', 'permissions': [PERMISSION_TAG_REMOVE]}} tag_delete = {'text': _('delete'), 'view': 'tag_delete', 'args': 'object.id', 'famfam': 'tag_blue_delete', 'permissions': {'namespace': 'tags', 'permissions': [PERMISSION_TAG_DELETE]}} +tag_edit = {'text': _('edit'), 'view': 'tag_edit', 'args': 'object.id', 'famfam': 'tag_blue_edit', 'permissions': {'namespace': 'tags', 'permissions': [PERMISSION_TAG_EDIT]}} +tag_tagged_item_list = {'text': _('tagged documents'), 'view': 'tag_tagged_item_list', 'args': 'object.id', 'famfam': 'tag_blue_edit'} tag_multiple_delete = {'text': _('delete'), 'view': 'tag_multiple_delete', 'famfam': 'tag_blue_delete', 'permissions': {'namespace': 'tags', 'permissions': [PERMISSION_TAG_DELETE]}} -#register_links(Tag, [tag_delete]) +register_model_list_columns(Tag, [ + { + 'name': _(u'color'), + 'attribute': lambda x: u'
' % + x.tagproperties_set.get().get_color_code(), + }, + { + 'name': _(u'color name'), + 'attribute': lambda x: x.tagproperties_set.get().get_color_display(), + } +]) + +register_links(Tag, [tag_tagged_item_list, tag_edit]) register_multi_item_links(['tag_list'], [tag_multiple_delete]) @@ -39,5 +53,4 @@ tags_menu = [ ] }, ] - register_menu(tags_menu) diff --git a/apps/tags/admin.py b/apps/tags/admin.py index bac2c25369..495fc03066 100644 --- a/apps/tags/admin.py +++ b/apps/tags/admin.py @@ -3,9 +3,4 @@ from django.contrib import admin from tags.models import TagProperties -#class PermissionAdmin(admin.ModelAdmin): -# inlines = [PermissionHolderInline] -# list_display = ('namespace', 'name', 'label') -# list_display_links = list_display - admin.site.register(TagProperties) diff --git a/apps/tags/forms.py b/apps/tags/forms.py index 1a7371d90d..046809c7c8 100644 --- a/apps/tags/forms.py +++ b/apps/tags/forms.py @@ -7,6 +7,18 @@ from models import COLOR_CHOICES class AddTagForm(forms.Form): + """ + Form to be displayed in the sidebar of a document and allow adding + new or existing tags + """ new_tag = forms.CharField(required=False, label=_(u'New tag')) color = forms.ChoiceField(choices=COLOR_CHOICES, required=False, label=_(u'Color')) existing_tags = forms.ModelChoiceField(required=False, queryset=Tag.objects.all(), label=_(u'Existing tags')) + + +class TagForm(forms.Form): + """ + Form to edit an existing tag's properties + """ + name = forms.CharField(label=_(u'Name')) + color = forms.ChoiceField(choices=COLOR_CHOICES, label=_(u'Color')) diff --git a/apps/tags/locale/es/LC_MESSAGES/django.mo b/apps/tags/locale/es/LC_MESSAGES/django.mo index 47d45cc0e73bde0701e2780b8d439473c000d651..187fcc23db1ea6f7866a3afc1ef3f30d58d0a0fc 100644 GIT binary patch literal 2846 zcma)-O^6&t6vxY$7#%;N@iTtqWi@6a>2Y>78fLRGlif)S?rt`lNmNjzcKW5a*PgCP zRrhXIg5bfAQv|_-h~Nj_yyqfl4BkXgL=Zs{1rHts33%}0|MkbrtZ|9ORR6lGUcGwn z)vGr@ZeIVELVE!HZuF@ul-doRS%(MO?3GI03?2n{fed=!o5lEN;Cg(23vK|v2RDH~ z72|(^oAG@S90E5&_(t$Sa0fUBUJtgx>%ddsM(`!D2EGd33!Vev&Yav&Hz^;9dBB4}>c92`KiQ2W6kHz#G7C zK(YU4P~`pu#oxcccM!Xc*yJ93e+VN-!Smo_;6+gM@47l)_XLO~Y8t!^JXVY^f?M%z zz#ZTl;1=*4DEhtzZvod|liRZeglaVm%6ttJf7_t=`x+>Ap9RI9f!8^bW z*D8f@WxD0uq)EIb*3!f$IaiSteZ#@k#8x zA6?o_=yER7Brej#f63Wx=wh=pi4jcB&RXJ7Ht`WIWigh#Qw`szLa^WG{(psCA)O?;y+C|AbYYBLb>P&2C}lNaB4gEr zWsMDDUe2c`R&=Z;^Ie0;%d=0 zEOC&u@55b}w%hF7$ux>qs{P5#&9$d(rvKlop9-Uh=9$XbY-f$JGBaFN6_IFX$CW)P z7VGm3RZo(Z5tlMk@)Kd4h?0jmE$N^@>4eC1*(M=pLvo5eJu;t-x*GaZsGj1CnDPN~O^I_849kF=2 zXFU7fak-Io@)u#9@nAUPu2QYKyZUHlHcG9Iyo1JeaFOF~_UXn)$0&atAC76;IF0Na ztEfg`Inb7H%}%8Z6}YtJaT@jcr%jh!c%K{xsWk)%TuH~8I0`#qjCB#-i=}zZxcm}a zstEVKTvpbam=_1^z`WdSgb-=gcrlFzYL2Bi<)uLtY9d7GY4(j8P+yc4sF^J4kf9Y= zojFz-;Tvk3j_DVpRi@;H2^#XMgb@9g|7#SeB08%a!Zq;OYjluyC{?{mHOaWoD0x9> zDUJJ)&HW{l4T|k$XsRf;SR%EG8I>#|{3RH-YB36y>C9V{ED2gK>}t*|8g(=clU1(D z;Xpwz1>kd;8B)h~kqEUnBp;sNQ%# PQoS*l+gs<>TIke2W!UZ} delta 656 zcmX|;PfG$(6vdx^#{5%R8fuUsiWs?3GK5x|Pz2>d+O!;+S4@nK>6qlkb}gbdk2V#3 zfOb(Iz@kN)mJvimo4$mr&K;f|Jn#4JjC1aNGq;hUzyBR_Uot2R&%uvy9Nu(bfd(Mm zdjj3yJE(x4vi<>+sDHr;(CcJu9E^ZtU`jFzx==5H)Tao}GuCI@*m!WE4N`DV)+Zo6 za0*U>XJ8P#0)^P zB%Mg}qFw+gI4|p>WC@Jo`UV&SRS#Dm3I@Cy3cA{6AmRK)|E(j zhZ~03WxMvjHEwW=i#H`IhRU9j%dO-Kf_qZ-uJ~~7DL8`VUdI@P>j=N_E(*n$4Oct- zNKJ4{KkRTzWi|7_6feGI5%\n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -19,22 +19,66 @@ msgstr "" "X-Translated-Using: django-rosetta 0.5.6\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: __init__.py:10 +#: __init__.py:17 +msgid "Create new tags" +msgstr "Crear nuevas etiquetas" + +#: __init__.py:18 +msgid "Attach exising tags" +msgstr "Anejar etiquetas existentes" + +#: __init__.py:19 +msgid "Remove tags from documents" +msgstr "Quitar etiquetas de los documentos" + +#: __init__.py:20 +msgid "Delete global tags" +msgstr "Eliminar las etiquetas globales" + +#: __init__.py:21 +msgid "Edit global tags" +msgstr "Editar etiquetas globales" + +#: __init__.py:24 __init__.py:51 utils.py:13 views.py:73 +msgid "tags" +msgstr "etiquetas" + +#: __init__.py:25 __init__.py:26 __init__.py:29 msgid "delete" msgstr "eliminar" -#: forms.py:15 +#: __init__.py:27 +msgid "edit" +msgstr "editar" + +#: __init__.py:28 +msgid "tagged documents" +msgstr "documentos etiquetados" + +#: __init__.py:33 models.py:34 +msgid "color" +msgstr "color" + +#: __init__.py:38 +msgid "color name" +msgstr "nombre del color" + +#: forms.py:14 msgid "New tag" msgstr "Nueva etiqueta" -#: forms.py:16 +#: forms.py:15 forms.py:24 msgid "Color" msgstr "Color" -#: forms.py:17 +#: forms.py:16 msgid "Existing tags" msgstr "Etiquetas existentes" +#: forms.py:23 +msgid "Name" +msgstr "Nombre" + #: models.py:14 msgid "Blue" msgstr "Azul" @@ -59,14 +103,10 @@ msgstr "Rojo" msgid "Yellow" msgstr "Amarillo" -#: models.py:33 +#: models.py:33 views.py:108 msgid "tag" msgstr "etiqueta" -#: models.py:34 -msgid "color" -msgstr "color" - #: models.py:37 msgid "tag properties" msgstr "propiedades de etiqueta" @@ -75,21 +115,63 @@ msgstr "propiedades de etiqueta" msgid "tags properties" msgstr "propiedades de etiquetas" -#: views.py:25 +#: views.py:26 #, python-format msgid "Tag \"%s\" removed successfully." msgstr "Etiqueta \"%s\" eliminada exitosamente." #: views.py:52 +msgid "Must choose either a new tag or an existing one." +msgstr "Debe elegir una etiqueta nueva o una ya existente." + +#: views.py:56 #, python-format msgid "Document is already tagged as \"%s\"" msgstr "Documento ya está etiquetado como \"%s\"" -#: views.py:61 +#: views.py:65 #, python-format msgid "Tag \"%s\" added successfully." msgstr "Etiqueta \"%s\", agregada exitosamente." +#: views.py:89 +msgid "Must provide at least one tag." +msgstr "Debe proveer al menos una etiqueta." + +#: views.py:99 +#, python-format +msgid "Tag \"%s\" deleted successfully." +msgstr "Etiqueta \"%s\" borrada exitosamente." + +#: views.py:101 +#, python-format +msgid "Error deleting tag \"%(tag)s\": %(error)s" +msgstr "Error al eliminar la etiqueta \"%(tag)s\": %(error)s" + +#: views.py:115 +#, python-format +msgid "Are you sure you wish to delete the tag: %s?" +msgstr "¿Está seguro que desea eliminar la etiqueta: %s?" + +#: views.py:116 views.py:119 +msgid "Will be removed from all documents." +msgstr "Se eliminará de todos los documentos." + +#: views.py:118 +#, python-format +msgid "Are you sure you wish to delete the tags: %s?" +msgstr "¿Está seguro que desea eliminar de las etiquetas: %s?" + +#: views.py:151 +#, python-format +msgid "edit tag: %s" +msgstr "editar la etiqueta: %s" + +#: views.py:162 +#, python-format +msgid "documents with the tag \"%s\"" +msgstr "documentos con la etiqueta \"%s\"" + #: templatetags/tags_tags.py:17 msgid "Add tag to document" msgstr "Agregar etiqueta al documento" diff --git a/apps/tags/models.py b/apps/tags/models.py index 18251e7682..22d5d98e9e 100644 --- a/apps/tags/models.py +++ b/apps/tags/models.py @@ -27,7 +27,7 @@ COLOR_CODES = ( (COLOR_YELLOW, u'yellow'), (COLOR_GREENYELLOW, u'greenyellow '), ) - + class TagProperties(models.Model): tag = models.ForeignKey(Tag, verbose_name=_(u'tag')) diff --git a/apps/tags/urls.py b/apps/tags/urls.py index a64a2b4a19..ab09172a88 100644 --- a/apps/tags/urls.py +++ b/apps/tags/urls.py @@ -3,6 +3,8 @@ from django.conf.urls.defaults import patterns, url urlpatterns = patterns('tags.views', url(r'^list/$', 'tag_list', (), 'tag_list'), url(r'^(?P\d+)/delete/$', 'tag_delete', (), 'tag_delete'), + url(r'^(?P\d+)/edit/$', 'tag_edit', (), 'tag_edit'), + url(r'^(?P\d+)/tagged_item/list/$', 'tag_tagged_item_list', (), 'tag_tagged_item_list'), url(r'^multiple/delete/$', 'tag_multiple_delete', (), 'tag_multiple_delete'), url(r'^(?P\d+)/remove_from_document/(?P\d+)/$', 'tag_remove', (), 'tag_remove'), diff --git a/apps/tags/utils.py b/apps/tags/utils.py index 60f2a0159e..aab915d471 100644 --- a/apps/tags/utils.py +++ b/apps/tags/utils.py @@ -3,17 +3,15 @@ from django.utils.translation import ugettext as _ from tags import tag_document_remove -def get_tags_subtemplate(obj): +def get_tags_subtemplate(obj): + """ + Return all the settings to render a subtemplate containing and + object's tags + """ return { 'name': 'generic_list_subtemplate.html', 'title': _(u'tags'), 'object_list': obj.tags.all(), - 'extra_columns': [ - {'name': _(u'color'), 'attribute': lambda x: u'
' % x.tagproperties_set.get().get_color_code()}, - ], 'hide_link': True, - 'navigation_object_links': {None: { - 'document_view_simple' : {'links': [tag_document_remove]}, - 'document_view' : {'links': [tag_document_remove]} - }} + 'navigation_object_links': [tag_document_remove], } diff --git a/apps/tags/views.py b/apps/tags/views.py index 2ed9a3fbe3..6170d3fc3c 100644 --- a/apps/tags/views.py +++ b/apps/tags/views.py @@ -6,26 +6,25 @@ from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy as _ from permissions.api import check_permissions - from taggit.models import Tag from documents.models import Document +from documents.views import document_list -from tags.forms import AddTagForm +from tags.forms import AddTagForm, TagForm from tags.models import TagProperties from tags import PERMISSION_TAG_CREATE, PERMISSION_TAG_ATTACH, \ PERMISSION_TAG_REMOVE, PERMISSION_TAG_DELETE, PERMISSION_TAG_EDIT - + def tag_remove(request, tag_id, document_id): check_permissions(request.user, 'tags', [PERMISSION_TAG_REMOVE]) tag = get_object_or_404(Tag, pk=tag_id) - document = get_object_or_404(Document, pk=document_id) previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', None))) tag.delete() messages.success(request, _(u'Tag "%s" removed successfully.') % tag) - + return HttpResponseRedirect(previous) @@ -33,7 +32,7 @@ def tag_add(request, document_id): document = get_object_or_404(Document, pk=document_id) previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', None))) - + if request.method == 'POST': previous = request.META.get('HTTP_REFERER', '/') form = AddTagForm(request.POST) @@ -52,17 +51,17 @@ def tag_add(request, document_id): else: messages.error(request, _(u'Must choose either a new tag or an existing one.')) return HttpResponseRedirect(previous) - + if tag_name in document.tags.values_list('name', flat=True): messages.warning(request, _(u'Document is already tagged as "%s"') % tag_name) return HttpResponseRedirect(previous) - + document.tags.add(tag_name) - + if is_new: tag = Tag.objects.get(name=tag_name) TagProperties(tag=tag, color=form.cleaned_data['color']).save() - + messages.success(request, _(u'Tag "%s" added successfully.') % tag_name) return HttpResponseRedirect(previous) @@ -127,3 +126,37 @@ def tag_multiple_delete(request): return tag_delete( request, tag_id_list=request.GET.get('id_list', []) ) + + +def tag_edit(request, tag_id): + check_permissions(request.user, 'tags', [PERMISSION_TAG_EDIT]) + tag = get_object_or_404(Tag, pk=tag_id) + + if request.method == 'POST': + form = TagForm(request.POST) + if form.is_valid(): + tag.name = form.cleaned_data['name'] + tag.save() + tag_properties = tag.tagproperties_set.get() + tag_properties.color = form.cleaned_data['color'] + tag_properties.save() + return HttpResponseRedirect(reverse('tag_list')) + else: + form = TagForm(initial={ + 'name': tag.name, + 'color': tag.tagproperties_set.get().color + }) + + return render_to_response('generic_form.html', { + 'title': _(u'edit tag: %s') % tag, + 'form': form, + 'object': tag, + }, + context_instance=RequestContext(request)) + + +def tag_tagged_item_list(request, tag_id): + tag = get_object_or_404(Tag, pk=tag_id) + object_list = [tagged_item.content_object for tagged_item in tag.taggit_taggeditem_items.all()] + + return document_list(request, object_list=object_list, title=_('documents with the tag "%s"') % tag)