Add document version list view and document version download
This commit is contained in:
@@ -13,8 +13,9 @@ from history.api import register_history_type
|
|||||||
from metadata.api import get_metadata_string
|
from metadata.api import get_metadata_string
|
||||||
from project_setup.api import register_setup
|
from project_setup.api import register_setup
|
||||||
|
|
||||||
from documents.models import Document, DocumentPage, \
|
from documents.models import (Document, DocumentPage,
|
||||||
DocumentPageTransformation, DocumentType, DocumentTypeFilename
|
DocumentPageTransformation, DocumentType, DocumentTypeFilename,
|
||||||
|
DocumentVersion)
|
||||||
from documents.literals import PERMISSION_DOCUMENT_CREATE, \
|
from documents.literals import PERMISSION_DOCUMENT_CREATE, \
|
||||||
PERMISSION_DOCUMENT_PROPERTIES_EDIT, PERMISSION_DOCUMENT_VIEW, \
|
PERMISSION_DOCUMENT_PROPERTIES_EDIT, PERMISSION_DOCUMENT_VIEW, \
|
||||||
PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD, \
|
PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD, \
|
||||||
@@ -78,6 +79,7 @@ document_multiple_delete = {'text': _(u'delete'), 'view': 'document_multiple_del
|
|||||||
document_edit = {'text': _(u'edit'), 'view': 'document_edit', 'args': 'object.id', 'famfam': 'page_edit', 'permissions': [PERMISSION_DOCUMENT_PROPERTIES_EDIT]}
|
document_edit = {'text': _(u'edit'), 'view': 'document_edit', 'args': 'object.id', 'famfam': 'page_edit', 'permissions': [PERMISSION_DOCUMENT_PROPERTIES_EDIT]}
|
||||||
document_preview = {'text': _(u'preview'), 'class': 'fancybox', 'view': 'document_preview', 'args': 'object.id', 'famfam': 'magnifier', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
document_preview = {'text': _(u'preview'), 'class': 'fancybox', 'view': 'document_preview', 'args': 'object.id', 'famfam': 'magnifier', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||||
document_download = {'text': _(u'download'), 'view': 'document_download', 'args': 'object.id', 'famfam': 'page_save', 'permissions': [PERMISSION_DOCUMENT_DOWNLOAD]}
|
document_download = {'text': _(u'download'), 'view': 'document_download', 'args': 'object.id', 'famfam': 'page_save', 'permissions': [PERMISSION_DOCUMENT_DOWNLOAD]}
|
||||||
|
document_version_download = {'text': _(u'download'), 'view': 'document_version_download', 'args': 'object.pk', 'famfam': 'page_save', 'permissions': [PERMISSION_DOCUMENT_DOWNLOAD]}
|
||||||
document_find_duplicates = {'text': _(u'find duplicates'), 'view': 'document_find_duplicates', 'args': 'object.id', 'famfam': 'page_refresh', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
document_find_duplicates = {'text': _(u'find duplicates'), 'view': 'document_find_duplicates', 'args': 'object.id', 'famfam': 'page_refresh', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||||
document_find_all_duplicates = {'text': _(u'find all duplicates'), 'view': 'document_find_all_duplicates', 'famfam': 'page_refresh', 'permissions': [PERMISSION_DOCUMENT_VIEW], 'description': _(u'Search all the documents\' checksums and return a list of the exact matches.')}
|
document_find_all_duplicates = {'text': _(u'find all duplicates'), 'view': 'document_find_all_duplicates', 'famfam': 'page_refresh', 'permissions': [PERMISSION_DOCUMENT_VIEW], 'description': _(u'Search all the documents\' checksums and return a list of the exact matches.')}
|
||||||
document_update_page_count = {'text': _(u'update office documents\' page count'), 'view': 'document_update_page_count', 'famfam': 'page_white_csharp', 'permissions': [PERMISSION_DOCUMENT_TOOLS], 'description': _(u'Update the page count of the office type documents. This is useful when enabling office document support after there were already office type documents in the database.')}
|
document_update_page_count = {'text': _(u'update office documents\' page count'), 'view': 'document_update_page_count', 'famfam': 'page_white_csharp', 'permissions': [PERMISSION_DOCUMENT_TOOLS], 'description': _(u'Update the page count of the office type documents. This is useful when enabling office document support after there were already office type documents in the database.')}
|
||||||
@@ -85,8 +87,12 @@ document_clear_transformations = {'text': _(u'clear transformations'), 'view': '
|
|||||||
document_multiple_clear_transformations = {'text': _(u'clear transformations'), 'view': 'document_multiple_clear_transformations', 'famfam': 'page_paintbrush', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]}
|
document_multiple_clear_transformations = {'text': _(u'clear transformations'), 'view': 'document_multiple_clear_transformations', 'famfam': 'page_paintbrush', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]}
|
||||||
document_print = {'text': _(u'print'), 'view': 'document_print', 'args': 'object.id', 'famfam': 'printer', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
document_print = {'text': _(u'print'), 'view': 'document_print', 'args': 'object.id', 'famfam': 'printer', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||||
document_history_view = {'text': _(u'history'), 'view': 'history_for_object', 'args': ['"documents"', '"document"', 'object.id'], 'famfam': 'book_go', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
document_history_view = {'text': _(u'history'), 'view': 'history_for_object', 'args': ['"documents"', '"document"', 'object.id'], 'famfam': 'book_go', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||||
|
document_missing_list = {'text': _(u'Find missing document files'), 'view': 'document_missing_list', 'famfam': 'folder_page', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||||
|
|
||||||
|
# Tools
|
||||||
document_clear_image_cache = {'text': _(u'Clear the document image cache'), 'view': 'document_clear_image_cache', 'famfam': 'camera_delete', 'permissions': [PERMISSION_DOCUMENT_TOOLS], 'description': _(u'Clear the graphics representations used to speed up the documents\' display and interactive transformations results.')}
|
document_clear_image_cache = {'text': _(u'Clear the document image cache'), 'view': 'document_clear_image_cache', 'famfam': 'camera_delete', 'permissions': [PERMISSION_DOCUMENT_TOOLS], 'description': _(u'Clear the graphics representations used to speed up the documents\' display and interactive transformations results.')}
|
||||||
|
|
||||||
|
# Document pages
|
||||||
document_page_transformation_list = {'text': _(u'page transformations'), 'class': 'no-parent-history', 'view': 'document_page_transformation_list', 'args': 'page.pk', 'famfam': 'pencil_go', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]}
|
document_page_transformation_list = {'text': _(u'page transformations'), 'class': 'no-parent-history', 'view': 'document_page_transformation_list', 'args': 'page.pk', 'famfam': 'pencil_go', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]}
|
||||||
document_page_transformation_create = {'text': _(u'create new transformation'), 'class': 'no-parent-history', 'view': 'document_page_transformation_create', 'args': 'page.pk', 'famfam': 'pencil_add', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]}
|
document_page_transformation_create = {'text': _(u'create new transformation'), 'class': 'no-parent-history', 'view': 'document_page_transformation_create', 'args': 'page.pk', 'famfam': 'pencil_add', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]}
|
||||||
document_page_transformation_edit = {'text': _(u'edit'), 'class': 'no-parent-history', 'view': 'document_page_transformation_edit', 'args': 'transformation.pk', 'famfam': 'pencil_go', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]}
|
document_page_transformation_edit = {'text': _(u'edit'), 'class': 'no-parent-history', 'view': 'document_page_transformation_edit', 'args': 'transformation.pk', 'famfam': 'pencil_go', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]}
|
||||||
@@ -105,7 +111,8 @@ document_page_rotate_right = {'text': _(u'rotate right'), 'class': 'no-parent-hi
|
|||||||
document_page_rotate_left = {'text': _(u'rotate left'), 'class': 'no-parent-history', 'view': 'document_page_rotate_left', 'args': 'page.pk', 'famfam': 'arrow_turn_left', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
document_page_rotate_left = {'text': _(u'rotate left'), 'class': 'no-parent-history', 'view': 'document_page_rotate_left', 'args': 'page.pk', 'famfam': 'arrow_turn_left', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||||
document_page_view_reset = {'text': _(u'reset view'), 'class': 'no-parent-history', 'view': 'document_page_view_reset', 'args': 'page.pk', 'famfam': 'page_white', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
document_page_view_reset = {'text': _(u'reset view'), 'class': 'no-parent-history', 'view': 'document_page_view_reset', 'args': 'page.pk', 'famfam': 'page_white', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||||
|
|
||||||
document_missing_list = {'text': _(u'Find missing document files'), 'view': 'document_missing_list', 'famfam': 'folder_page', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
# Document versions
|
||||||
|
document_version_list = {'text': _(u'versions'), 'view': 'document_version_list', 'args': 'object.pk', 'famfam': 'page_world', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||||
|
|
||||||
# Document type related links
|
# Document type related links
|
||||||
document_type_list = {'text': _(u'document type list'), 'view': 'document_type_list', 'famfam': 'layout', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
document_type_list = {'text': _(u'document type list'), 'view': 'document_type_list', 'famfam': 'layout', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||||
@@ -133,6 +140,9 @@ register_links(['document_type_filename_create', 'document_type_filename_list',
|
|||||||
register_links(Document, [document_edit, document_print, document_delete, document_download, document_find_duplicates, document_clear_transformations, document_create_siblings])
|
register_links(Document, [document_edit, document_print, document_delete, document_download, document_find_duplicates, document_clear_transformations, document_create_siblings])
|
||||||
register_multi_item_links(['document_find_duplicates', 'folder_view', 'index_instance_list', 'document_type_document_list', 'search', 'results', 'document_group_view', 'document_list', 'document_list_recent'], [document_multiple_clear_transformations, document_multiple_delete])
|
register_multi_item_links(['document_find_duplicates', 'folder_view', 'index_instance_list', 'document_type_document_list', 'search', 'results', 'document_group_view', 'document_list', 'document_list_recent'], [document_multiple_clear_transformations, document_multiple_delete])
|
||||||
|
|
||||||
|
# Document Version links
|
||||||
|
register_links(DocumentVersion, [document_version_download])
|
||||||
|
|
||||||
secondary_menu_links = [document_list_recent, document_list, document_create_multiple]
|
secondary_menu_links = [document_list_recent, document_list, document_create_multiple]
|
||||||
|
|
||||||
register_links(['document_list_recent', 'document_list', 'document_create', 'document_create_multiple', 'upload_interactive', 'staging_file_delete'], secondary_menu_links, menu_name='secondary_menu')
|
register_links(['document_list_recent', 'document_list', 'document_create', 'document_create_multiple', 'upload_interactive', 'staging_file_delete'], secondary_menu_links, menu_name='secondary_menu')
|
||||||
@@ -198,6 +208,7 @@ register_sidebar_template(['document_type_list'], 'document_types_help.html')
|
|||||||
register_links(Document, [document_view_simple], menu_name='form_header', position=0)
|
register_links(Document, [document_view_simple], menu_name='form_header', position=0)
|
||||||
register_links(Document, [document_view_advanced], menu_name='form_header', position=1)
|
register_links(Document, [document_view_advanced], menu_name='form_header', position=1)
|
||||||
register_links(Document, [document_history_view], menu_name='form_header')
|
register_links(Document, [document_history_view], menu_name='form_header')
|
||||||
|
register_links(Document, [document_version_list], menu_name='form_header')
|
||||||
|
|
||||||
if (validate_path(document_settings.CACHE_PATH) == False) or (not document_settings.CACHE_PATH):
|
if (validate_path(document_settings.CACHE_PATH) == False) or (not document_settings.CACHE_PATH):
|
||||||
setattr(document_settings, 'CACHE_PATH', tempfile.mkdtemp())
|
setattr(document_settings, 'CACHE_PATH', tempfile.mkdtemp())
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ class DocumentVersionInline(admin.StackedInline):
|
|||||||
extra = 1
|
extra = 1
|
||||||
classes = ('collapse-open',)
|
classes = ('collapse-open',)
|
||||||
allow_add = True
|
allow_add = True
|
||||||
inlines = [
|
#inlines = [
|
||||||
DocumentPageInline,
|
# DocumentPageInline,
|
||||||
]
|
#]
|
||||||
|
|
||||||
|
|
||||||
class DocumentTypeFilenameInline(admin.StackedInline):
|
class DocumentTypeFilenameInline(admin.StackedInline):
|
||||||
|
|||||||
@@ -361,6 +361,10 @@ class Document(models.Model):
|
|||||||
def get_latest_version(self):
|
def get_latest_version(self):
|
||||||
return self.documentversion_set.order_by('-timestamp')[0]
|
return self.documentversion_set.order_by('-timestamp')[0]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def versions(self):
|
||||||
|
return self.documentversion_set
|
||||||
|
|
||||||
|
|
||||||
RELEASE_LEVEL_FINAL = 1
|
RELEASE_LEVEL_FINAL = 1
|
||||||
RELEASE_LEVEL_ALPHA = 2
|
RELEASE_LEVEL_ALPHA = 2
|
||||||
@@ -381,12 +385,13 @@ class DocumentVersion(models.Model):
|
|||||||
Model that describes a document version and it properties
|
Model that describes a document version and it properties
|
||||||
'''
|
'''
|
||||||
document = models.ForeignKey(Document, verbose_name=_(u'document'))
|
document = models.ForeignKey(Document, verbose_name=_(u'document'))
|
||||||
mayor = models.PositiveIntegerField(verbose_name=_(u'mayor'), default=1)
|
major = models.PositiveIntegerField(verbose_name=_(u'mayor'), default=1)
|
||||||
minor = models.PositiveIntegerField(verbose_name=_(u'minor'), default=0)
|
minor = models.PositiveIntegerField(verbose_name=_(u'minor'), default=0)
|
||||||
micro = models.PositiveIntegerField(verbose_name=_(u'micro'), default=0)
|
micro = models.PositiveIntegerField(verbose_name=_(u'micro'), default=0)
|
||||||
release_level = models.PositiveIntegerField(choices=RELEASE_LEVEL_CHOICES, default=RELEASE_LEVEL_FINAL, verbose_name=_(u'release level'))
|
release_level = models.PositiveIntegerField(choices=RELEASE_LEVEL_CHOICES, default=RELEASE_LEVEL_FINAL, verbose_name=_(u'release level'))
|
||||||
serial = models.PositiveIntegerField(verbose_name=_(u'serial'), default=0)
|
serial = models.PositiveIntegerField(verbose_name=_(u'serial'), default=0)
|
||||||
timestamp = models.DateTimeField(verbose_name=_(u'timestamp'))
|
timestamp = models.DateTimeField(verbose_name=_(u'timestamp'))
|
||||||
|
comment = models.TextField(blank=True, verbose_name=_(u'comment'))
|
||||||
|
|
||||||
# File related fields
|
# File related fields
|
||||||
file = models.FileField(upload_to=get_filename_from_uuid, storage=STORAGE_BACKEND(), verbose_name=_(u'file'))
|
file = models.FileField(upload_to=get_filename_from_uuid, storage=STORAGE_BACKEND(), verbose_name=_(u'file'))
|
||||||
@@ -396,7 +401,7 @@ class DocumentVersion(models.Model):
|
|||||||
checksum = models.TextField(blank=True, null=True, verbose_name=_(u'checksum'), editable=False)
|
checksum = models.TextField(blank=True, null=True, verbose_name=_(u'checksum'), editable=False)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ('document', 'mayor', 'minor', 'micro', 'release_level', 'serial')
|
unique_together = ('document', 'major', 'minor', 'micro', 'release_level', 'serial')
|
||||||
verbose_name = _(u'document version')
|
verbose_name = _(u'document version')
|
||||||
verbose_name_plural = _(u'document version')
|
verbose_name_plural = _(u'document version')
|
||||||
|
|
||||||
@@ -405,16 +410,16 @@ class DocumentVersion(models.Model):
|
|||||||
|
|
||||||
# TODO: Update timestamp
|
# TODO: Update timestamp
|
||||||
|
|
||||||
def get_version():
|
def get_version(self):
|
||||||
'''
|
'''
|
||||||
Return the formatted version information
|
Return the formatted version information
|
||||||
'''
|
'''
|
||||||
vers = [u'%(major)i.%(minor)i' % self, ]
|
vers = [u'%i.%i' % (self.major, self.minor), ]
|
||||||
|
|
||||||
if self.micro:
|
if self.micro:
|
||||||
vers.append(u'.%(micro)i' % self)
|
vers.append(u'.%i' % self.micro)
|
||||||
if self.releaselevel != RELEASE_LEVEL_FINAL:
|
if self.release_level != RELEASE_LEVEL_FINAL:
|
||||||
vers.append(u'%(releaselevel)s%(serial)i' % self)
|
vers.append(u'%s%i' % (self.release_level, self.serial))
|
||||||
return u''.join(vers)
|
return u''.join(vers)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|||||||
@@ -34,6 +34,9 @@ urlpatterns = patterns('documents.views',
|
|||||||
url(r'^(?P<document_id>\d+)/find_duplicates/$', 'document_find_duplicates', (), 'document_find_duplicates'),
|
url(r'^(?P<document_id>\d+)/find_duplicates/$', 'document_find_duplicates', (), 'document_find_duplicates'),
|
||||||
url(r'^(?P<document_id>\d+)/clear_transformations/$', 'document_clear_transformations', (), 'document_clear_transformations'),
|
url(r'^(?P<document_id>\d+)/clear_transformations/$', 'document_clear_transformations', (), 'document_clear_transformations'),
|
||||||
|
|
||||||
|
url(r'^(?P<document_pk>\d+)/version/all/$', 'document_version_list', (), 'document_version_list'),
|
||||||
|
url(r'^document/version/(?P<document_version_pk>\d+)/download/$', 'document_version_download', (), 'document_version_download'),
|
||||||
|
|
||||||
url(r'^multiple/clear_transformations/$', 'document_multiple_clear_transformations', (), 'document_multiple_clear_transformations'),
|
url(r'^multiple/clear_transformations/$', 'document_multiple_clear_transformations', (), 'document_multiple_clear_transformations'),
|
||||||
url(r'^duplicates/list/$', 'document_find_all_duplicates', (), 'document_find_all_duplicates'),
|
url(r'^duplicates/list/$', 'document_find_all_duplicates', (), 'document_find_all_duplicates'),
|
||||||
url(r'^maintenance/update_page_count/$', 'document_update_page_count', (), 'document_update_page_count'),
|
url(r'^maintenance/update_page_count/$', 'document_update_page_count', (), 'document_update_page_count'),
|
||||||
|
|||||||
@@ -53,8 +53,9 @@ from documents.forms import DocumentTypeSelectForm, \
|
|||||||
DocumentPageForm_text, PrintForm, DocumentTypeForm, \
|
DocumentPageForm_text, PrintForm, DocumentTypeForm, \
|
||||||
DocumentTypeFilenameForm, DocumentTypeFilenameForm_create
|
DocumentTypeFilenameForm, DocumentTypeFilenameForm_create
|
||||||
from documents.wizards import DocumentCreateWizard
|
from documents.wizards import DocumentCreateWizard
|
||||||
from documents.models import Document, DocumentType, DocumentPage, \
|
from documents.models import (Document, DocumentType, DocumentPage,
|
||||||
DocumentPageTransformation, RecentDocument, DocumentTypeFilename
|
DocumentPageTransformation, RecentDocument, DocumentTypeFilename,
|
||||||
|
DocumentVersion)
|
||||||
|
|
||||||
# Document type permissions
|
# Document type permissions
|
||||||
from documents.literals import PERMISSION_DOCUMENT_TYPE_EDIT, \
|
from documents.literals import PERMISSION_DOCUMENT_TYPE_EDIT, \
|
||||||
@@ -294,6 +295,10 @@ def get_document_image(request, document_id, size=PREVIEW_SIZE, base64_version=F
|
|||||||
return sendfile.sendfile(request, document.get_image(size=size, page=page, zoom=zoom, rotation=rotation), mimetype=DEFAULT_FILE_FORMAT_MIMETYPE)
|
return sendfile.sendfile(request, document.get_image(size=size, page=page, zoom=zoom, rotation=rotation), mimetype=DEFAULT_FILE_FORMAT_MIMETYPE)
|
||||||
|
|
||||||
|
|
||||||
|
def document_version_download(request, document_version_pk):
|
||||||
|
document_version = get_object_or_404(DocumentVersion, pk=document_version_pk)
|
||||||
|
return document_download(request, document_version.document.pk)
|
||||||
|
|
||||||
|
|
||||||
def document_download(request, document_id):
|
def document_download(request, document_id):
|
||||||
check_permissions(request.user, [PERMISSION_DOCUMENT_DOWNLOAD])
|
check_permissions(request.user, [PERMISSION_DOCUMENT_DOWNLOAD])
|
||||||
@@ -1142,3 +1147,44 @@ def document_clear_image_cache(request):
|
|||||||
'title': _(u'Are you sure you wish to clear the document image cache?'),
|
'title': _(u'Are you sure you wish to clear the document image cache?'),
|
||||||
'form_icon': u'camera_delete.png',
|
'form_icon': u'camera_delete.png',
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
|
def document_version_list(request, document_pk):
|
||||||
|
check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW])
|
||||||
|
document = get_object_or_404(Document, pk=document_pk)
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'object_list': document.versions.all(),
|
||||||
|
'title': _(u'versions for document: %s') % document,
|
||||||
|
'hide_object': True,
|
||||||
|
'object': document,
|
||||||
|
'extra_columns': [
|
||||||
|
{
|
||||||
|
'name': _(u'version'),
|
||||||
|
'attribute': 'get_version',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': _(u'time and date'),
|
||||||
|
'attribute': 'timestamp',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': _(u'mimetype'),
|
||||||
|
'attribute': 'mimetype',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': _(u'encoding'),
|
||||||
|
'attribute': 'encoding',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': _(u'filename'),
|
||||||
|
'attribute': 'filename',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': _(u'comment'),
|
||||||
|
'attribute': 'comment',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
return render_to_response('generic_list.html', context,
|
||||||
|
context_instance=RequestContext(request))
|
||||||
|
|||||||
Reference in New Issue
Block a user