diff --git a/apps/documents/forms.py b/apps/documents/forms.py index 39404dedc1..1a41729708 100644 --- a/apps/documents/forms.py +++ b/apps/documents/forms.py @@ -356,7 +356,7 @@ class MetaDataImageWidget(forms.widgets.Widget): %(text)s ''' % { - 'famfam': link.get('famfam', 'link'), + 'famfam': link.get('famfam', u'link'), 'text': capfirst(link['text']), 'action': reverse('metadatagroup_view', args=[value['current_document'].pk, value['group'].pk]) }) @@ -365,13 +365,16 @@ class MetaDataImageWidget(forms.widgets.Widget): output.append(u'
') for document in value['group_data']: tags_template = [] + tag_block_template = u'
%s
' tag_count = document.tags.count() if tag_count: tags_template.append(u'
') - tags_template.append(u'%(tag_string)s (%(tag_count)s): ' % { + tags_template.append(u'
%(tag_string)s: %(tag_count)s
' % { 'tag_string': _(u'Tags'), 'tag_count': tag_count}) - tags_template.append(u', '.join(document.tags.values_list('name', flat=True))) + for tag in document.tags.all(): + tags_template.append(tag_block_template % (tag.tagproperties_set.get().get_color_code(), tag.name)) + tags_template.append(u'
') output.append( diff --git a/apps/documents/locale/es/LC_MESSAGES/django.mo b/apps/documents/locale/es/LC_MESSAGES/django.mo index 5e6edc37c8..f96508f90c 100644 Binary files a/apps/documents/locale/es/LC_MESSAGES/django.mo and b/apps/documents/locale/es/LC_MESSAGES/django.mo differ diff --git a/apps/documents/locale/es/LC_MESSAGES/django.po b/apps/documents/locale/es/LC_MESSAGES/django.po index 6325495d21..8810486df1 100644 --- a/apps/documents/locale/es/LC_MESSAGES/django.po +++ b/apps/documents/locale/es/LC_MESSAGES/django.po @@ -2,20 +2,20 @@ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. -# +# #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-04-27 14:35-0400\n" -"PO-Revision-Date: 2011-04-27 14:43\n" +"POT-Creation-Date: 2011-04-28 00:37-0400\n" +"PO-Revision-Date: 2011-04-28 00:17\n" "Last-Translator: Roberto Rosario \n" "Language-Team: LANGUAGE \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: \n" "X-Translated-Using: django-rosetta 0.5.6\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -195,11 +195,11 @@ msgstr "Documentos" msgid "thumbnail" msgstr "miniatura" -#: __init__.py:136 views.py:295 views.py:839 +#: __init__.py:136 views.py:295 views.py:852 msgid "metadata" msgstr "metadatos" -#: __init__.py:143 __init__.py:149 models.py:62 views.py:76 +#: __init__.py:143 __init__.py:149 models.py:65 views.py:76 msgid "documents" msgstr "documentos" @@ -240,7 +240,7 @@ msgstr "Páginas del documento (%s)" msgid "Staging file" msgstr "Archivo de ensayo" -#: forms.py:258 models.py:205 +#: forms.py:258 models.py:208 msgid "required" msgstr "requerido" @@ -264,330 +264,350 @@ msgstr "paso 1 de 2: Tipo de documento" msgid "step 2 of 2: Document metadata" msgstr "paso 2 de 2: Metadatos de documento" -#: forms.py:388 views.py:277 +#: forms.py:373 +msgid "Tags" +msgstr "Etiquetas" + +#: forms.py:406 views.py:277 msgid "Pages" msgstr "Páginas" -#: forms.py:389 +#: forms.py:407 msgid "Select" msgstr "Seleccionar" -#: forms.py:397 +#: forms.py:416 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" -#: models.py:38 models.py:184 models.py:344 +#: models.py:39 models.py:187 models.py:347 msgid "name" msgstr "nombre" -#: models.py:47 models.py:203 models.py:220 models.py:248 models.py:343 +#: models.py:48 models.py:206 models.py:223 models.py:251 models.py:346 msgid "document type" msgstr "tipo de documento" -#: models.py:48 +#: models.py:49 msgid "file" msgstr "archivo" -#: models.py:55 +#: models.py:56 msgid "added" msgstr "agregado" -#: models.py:56 +#: models.py:57 msgid "updated" msgstr "actualizado" -#: models.py:57 +#: models.py:58 msgid "checksum" msgstr "suma de comprobación" -#: models.py:58 +#: models.py:59 msgid "description" msgstr "descripción" -#: models.py:61 models.py:235 models.py:262 models.py:433 models.py:447 -#: views.py:370 +#: models.py:64 models.py:238 models.py:265 models.py:436 models.py:450 +#: views.py:383 msgid "document" msgstr "documento" -#: models.py:179 models.py:216 +#: models.py:182 models.py:219 #, python-format msgid " Available functions: %s" msgstr "Funciones disponibles: %s" -#: models.py:180 +#: models.py:183 #, python-format msgid " Available models: %s" msgstr "Modelos disponibles: %s" -#: models.py:184 +#: models.py:187 msgid "Do not use python reserved words." msgstr "No utilice palabras reservadas de Python." -#: models.py:185 +#: models.py:188 msgid "title" msgstr "título" -#: models.py:187 +#: models.py:190 msgid "default" msgstr "por defecto" -#: models.py:188 +#: models.py:191 #, python-format msgid "Enter a string to be evaluated.%s" msgstr "Introduzca una cadena para ser evaluada.%s" -#: models.py:190 +#: models.py:193 msgid "lookup" msgstr "búsqueda" -#: models.py:191 +#: models.py:194 #, python-format -msgid "Enter a string to be evaluated. Example: [user.get_full_name() for user in User.objects.all()].%s" -msgstr "Introduzca una cadena para ser evaluada. Ejemplo: [user.get_full_name () for user in User.objects.all ()].%s" +msgid "" +"Enter a string to be evaluated. Example: [user.get_full_name() for user in " +"User.objects.all()].%s" +msgstr "" +"Introduzca una cadena para ser evaluada. Ejemplo: [user.get_full_name () for " +"user in User.objects.all ()].%s" -#: models.py:198 models.py:204 models.py:236 models.py:388 +#: models.py:201 models.py:207 models.py:239 models.py:391 msgid "metadata type" msgstr "tipo de metadatos" -#: models.py:199 +#: models.py:202 msgid "metadata types" msgstr "tipos de metadatos" -#: models.py:212 +#: models.py:215 msgid "document type metadata type connector" msgstr "conector tipo de documento y tipo de metadatos " -#: models.py:213 +#: models.py:216 msgid "document type metadata type connectors" msgstr "conectores de tipos de documentos y tipos de metadatos" -#: models.py:222 +#: models.py:225 msgid "indexing expression" msgstr "expresión de indexación" -#: models.py:223 +#: models.py:226 #, python-format -msgid "Enter a python string expression to be evaluated. The slash caracter \"/\" acts as a directory delimiter.%s" -msgstr "Introduzca una expresión de cadena de python para ser evaluada. El caracter barra \"/\" actúa como un delimitador de directorio. %s" +msgid "" +"Enter a python string expression to be evaluated. The slash caracter \"/\" " +"acts as a directory delimiter.%s" +msgstr "" +"Introduzca una expresión de cadena de python para ser evaluada. El caracter " +"barra \"/\" actúa como un delimitador de directorio. %s" -#: models.py:224 models.py:250 models.py:346 models.py:393 +#: models.py:227 models.py:253 models.py:349 models.py:396 msgid "enabled" msgstr "habilitado" -#: models.py:230 +#: models.py:233 msgid "metadata index" msgstr "índice de metadatos" -#: models.py:231 +#: models.py:234 msgid "metadata indexes" msgstr "índices de metadatos" -#: models.py:237 +#: models.py:240 msgid "metadata value" msgstr "datos de metadato" -#: models.py:243 models.py:244 views.py:91 +#: models.py:246 models.py:247 views.py:91 msgid "document metadata" msgstr "metadatos de documento" -#: models.py:249 +#: models.py:252 msgid "filename" msgstr "nombre de archivo" -#: models.py:257 +#: models.py:260 msgid "document type quick rename filename" msgstr "nombre de archivo para cambio rápido de nombre para tipo de documento" -#: models.py:258 +#: models.py:261 msgid "document types quick rename filenames" -msgstr "nombres de archivos para cambio rápido de nombre para tipo de documentos" +msgstr "" +"nombres de archivos para cambio rápido de nombre para tipo de documentos" -#: models.py:263 +#: models.py:266 msgid "content" msgstr "contenido" -#: models.py:264 +#: models.py:267 msgid "page label" msgstr "etiqueta de la página" -#: models.py:265 +#: models.py:268 msgid "page number" msgstr "número de página" -#: models.py:268 +#: models.py:271 #, python-format msgid "Page %(page_num)d of %(document)s" msgstr "Page %(page_num)d de %(document)s " -#: models.py:273 models.py:407 +#: models.py:276 models.py:410 msgid "document page" msgstr "página de documento" -#: models.py:274 +#: models.py:277 msgid "document pages" msgstr "páginas de documentos" -#: models.py:343 +#: models.py:346 msgid "If left blank, all document types will be matched." msgstr "Si deja en blanco, todos los tipos de documentos será igualado." -#: models.py:345 +#: models.py:348 msgid "label" msgstr "etiqueta" -#: models.py:354 +#: models.py:357 msgid "document group" msgstr "grupo de documentos" -#: models.py:355 +#: models.py:358 msgid "document groups" msgstr "grupos de documentos" -#: models.py:362 +#: models.py:365 msgid "and" msgstr "y" -#: models.py:363 +#: models.py:366 msgid "or" msgstr "o" -#: models.py:367 +#: models.py:370 msgid "is equal" msgstr "es igual" -#: models.py:368 +#: models.py:371 msgid "is equal (case insensitive)" msgstr "es igual (mayúsculas y minúsculas)" -#: models.py:369 +#: models.py:372 msgid "contains" msgstr "contiene" -#: models.py:370 +#: models.py:373 msgid "contains (case insensitive)" msgstr "contiene (mayúsculas y minúsculas)" -#: models.py:371 +#: models.py:374 msgid "is in" msgstr "está en" -#: models.py:372 +#: models.py:375 msgid "is greater than" msgstr "es mayor que" -#: models.py:373 +#: models.py:376 msgid "is greater than or equal" msgstr "es mayor o igual" -#: models.py:374 +#: models.py:377 msgid "is less than" msgstr "es menor que" -#: models.py:375 +#: models.py:378 msgid "is less than or equal" msgstr "es menor o igual" -#: models.py:376 +#: models.py:379 msgid "starts with" msgstr "comienza con" -#: models.py:377 +#: models.py:380 msgid "starts with (case insensitive)" msgstr "comienza con (mayúsculas y minúsculas)" -#: models.py:378 +#: models.py:381 msgid "ends with" msgstr "termina con" -#: models.py:379 +#: models.py:382 msgid "ends with (case insensitive)" msgstr "termina con (mayúsculas y minúsculas)" -#: models.py:380 +#: models.py:383 msgid "is in regular expression" msgstr "está en la expresion regular" -#: models.py:381 +#: models.py:384 msgid "is in regular expression (case insensitive)" msgstr "está en la expresión regular (mayúsculas y minúsculas)" -#: models.py:386 +#: models.py:389 msgid "metadata group" msgstr "grupo de metadatos" -#: models.py:387 +#: models.py:390 msgid "The inclusion is ignored for the first item." msgstr "La inclusión es ignorada para el primer artículo." -#: models.py:388 +#: models.py:391 msgid "This represents the metadata of all other documents." msgstr "Esto representa los metadatos de todos los demás documentos." -#: models.py:391 +#: models.py:394 msgid "expression" msgstr "expresión" -#: models.py:391 -msgid "This expression will be evaluated against the current selected document. The document metadata is available as variables of the same name but with the \"metadata_\" prefix added their name." -msgstr "Esta expresión se evalúa con respecto al documento actual seleccionado. Los metadatos del documento están disponible como variables del mismo nombre pero con prefijo \"metadata_\" agregado al nombre." +#: models.py:394 +msgid "" +"This expression will be evaluated against the current selected document. " +"The document metadata is available as variables of the same name but with " +"the \"metadata_\" prefix added their name." +msgstr "" +"Esta expresión se evalúa con respecto al documento actual seleccionado. Los " +"metadatos del documento están disponible como variables del mismo nombre " +"pero con prefijo \"metadata_\" agregado al nombre." -#: models.py:392 +#: models.py:395 msgid "negated" msgstr "negada" -#: models.py:392 +#: models.py:395 msgid "Inverts the logic of the operator." msgstr "Invierte la lógica del operador." -#: models.py:396 +#: models.py:399 msgid "not" msgstr "not" -#: models.py:399 +#: models.py:402 msgid "group item" msgstr "artículo de grupo de documentos" -#: models.py:400 +#: models.py:403 msgid "group items" msgstr "artículos de grupos de documentos" -#: models.py:408 views.py:655 +#: models.py:411 views.py:668 msgid "order" msgstr "orden" -#: models.py:409 views.py:656 views.py:696 +#: models.py:412 views.py:669 views.py:709 msgid "transformation" msgstr "transformación" -#: models.py:410 views.py:657 +#: models.py:413 views.py:670 msgid "arguments" msgstr "argumentos" -#: models.py:410 +#: models.py:413 msgid "Use dictionaries to indentify arguments, example: {'degrees':90}" -msgstr "Use diccionarios para identificar los argumentos, por ejemplo: {'grados': 90}" +msgstr "" +"Use diccionarios para identificar los argumentos, por ejemplo: {'grados': 90}" -#: models.py:417 +#: models.py:420 msgid "document page transformation" msgstr "transformación de página de documento" -#: models.py:418 +#: models.py:421 msgid "document page transformations" msgstr "transformaciones de páginas de documentos" -#: models.py:432 +#: models.py:435 msgid "user" msgstr "usuario" -#: models.py:434 +#: models.py:437 msgid "accessed" msgstr "accesado" -#: models.py:443 +#: models.py:446 msgid "recent document" msgstr "documento reciente" -#: models.py:444 views.py:1015 +#: models.py:447 views.py:1041 msgid "recent documents" msgstr "documentos recientes" @@ -623,8 +643,12 @@ msgstr "Documentos en almacenamiento: %d" #: statistics.py:45 #, python-format -msgid "Space used in storage: %(base_2)s (base 2), %(base_10)s (base 10), %(bytes)d bytes" -msgstr "Espacio utilizado en el almacenamiento: %(base_2)s (base 2), %(base_10)s (base 10), %(bytes)d bytes" +msgid "" +"Space used in storage: %(base_2)s (base 2), %(base_10)s (base 10), %(bytes)d " +"bytes" +msgstr "" +"Espacio utilizado en el almacenamiento: %(base_2)s (base 2), %(base_10)s " +"(base 10), %(bytes)d bytes" #: statistics.py:54 #, python-format @@ -714,192 +738,228 @@ msgstr "Suma de comprobación" msgid "UUID" msgstr "UUID" -#: views.py:287 views.py:830 +#: views.py:287 views.py:843 msgid "document properties" msgstr "propiedades del documento" -#: views.py:297 views.py:841 +#: views.py:297 views.py:854 msgid "value" msgstr "valor" -#: views.py:305 views.py:849 +#: views.py:305 views.py:862 #, python-format msgid "Document group query error: %s" msgstr "Drror de consulta de grupo de documentos: %s" -#: views.py:315 views.py:859 +#: views.py:315 views.py:872 #, python-format msgid "document groups (%s)" msgstr "grupo de documentos (%s)" -#: views.py:328 +#: views.py:328 views.py:888 +msgid "tags" +msgstr "etiquetas" + +#: views.py:331 views.py:891 +msgid "color" +msgstr "color" + +#: views.py:340 msgid "index links" msgstr "enlaces de índice" -#: views.py:350 views.py:454 views.py:774 +#: views.py:363 views.py:467 views.py:787 msgid "Must provide at least one document." msgstr "Debe proveer al menos un documento." -#: views.py:361 +#: views.py:374 #, python-format msgid "Document: %s deleted successfully." msgstr "Documento: %s eliminado con éxito." -#: views.py:363 +#: views.py:376 #, python-format msgid "Document: %(document)s delete error: %(error)s" msgstr "Documento: %(document)s, error de eliminación: %(error)s " -#: views.py:377 +#: views.py:390 #, python-format msgid "Are you sure you wish to delete the document: %s?" msgstr "¿Está seguro que desea eliminar el documento: %s?" -#: views.py:379 +#: views.py:392 #, python-format msgid "Are you sure you wish to delete the documents: %s?" msgstr "¿Está seguro que desea eliminar los documentos: %s?" -#: views.py:418 +#: views.py:431 #, python-format msgid "Document %s edited successfully." msgstr "Documento %s editado con éxito." -#: views.py:427 +#: views.py:440 msgid "Document filesystem links updated successfully." msgstr "Enlaces del documento actualizados con éxito." -#: views.py:451 +#: views.py:464 msgid "All documents must be from the same type." msgstr "Todos los documentos deben ser del mismo tipo." -#: views.py:486 +#: views.py:499 #, 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 " +msgstr "" +"Error al eliminar los enlaces del sistema de archivos para el documento: " +"%(document)s; %(error)s " -#: views.py:489 +#: views.py:502 #, python-format msgid "Metadata for document %s edited successfully." msgstr "Metadatos para documento %s editado con éxito." -#: views.py:498 +#: views.py:511 #, python-format msgid "Filesystem links updated successfully for document: %s." -msgstr "Enlaces del sistema de archivos actualizados con éxito para el documento: %s." +msgstr "" +"Enlaces del sistema de archivos actualizados con éxito para el documento: %s." -#: views.py:500 +#: views.py:513 #, 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 " +msgstr "" +"Error al crear vínculos de sistema de archivos para el documento: " +"%(document)s; %(error)s " -#: views.py:514 +#: views.py:527 #, python-format msgid "Edit metadata for document: %s" msgstr "Editar de metadatos para el documento: %s" -#: views.py:516 +#: views.py:529 #, python-format msgid "Edit metadata for documents: %s" msgstr "Editar metadatos para los documentos: %s" -#: views.py:538 +#: views.py:551 #, python-format msgid "Page transformation error: %s" msgstr "Error de transformación de página: %s" -#: views.py:599 +#: views.py:612 #, python-format msgid "Staging file transformation error: %(error)s" msgstr "Error de transformación de archivo de ensayo: %(error)s " -#: views.py:628 +#: views.py:641 msgid "Staging file delete successfully." msgstr "Archivo de ensayo eliminado con éxito." -#: views.py:652 +#: views.py:665 #, python-format msgid "transformations for: %s" msgstr "transformaciones para: %s" -#: views.py:681 +#: views.py:694 #, 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 " +msgstr "" +"Crear nueva transformación de la página: %(page)s del documento: " +"%(document)s " -#: views.py:697 +#: views.py:710 #, python-format msgid "Edit transformation \"%(transformation)s\" for: %(document_page)s" msgstr "Editar transformación \" %(transformation)s\" para: %(document_page)s" -#: views.py:718 views.py:794 +#: views.py:731 views.py:807 msgid "document transformation" msgstr "transformación de documento" -#: views.py:719 +#: views.py:732 #, python-format -msgid "Are you sure you wish to delete transformation \"%(transformation)s\" for: %(document_page)s" -msgstr "¿Está seguro que desea eliminar la transformación \"%(transformation)s\" para: %(document_page)s" +msgid "" +"Are you sure you wish to delete transformation \"%(transformation)s\" for: " +"%(document_page)s" +msgstr "" +"¿Está seguro que desea eliminar la transformación \"%(transformation)s\" " +"para: %(document_page)s" -#: views.py:740 views.py:887 +#: views.py:753 views.py:913 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:754 +#: views.py:767 msgid "duplicated documents" msgstr "documentos duplicados" -#: views.py:786 +#: views.py:799 #, python-format -msgid "All the page transformations for document: %s, have been deleted successfully." -msgstr "Todas las transformaciones de la página de documento: %s, se han eliminado con éxito." +msgid "" +"All the page transformations for document: %s, have been deleted " +"successfully." +msgstr "" +"Todas las transformaciones de la página de documento: %s, se han eliminado " +"con éxito." -#: views.py:788 +#: views.py:801 #, python-format -msgid "Error deleting the page transformations for document: %(document)s; %(error)s." -msgstr "Error al eliminar las transformaciones de página para el documento: %(document)s; %(error)s." +msgid "" +"Error deleting the page transformations for document: %(document)s; " +"%(error)s." +msgstr "" +"Error al eliminar las transformaciones de página para el documento: " +"%(document)s; %(error)s." -#: views.py:802 +#: views.py:815 #, python-format -msgid "Are you sure you wish to clear all the page transformations for document: %s?" -msgstr "¿Está seguro que desea eliminar todas las transformaciones de página del documento: %s?" +msgid "" +"Are you sure you wish to clear all the page transformations for document: %s?" +msgstr "" +"¿Está seguro que desea eliminar todas las transformaciones de página del " +"documento: %s?" -#: views.py:804 +#: views.py:817 #, python-format -msgid "Are you sure you wish to clear all the page transformations for documents: %s?" -msgstr "¿Está seguro que desea eliminar las transformaciones de página de los documentos: %s?" +msgid "" +"Are you sure you wish to clear all the page transformations for documents: " +"%s?" +msgstr "" +"¿Está seguro que desea eliminar las transformaciones de página de los " +"documentos: %s?" -#: views.py:897 +#: views.py:923 msgid "missing documents" msgstr "documentos perdidos" -#: views.py:913 views.py:932 +#: views.py:939 views.py:958 #, python-format msgid "details for: %s" msgstr "detalles para: %s" -#: views.py:953 +#: views.py:979 msgid "Document page edited successfully." msgstr "Página del documento se ha editado correctamente." -#: views.py:961 +#: views.py:987 #, python-format msgid "edit: %s" msgstr "editar: %s" -#: views.py:972 +#: views.py:998 msgid "There are no more pages in this document" msgstr "No hay más páginas en este documento" -#: views.py:985 +#: views.py:1011 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:1083 +#: views.py:1109 msgid "No action selected." msgstr "Ninguna acción seleccionada." -#: views.py:1099 +#: views.py:1125 #, python-format msgid "documents in group: %(group)s, for document: %(document)s" msgstr "grupo de documentos: %(group)s, para el documento: %(document)s " @@ -924,31 +984,45 @@ msgstr "Rotar [degrees]" #~ msgstr "muestra del documento" #~ msgid "Show document thumbnail in metadata group list" -#~ msgstr "Mostrar imagen de muestra del documento en la lista de grupos de metadatos" +#~ msgstr "" +#~ "Mostrar imagen de muestra del documento en la lista de grupos de metadatos" #~ msgid "exists" #~ msgstr "existe" #~ msgid "Document: %(document)s was added to the OCR queue: %(queue)s." -#~ msgstr "Documento: %(document)s ha sido añadido a la cola de reconocimiento óptico de caracteres: %(queue)s." +#~ msgstr "" +#~ "Documento: %(document)s ha sido añadido a la cola de reconocimiento " +#~ "óptico de caracteres: %(queue)s." -#~ msgid "Not creating metadata indexing, document not found in document storage" -#~ msgstr "No se creó la indexación de metadatos, el documento no se encuentran en almacenamiento de documentos" +#~ msgid "" +#~ "Not creating metadata indexing, document not found in document storage" +#~ msgstr "" +#~ "No se creó la indexación de metadatos, el documento no se encuentran en " +#~ "almacenamiento de documentos" #~ msgid "Unable to create metadata indexing directory: %s" #~ msgstr "No se puede crear el directorio de indexación de metadatos: %s" #~ msgid "Unable to delete metadata indexing symbolic link: %s" -#~ msgstr "No se puede eliminar el enlace simbólico de indexación de metadatos: %s" +#~ msgstr "" +#~ "No se puede eliminar el enlace simbólico de indexación de metadatos: %s" -#~ msgid "Unable to create symbolic link, filename clash: %(filepath)s; %(exc)s" -#~ msgstr "No se puede crear un enlace simbólico, choque de nombre de archivo: %(filepath)s; %(exc)s " +#~ msgid "" +#~ "Unable to create symbolic link, filename clash: %(filepath)s; %(exc)s" +#~ msgstr "" +#~ "No se puede crear un enlace simbólico, choque de nombre de archivo: " +#~ "%(filepath)s; %(exc)s " #~ msgid "Unable to create symbolic link: %(filepath)s; %(exc)s" -#~ msgstr "No se puede crear un enlace simbólico de indexación de metadatos %(filepath)s; %(exc)s" +#~ msgstr "" +#~ "No se puede crear un enlace simbólico de indexación de metadatos " +#~ "%(filepath)s; %(exc)s" #~ msgid "Maximum rename count reached, not creating symbolic link" -#~ msgstr "Conteo de cambio de nombre llego al máximo, no se va a crear el enlaces simbólico" +#~ msgstr "" +#~ "Conteo de cambio de nombre llego al máximo, no se va a crear el enlaces " +#~ "simbólico" #~ msgid "suffix" #~ msgstr "sufijo" diff --git a/apps/documents/views.py b/apps/documents/views.py index 03c73ec269..a574ca343b 100644 --- a/apps/documents/views.py +++ b/apps/documents/views.py @@ -289,15 +289,30 @@ def document_view(request, document_id): 'object': document, }, ] - subtemplates_dict = [ + + subtemplates_dict = [] + if document.tags.count(): + subtemplates_dict.append( { 'name': 'generic_list_subtemplate.html', - 'title': _(u'metadata'), - 'object_list': document.documentmetadata_set.all(), - 'extra_columns': [{'name':_(u'value'), 'attribute':'value'}], + 'title': _(u'tags'), + 'object_list': document.tags.all(), + 'extra_columns': [ + {'name': _(u'color'), 'attribute': lambda x: u'
' % x.tagproperties_set.get().get_color_code()} + ], 'hide_link': True, - }, - ] + } + ) + + subtemplates_dict.append( + { + 'name': 'generic_list_subtemplate.html', + 'title': _(u'metadata'), + 'object_list': document.documentmetadata_set.all(), + 'extra_columns': [{'name': _(u'value'), 'attribute': 'value'}], + 'hide_link': True, + }, + ) metadata_groups, errors = document.get_metadata_groups() if (request.user.is_staff or request.user.is_superuser) and errors: @@ -333,6 +348,7 @@ def document_view(request, document_id): return render_to_response('generic_detail.html', { 'form_list': form_list, 'object': document, + 'document': document, 'subtemplates_dict': subtemplates_dict, }, context_instance=RequestContext(request)) @@ -832,8 +848,22 @@ def document_view_simple(request, document_id): 'object': document, }, ] + + subtemplates_dict = [] + if document.tags.count(): + subtemplates_dict.append( + { + 'name': 'generic_list_subtemplate.html', + 'title': _(u'tags'), + 'object_list': document.tags.all(), + 'extra_columns': [ + {'name': _(u'color'), 'attribute': lambda x: u'
' % x.tagproperties_set.get().get_color_code()} + ], + 'hide_link': True, + } + ) - subtemplates_dict = [ + subtemplates_dict.append( { 'name': 'generic_list_subtemplate.html', 'title': _(u'metadata'), @@ -841,7 +871,7 @@ def document_view_simple(request, document_id): 'extra_columns': [{'name': _(u'value'), 'attribute': 'value'}], 'hide_link': True, }, - ] + ) metadata_groups, errors = document.get_metadata_groups() if (request.user.is_staff or request.user.is_superuser) and errors: @@ -869,16 +899,6 @@ def document_view_simple(request, document_id): } ) - subtemplates_dict.append( - { - 'name': 'generic_list_subtemplate.html', - 'title': _(u'tags'), - 'object_list': document.tags.all(), - #'extra_columns': [{'name': _(u'value'), 'attribute': 'value'}], - 'hide_link': True, - } - ) - return render_to_response('generic_detail.html', { 'form_list': form_list, 'object': document, diff --git a/apps/folders/locale/es/LC_MESSAGES/django.mo b/apps/folders/locale/es/LC_MESSAGES/django.mo index e465cd2062..dbf6e2fdf9 100644 Binary files a/apps/folders/locale/es/LC_MESSAGES/django.mo and b/apps/folders/locale/es/LC_MESSAGES/django.mo differ diff --git a/apps/folders/locale/es/LC_MESSAGES/django.po b/apps/folders/locale/es/LC_MESSAGES/django.po index 5054b8f093..3541d02d7b 100644 --- a/apps/folders/locale/es/LC_MESSAGES/django.po +++ b/apps/folders/locale/es/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-04-21 04:25-0400\n" -"PO-Revision-Date: 2011-04-21 04:29\n" +"POT-Creation-Date: 2011-04-28 00:38-0400\n" +"PO-Revision-Date: 2011-04-28 00:38\n" "Last-Translator: Roberto Rosario \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" @@ -19,31 +19,35 @@ msgstr "" "X-Translated-Using: django-rosetta 0.5.6\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: __init__.py:10 +#: __init__.py:9 msgid "folder list" msgstr "lista de carpetas" -#: __init__.py:11 views.py:49 +#: __init__.py:10 views.py:48 msgid "create folder" msgstr "crear una carpeta" -#: __init__.py:12 +#: __init__.py:11 msgid "edit" msgstr "editar" -#: __init__.py:13 +#: __init__.py:12 msgid "delete" msgstr "eliminar" -#: __init__.py:14 +#: __init__.py:13 msgid "remove" msgstr "quitar" -#: __init__.py:23 models.py:31 views.py:25 +#: __init__.py:22 models.py:31 views.py:24 msgid "folders" msgstr "carpetas" -#: forms.py:19 +#: forms.py:20 +msgid "Existing folders" +msgstr "Carpetas existentes" + +#: forms.py:22 msgid "New folder" msgstr "Nueva carpeta" @@ -59,15 +63,15 @@ msgstr "usuario" msgid "datetime created" msgstr "fecha y hora creados" -#: models.py:30 models.py:35 views.py:104 views.py:138 +#: models.py:30 models.py:35 views.py:103 views.py:137 msgid "folder" msgstr "carpeta" -#: models.py:36 views.py:125 +#: models.py:36 views.py:124 msgid "document" msgstr "documento" -#: models.py:42 views.py:200 +#: models.py:42 views.py:199 msgid "folder document" msgstr "documento de carpeta" @@ -75,95 +79,95 @@ msgstr "documento de carpeta" msgid "folders documents" msgstr "documentos de carpeta" -#: views.py:28 +#: views.py:27 msgid "created" msgstr "creado" -#: views.py:29 +#: views.py:28 msgid "documents" msgstr "documentos" -#: views.py:41 views.py:155 +#: views.py:40 views.py:154 msgid "Folder created successfully" msgstr "Carpeta creada con éxito" -#: views.py:44 views.py:157 +#: views.py:43 views.py:156 #, python-format msgid "A folder named: %s, already exists." msgstr "Una carpeta con el nombre: %s, ya existe." -#: views.py:67 +#: views.py:66 msgid "Folder edited successfully" msgstr "Carpeta editada con éxito" -#: views.py:70 +#: views.py:69 #, python-format msgid "Error editing folder; %s" msgstr "Error editando carpeta; %s" -#: views.py:75 +#: views.py:74 #, python-format msgid "edit folder: %s" msgstr "editar carpeta: %s" -#: views.py:96 +#: views.py:95 #, python-format msgid "Folder: %s deleted successfully." msgstr "Carpeta: %s eliminada con éxito." -#: views.py:98 +#: views.py:97 #, python-format msgid "Folder: %(folder)s delete error: %(error)s" msgstr "Carpeta: %(folder)s error de eliminación: %(error)s " -#: views.py:109 +#: views.py:108 #, python-format msgid "Are you sure you with to delete the folder: %s?" msgstr "¿Está seguro de que desea eliminar la carpeta: %s?" -#: views.py:128 +#: views.py:127 msgid "thumbnail" msgstr "miniatura" -#: views.py:135 +#: views.py:134 #, python-format msgid "documents in folder: %s" msgstr "documentos en la carpeta: %s" -#: views.py:160 +#: views.py:159 msgid "Must specify a new folder or an existing one." msgstr "Debe especificar una carpeta nueva o una ya existente." -#: views.py:165 +#: views.py:164 #, python-format msgid "Document: %(document)s added to folder: %(folder)s successfully." msgstr "Documento: %(document)s agregado a la carpeta: %(folder)s exitosamente." -#: views.py:168 +#: views.py:167 #, python-format msgid "Document: %(document)s is already in folder: %(folder)s." msgstr "Documento: %(document)s ya está en la carpeta: %(folder)s." -#: views.py:182 +#: views.py:181 msgid "Must provide at least one folder document." msgstr "Debe proveer al menos un documento de carpeta." -#: views.py:192 +#: views.py:191 #, python-format msgid "Document: %s removed successfully." msgstr "Documento: %s removido exitosamente." -#: views.py:194 +#: views.py:193 #, python-format msgid "Document: %(document)s delete error: %(error)s" msgstr "Documento: %(document)s error de remoción: %(error)s " -#: views.py:206 +#: views.py:205 #, python-format msgid "Are you sure you wish to remove the document: %s?" msgstr "¿Está seguro que desea remover el documento: %s?" -#: views.py:208 +#: views.py:207 #, python-format msgid "Are you sure you wish to remove the documents: %s?" msgstr "¿Está seguro que desea eliminar los documentos: %s?" diff --git a/apps/ocr/__init__.py b/apps/ocr/__init__.py index 6b7842aa2d..97188c1ec0 100644 --- a/apps/ocr/__init__.py +++ b/apps/ocr/__init__.py @@ -47,7 +47,7 @@ register_multi_item_links(['queue_document_list'], [re_queue_multiple_document, register_menu([ {'text': _('OCR'), 'view': 'queue_document_list', 'links':[ queue_document_list, node_active_list - ], 'famfam': 'hourglass', 'position': 4}]) + ], 'famfam': 'hourglass', 'position': 5}]) try: diff --git a/apps/tags/__init__.py b/apps/tags/__init__.py index 0284a1b4ac..c9b9afa995 100644 --- a/apps/tags/__init__.py +++ b/apps/tags/__init__.py @@ -7,9 +7,29 @@ from navigation.api import register_sidebar_template from taggit.models import Tag -tag_delete = {'text': _('delete'), 'view': 'tag_remove', 'args': ['object.id', 'document.id'], 'famfam': 'tag_blue_delete'}#, 'permissions': {'namespace': 'documents', 'permissions': [PERMISSION_DOCUMENT_DELETE]}} +PERMISSION_TAG_CREATE = 'tag_create' +PERMISSION_TAG_ATTACH = 'tag_attach' +PERMISSION_TAG_DELETE = 'tag_delete' +register_permissions('tags', [ + {'name': PERMISSION_TAG_CREATE, 'label': _(u'Can create new tags')}, + {'name': PERMISSION_TAG_ATTACH, 'label': _(u'Can attach exising tags')}, + {'name': PERMISSION_TAG_DELETE, 'label': _(u'Can delete tags')}, +]) + +tag_list = {'text': _('tags'), 'view': 'tag_list', 'famfam': 'tag_blue'} +tag_delete = {'text': _('delete'), 'view': 'tag_remove', 'args': ['object.id', 'document.id'], 'famfam': 'tag_blue_delete', 'permissions': {'namespace': 'tags', 'permissions': [PERMISSION_TAG_DELETE]}} register_links(Tag, [tag_delete]) register_sidebar_template(['document_view', 'document_view_simple'], 'tags_sidebar_template.html') + +tags_menu = [ + { + 'text': _(u'tags'), 'view': 'tag_list', 'famfam': 'tag_blue', 'position': 4, 'links': [ + tag_list + ] + }, +] + +#register_menu(tags_menu) diff --git a/apps/tags/admin.py b/apps/tags/admin.py new file mode 100644 index 0000000000..bac2c25369 --- /dev/null +++ b/apps/tags/admin.py @@ -0,0 +1,11 @@ +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 0a4a01b835..1a7371d90d 100644 --- a/apps/tags/forms.py +++ b/apps/tags/forms.py @@ -1,29 +1,12 @@ from django import forms -from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy as _ from taggit.models import Tag - -#class FolderForm(forms.ModelForm): -# class Meta: -# model = Folder -# fields = ('title',) +from models import COLOR_CHOICES -class AddTagForm(forms.ModelForm): - def __init__(self, *args, **kwargs): - #user = kwargs.pop('user', None) - super(AddTagForm, self).__init__(*args, **kwargs) - #self.fields['title'].required = False - #self.fields['title'].label = _(u'New folder') - - self.fields['existing_tags'] = forms.ModelChoiceField( - required=False, - queryset=Tag.objects.all(), #(user=user), - label=_(u'Existing tags')) - self.fields['name'].required = False - self.fields['name'].label = _(u'New tag') - - class Meta: - model = Tag - fields = ('name',) +class AddTagForm(forms.Form): + 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')) diff --git a/apps/tags/locale/es/LC_MESSAGES/django.mo b/apps/tags/locale/es/LC_MESSAGES/django.mo new file mode 100644 index 0000000000..47d45cc0e7 Binary files /dev/null and b/apps/tags/locale/es/LC_MESSAGES/django.mo differ diff --git a/apps/tags/locale/es/LC_MESSAGES/django.po b/apps/tags/locale/es/LC_MESSAGES/django.po new file mode 100644 index 0000000000..036487f8ce --- /dev/null +++ b/apps/tags/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,95 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-04-28 00:14-0400\n" +"PO-Revision-Date: 2011-04-28 00:17\n" +"Last-Translator: Roberto Rosario \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"X-Translated-Using: django-rosetta 0.5.6\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: __init__.py:10 +msgid "delete" +msgstr "eliminar" + +#: forms.py:15 +msgid "New tag" +msgstr "Nueva etiqueta" + +#: forms.py:16 +msgid "Color" +msgstr "Color" + +#: forms.py:17 +msgid "Existing tags" +msgstr "Etiquetas existentes" + +#: models.py:14 +msgid "Blue" +msgstr "Azul" + +#: models.py:15 +msgid "Cyan" +msgstr "Cian" + +#: models.py:16 +msgid "Green-Yellow" +msgstr "Verde-Amarillo" + +#: models.py:17 +msgid "Magenta" +msgstr "Magenta" + +#: models.py:18 +msgid "Red" +msgstr "Rojo" + +#: models.py:19 +msgid "Yellow" +msgstr "Amarillo" + +#: models.py:33 +msgid "tag" +msgstr "etiqueta" + +#: models.py:34 +msgid "color" +msgstr "color" + +#: models.py:37 +msgid "tag properties" +msgstr "propiedades de etiqueta" + +#: models.py:38 +msgid "tags properties" +msgstr "propiedades de etiquetas" + +#: views.py:25 +#, python-format +msgid "Tag \"%s\" removed successfully." +msgstr "Etiqueta \"%s\" eliminada exitosamente." + +#: views.py:52 +#, python-format +msgid "Document is already tagged as \"%s\"" +msgstr "Documento ya está etiquetado como \"%s\"" + +#: views.py:61 +#, python-format +msgid "Tag \"%s\" added successfully." +msgstr "Etiqueta \"%s\", agregada exitosamente." + +#: 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 33b9aba3d5..18251e7682 100644 --- a/apps/tags/models.py +++ b/apps/tags/models.py @@ -1,5 +1,5 @@ from django.db import models -from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy as _ from taggit.models import Tag @@ -8,21 +8,24 @@ COLOR_BLUE = u'blu' COLOR_MAGENTA = u'mag' COLOR_CYAN = u'cya' COLOR_YELLOW = u'yel' +COLOR_GREENYELLOW = u'gry' COLOR_CHOICES = ( - (COLOR_RED, _(u'red')), - (COLOR_BLUE, _(u'blue')), -# (COLOR_MAGENTA, _(u'magenta')), -# (COLOR_CYAN, _(u'cyan')), - (COLOR_YELLOW, _(u'yellow')) + (COLOR_BLUE, _(u'Blue')), + (COLOR_CYAN, _(u'Cyan')), + (COLOR_GREENYELLOW, _(u'Green-Yellow')), + (COLOR_MAGENTA, _(u'Magenta')), + (COLOR_RED, _(u'Red')), + (COLOR_YELLOW, _(u'Yellow')) ) COLOR_CODES = ( - (COLOR_RED, u'FF0000'), - (COLOR_BLUE, u'0000FF'), -# (COLOR_MAGENTA, u'FF0000'), -# (COLOR_CYAN, u'FF0000'), - (COLOR_YELLOW, u'00FFFF') + (COLOR_RED, u'red'), + (COLOR_BLUE, u'blue'), + (COLOR_MAGENTA, u'magenta'), + (COLOR_CYAN, u'cyan'), + (COLOR_YELLOW, u'yellow'), + (COLOR_GREENYELLOW, u'greenyellow '), ) @@ -35,4 +38,7 @@ class TagProperties(models.Model): verbose_name_plural = _(u'tags properties') def __unicode__(self): - return self.tag + return unicode(self.tag) + + def get_color_code(self): + return dict(COLOR_CODES)[self.color] diff --git a/apps/tags/templatetags/tags_tags.py b/apps/tags/templatetags/tags_tags.py index 9f111d9d8e..630a028508 100644 --- a/apps/tags/templatetags/tags_tags.py +++ b/apps/tags/templatetags/tags_tags.py @@ -11,7 +11,7 @@ register = Library() @register.inclusion_tag('generic_form_subtemplate.html', takes_context=True) def get_add_tag_to_document_form(context): context.update({ - 'form': AddTagForm(),#user=context['request'].user), + 'form': AddTagForm(), 'request': context['request'], 'form_action': reverse('tag_add', args=[context['document'].pk]), 'title': _('Add tag to document') diff --git a/apps/tags/urls.py b/apps/tags/urls.py index d25430cce6..3a7b0dfd30 100644 --- a/apps/tags/urls.py +++ b/apps/tags/urls.py @@ -1,17 +1,7 @@ from django.conf.urls.defaults import patterns, url urlpatterns = patterns('tags.views', - url(r'^(?P\d+)/remove_from_document/(?P\d+)$', 'tag_remove', (), 'tag_remove'), - url(r'^add_to_document/(?P\d+)$', 'tag_add', (), 'tag_add'), -# url(r'^ocr/queue/document/list/$', 'queue_document_list', (), 'queue_document_list'), -# url(r'^ocr/queue/document/(?P\d+)/delete/$', 'queue_document_delete', (), 'queue_document_delete'), -# url(r'^ocr/queue/document/multiple/delete/$', 'queue_document_multiple_delete', (), 'queue_document_multiple_delete'), -# url(r'^ocr/queue/document/(?P\d+)/re-queue/$', 're_queue_document', (), 're_queue_document'), -# url(r'^ocr/queue/document/multiple/re-queue/$', 're_queue_multiple_document', (), 're_queue_multiple_document'),# - -# url(r'^ocr/queue/(?P\d+)/enable/$', 'document_queue_enable', (), 'document_queue_enable'),# -# url(r'^ocr/queue/(?P\d+)/disable/$', 'document_queue_disable', (), 'document_queue_disable'), - -# url(r'^ocr/document/all/clean_up/$', 'all_document_ocr_cleanup', (), 'all_document_ocr_cleanup'), -# url(r'^ocr/node/active/list/$', 'node_active_list', (), 'node_active_list'), + url(r'^list/$', 'tag_list', (), 'tag_list'), + url(r'^(?P\d+)/remove_from_document/(?P\d+)/$', 'tag_remove', (), 'tag_remove'), + url(r'^add_to_document/(?P\d+)/$', 'tag_add', (), 'tag_add'), ) diff --git a/apps/tags/views.py b/apps/tags/views.py index 569f5c5f4c..bd7ac68c5e 100644 --- a/apps/tags/views.py +++ b/apps/tags/views.py @@ -11,43 +11,67 @@ from taggit.models import Tag from documents.models import Document from tags.forms import AddTagForm - +from tags.models import TagProperties +from tags import PERMISSION_TAG_CREATE, PERMISSION_TAG_ATTACH, \ + PERMISSION_TAG_DELETE + def tag_remove(request, tag_id, document_id): -# check_permissions(request.user, 'ocr', [PERMISSION_OCR_DOCUMENT]) + check_permissions(request.user, 'tags', [PERMISSION_TAG_DELETE]) 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) + messages.success(request, _(u'Tag "%s" removed successfully.') % tag) return HttpResponseRedirect(previous) def tag_add(request, document_id): -# check_permissions(request.user, 'ocr', [PERMISSION_OCR_DOCUMENT]) - document = get_object_or_404(Document, pk=document_id) previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', None))) - #document.tags.add(tag) - #messages.success(request, _(u'Tag: %s, removed successfully.') % tag) - #tag = get_object_or_404(Tag, pk=tag_id) - - #return HttpResponseRedirect(previous) - if request.method == 'POST': previous = request.META.get('HTTP_REFERER', '/') - form = AddTagForm(request.POST)#, user=request.user) + form = AddTagForm(request.POST) if form.is_valid(): - if form.cleaned_data['existing_tags']: - tag = form.cleaned_data['existing_tags'] - elif form.cleaned_data['name']: - tag = form.cleaned_data['name'] + if form.cleaned_data['new_tag']: + check_permissions(request.user, 'tags', [PERMISSION_TAG_CREATE]) + tag_name = form.cleaned_data['new_tag'] + if Tag.objects.filter(name=tag_name): + is_new = False + else: + is_new = True + elif form.cleaned_data['existing_tags']: + check_permissions(request.user, 'tags', [PERMISSION_TAG_ATTACH]) + tag_name = form.cleaned_data['existing_tags'] + is_new = False + 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) - + 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) + + +def tag_list(request): + + return render_to_response('generic_list.html', { + 'object_list': Tag.objects.all(), + 'title': _(u'tags'), + 'hide_link': True, + }, context_instance=RequestContext(request))