Final changes to support duplicate document search
This commit is contained in:
@@ -701,28 +701,38 @@ def document_find_duplicates(request, document_id):
|
||||
raise Http404(e)
|
||||
|
||||
document = get_object_or_404(Document, pk=document_id)
|
||||
return _find_duplicate_list(request, [document])
|
||||
return _find_duplicate_list(request, [document], include_source=True, confirmation=False)
|
||||
|
||||
|
||||
def _find_duplicate_list(request, source_document_list=Document.objects.all(), include_source=False):
|
||||
def _find_duplicate_list(request, source_document_list=Document.objects.all(), include_source=False, confirmation=True):
|
||||
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)
|
||||
|
||||
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', None)))
|
||||
|
||||
if confirmation and request.method != 'POST':
|
||||
return render_to_response('generic_confirm.html', {
|
||||
#'title':_(u'dupli'),
|
||||
'previous':previous,
|
||||
'message':_(u'On large databases this operation may take some time to execute.'),
|
||||
}, context_instance=RequestContext(request))
|
||||
else:
|
||||
duplicated = []
|
||||
for document in source_document_list:
|
||||
if document not in duplicated:
|
||||
results = Document.objects.filter(checksum=document.checksum).exclude(id__in=[d.id for d in duplicated]).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))
|
||||
if include_source:
|
||||
duplicated.extend(source_document_list)
|
||||
|
||||
return render_to_response('generic_list.html', {
|
||||
'object_list':duplicated,
|
||||
'title':_(u'duplicated documents'),
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def document_find_all_duplicates(request):
|
||||
@@ -732,4 +742,4 @@ def document_find_all_duplicates(request):
|
||||
except Unauthorized, e:
|
||||
raise Http404(e)
|
||||
|
||||
return _find_duplicate_list(request, include_source=True)
|
||||
return _find_duplicate_list(request, include_source=False)
|
||||
|
||||
@@ -12,7 +12,7 @@ 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': [
|
||||
{'text':_(u'tools'), 'view':'tools_menu', 'links': [
|
||||
document_find_all_duplicates,
|
||||
],'famfam':'wrench', 'name':'tools','position':7},
|
||||
|
||||
|
||||
@@ -3,5 +3,6 @@ from django.conf.urls.defaults import *
|
||||
|
||||
urlpatterns = patterns('main.views',
|
||||
url(r'^$', 'home', (), 'home'),
|
||||
url(r'^check_settings/$', 'check_settings', (), 'check_settings')
|
||||
url(r'^check_settings/$', 'check_settings', (), 'check_settings'),
|
||||
url(r'^tools_menu/$', 'blank_menu', (), 'tools_menu')
|
||||
)
|
||||
|
||||
@@ -64,8 +64,8 @@ def check_settings(request):
|
||||
'hide_object':True,
|
||||
'extra_columns':[
|
||||
{'name':_(u'name'), 'attribute':'name'},
|
||||
{'name':_(u'value'), 'attribute': lambda x: return_type(x['value'])},
|
||||
{'name':_(u'exists'), 'attribute':lambda x: exists(x['value']) if 'exists' in x else ''},
|
||||
{'name':_(u'value'), 'attribute': lambda x: _return_type(x['value'])},
|
||||
{'name':_(u'exists'), 'attribute':lambda x: _exists(x['value']) if 'exists' in x else ''},
|
||||
]
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ def check_settings(request):
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def return_type(value):
|
||||
def _return_type(value):
|
||||
if isinstance(value, types.FunctionType):
|
||||
return _(u'function found')
|
||||
elif isinstance(value, types.ClassType):
|
||||
@@ -85,8 +85,16 @@ def return_type(value):
|
||||
else:
|
||||
return value
|
||||
|
||||
def exists(path):
|
||||
def _exists(path):
|
||||
try:
|
||||
return os.path.exists(path)
|
||||
except Exception, exc:
|
||||
return exc
|
||||
|
||||
|
||||
def blank_menu(request):
|
||||
return render_to_response('generic_template.html', {
|
||||
'title':_(u'Tools menu'),
|
||||
'content':_(u'"Find all duplicates": Search all the documents\' checksums and return a list of the exact matches.')
|
||||
},
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
Reference in New Issue
Block a user