Added document tagging support

This commit is contained in:
Roberto Rosario
2011-04-28 01:14:27 -04:00
parent 8fbd174643
commit 28f87690b2
16 changed files with 515 additions and 285 deletions

View File

@@ -356,7 +356,7 @@ class MetaDataImageWidget(forms.widgets.Widget):
<span class="famfam active famfam-%(famfam)s"></span>%(text)s
</button>
''' % {
'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'<div style="white-space:nowrap; overflow: auto;">')
for document in value['group_data']:
tags_template = []
tag_block_template = u'<div style="padding: 1px; border: 1px solid black; background: %s;">%s</div>'
tag_count = document.tags.count()
if tag_count:
tags_template.append(u'<div class="tc">')
tags_template.append(u'%(tag_string)s (%(tag_count)s): ' % {
tags_template.append(u'<div>%(tag_string)s: %(tag_count)s</div>' % {
'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'</div>')
output.append(

File diff suppressed because it is too large Load Diff

View File

@@ -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'<div style="width: 20px; height: 20px; border: 1px solid black; background: %s;"></div>' % 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'<div style="width: 20px; height: 20px; border: 1px solid black; background: %s;"></div>' % 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,

View File

@@ -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 <rosario_r@jp.pr.gov>\n"
"Language-Team: LANGUAGE <LL@li.org>\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?"

View File

@@ -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:

View File

@@ -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)

11
apps/tags/admin.py Normal file
View File

@@ -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)

View File

@@ -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'))

Binary file not shown.

View File

@@ -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 <EMAIL@ADDRESS>, 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 <rosario_r@jp.pr.gov>\n"
"Language-Team: LANGUAGE <LL@li.org>\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"

View File

@@ -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]

View File

@@ -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')

View File

@@ -1,17 +1,7 @@
from django.conf.urls.defaults import patterns, url
urlpatterns = patterns('tags.views',
url(r'^(?P<tag_id>\d+)/remove_from_document/(?P<document_id>\d+)$', 'tag_remove', (), 'tag_remove'),
url(r'^add_to_document/(?P<document_id>\d+)$', 'tag_add', (), 'tag_add'),
# url(r'^ocr/queue/document/list/$', 'queue_document_list', (), 'queue_document_list'),
# url(r'^ocr/queue/document/(?P<queue_document_id>\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<queue_document_id>\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<document_queue_id>\d+)/enable/$', 'document_queue_enable', (), 'document_queue_enable'),#
# url(r'^ocr/queue/(?P<document_queue_id>\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<tag_id>\d+)/remove_from_document/(?P<document_id>\d+)/$', 'tag_remove', (), 'tag_remove'),
url(r'^add_to_document/(?P<document_id>\d+)/$', 'tag_add', (), 'tag_add'),
)

View File

@@ -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))