diff --git a/apps/documents/__init__.py b/apps/documents/__init__.py index 4ab198fa4f..59ae22b374 100755 --- a/apps/documents/__init__.py +++ b/apps/documents/__init__.py @@ -44,6 +44,8 @@ document_edit = {'text':_('edit'), 'view':'document_edit', 'args':'object.id', ' document_edit_metadata = {'text':_('edit metadata'), 'view':'document_edit_metadata', 'args':'object.id', 'famfam':'page_edit', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_METADATA_EDIT]}} document_preview = {'text':_('preview'), 'class':'fancybox', 'view':'document_preview', 'args':'object.id', 'famfam':'magnifier', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_VIEW]}} document_download = {'text':_('download'), 'view':'document_download', 'args':'object.id', 'famfam':'page_save', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_DOWNLOAD]}} +document_find_duplicates = {'text':_('find duplicates'), 'view':'document_find_duplicates', 'args':'object.id', 'famfam':'page_refresh', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_VIEW]}} +document_find_all_duplicates = {'text':_('find all duplicates'), 'view':'document_find_all_duplicates', 'famfam':'page_refresh', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_VIEW]}} document_page_transformation_create = {'text':_('create new transformation'), 'view':'document_page_transformation_create', 'args':'object.id', 'famfam':'pencil_add', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_TRANSFORM]}} document_page_transformation_edit = {'text':_('edit'), 'view':'document_page_transformation_edit', 'args':'object.id', 'famfam':'pencil_go', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_TRANSFORM]}} @@ -55,7 +57,7 @@ document_page_go_back = {'text':_('return to document'), 'view':'document_view', staging_file_preview = {'text':_('preview'), 'class':'fancybox-noscaling', 'view':'staging_file_preview', 'args':'object.id', 'famfam':'drive_magnify'} staging_file_delete = {'text':_('delete'), 'view':'staging_file_delete', 'args':'object.id', 'famfam':'drive_delete'} -register_links(Document, [document_view, document_edit, document_edit_metadata, document_delete, document_download], menu_name='sidebar') +register_links(Document, [document_view, document_edit, document_edit_metadata, document_delete, document_download, document_find_duplicates], menu_name='sidebar') register_links(Document, [document_list, document_create, document_create_multiple, document_create_sibling], menu_name='sidebar') if ENABLE_SINGLE_DOCUMENT_UPLOAD: diff --git a/apps/documents/urls.py b/apps/documents/urls.py index ca503edbb1..6abb2155cc 100755 --- a/apps/documents/urls.py +++ b/apps/documents/urls.py @@ -13,6 +13,7 @@ from converter.api import QUALITY_HIGH urlpatterns = patterns('documents.views', url(r'^document/list/$', 'document_list', (), 'document_list'), + url(r'^document/list/duplicates/$', 'document_find_all_duplicates', (), 'document_find_all_duplicates'), url(r'^document/create/from/local/single/$', 'document_create', {'multiple':False}, 'document_create'), url(r'^document/create/from/local/multiple/$', 'document_create', {'multiple':True}, 'document_create_multiple'), url(r'^document/type/(?P\d+)/upload/single/$', 'upload_document_with_type', {'multiple':False}, 'upload_document_with_type'), @@ -27,6 +28,7 @@ urlpatterns = patterns('documents.views', url(r'^document/(?P\d+)/display/$', 'get_document_image', {'size':DISPLAY_SIZE,'quality':QUALITY_HIGH}, 'document_display'), url(r'^document/(?P\d+)/download/$', 'document_download', (), 'document_download'), url(r'^document/(?P\d+)/create/siblings/$', 'document_create_sibling', {'multiple':True if ENABLE_SINGLE_DOCUMENT_UPLOAD == False else False}, 'document_create_sibling'), + url(r'^document/(?P\d+)/find_duplicates/$', 'document_find_duplicates', (), 'document_find_duplicates'), url(r'^staging_file/(?P\w+)/preview/$', 'staging_file_preview', (), 'staging_file_preview'), url(r'^staging_file/(?P\w+)/delete/$', 'staging_file_delete', (), 'staging_file_delete'), diff --git a/apps/documents/views.py b/apps/documents/views.py index f112fbb573..d90a7ebd73 100755 --- a/apps/documents/views.py +++ b/apps/documents/views.py @@ -691,3 +691,45 @@ def document_page_transformation_delete(request, document_page_transformation_id 'document':document_page_transformation.document_page.document}, 'previous':previous, }) + + +def document_find_duplicates(request, document_id): + permissions = [PERMISSION_DOCUMENT_VIEW] + try: + check_permissions(request.user, 'documents', permissions) + except Unauthorized, e: + raise Http404(e) + + document = get_object_or_404(Document, pk=document_id) + return _find_duplicate_list(request, [document]) + + +def _find_duplicate_list(request, source_document_list=Document.objects.all(), include_source=False): + permissions = [PERMISSION_DOCUMENT_VIEW] + try: + check_permissions(request.user, 'documents', permissions) + except Unauthorized, e: + raise Http404(e) + + duplicated = [] + for document in source_document_list: + results = Document.objects.filter(checksum=document.checksum) + if not include_source: + results = results.exclude(id=document.id) + duplicated.extend(results) + + + return render_to_response('generic_list.html', { + 'object_list':duplicated, + 'title':_(u'duplicated documents'), + }, context_instance=RequestContext(request)) + + +def document_find_all_duplicates(request): + permissions = [PERMISSION_DOCUMENT_VIEW] + try: + check_permissions(request.user, 'documents', permissions) + except Unauthorized, e: + raise Http404(e) + + return _find_duplicate_list(request, include_source=True) diff --git a/apps/main/__init__.py b/apps/main/__init__.py index 1b5876f595..28b2dfc6a8 100755 --- a/apps/main/__init__.py +++ b/apps/main/__init__.py @@ -4,6 +4,7 @@ from common.api import register_menu from permissions import role_list +from documents import document_find_all_duplicates check_settings = {'text':_(u'settings'), 'view':'check_settings', 'famfam':'cog'} @@ -11,9 +12,13 @@ check_settings = {'text':_(u'settings'), 'view':'check_settings', 'famfam':'cog' register_menu([ {'text':_(u'home'), 'view':'home', 'famfam':'house', 'position':0}, + {'text':_(u'tools'), 'view':'document_find_all_duplicates', 'links': [ + document_find_all_duplicates, + ],'famfam':'wrench', 'name':'tools','position':7}, + {'text':_(u'setup'), 'view':'check_settings', 'links': [ check_settings, role_list - ],'famfam':'cog', 'name':'setup','position':7}, + ],'famfam':'cog', 'name':'setup','position':8}, - {'text':_(u'about'), 'view':'about', 'position':8}, + {'text':_(u'about'), 'view':'about', 'position':9}, ])