Add support for document metadata events: add, edit and remove.
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
@@ -46,6 +46,7 @@
|
|||||||
- Add support for subscribing to the events of a tag.
|
- Add support for subscribing to the events of a tag.
|
||||||
- Add the tag events view permissions to the tag model ACL.
|
- Add the tag events view permissions to the tag model ACL.
|
||||||
- Hide the title link of documents in the trash.
|
- Hide the title link of documents in the trash.
|
||||||
|
- Add support for document metadata events: add, edit and remove.
|
||||||
|
|
||||||
|
|
||||||
3.0.1 (2018-07-08)
|
3.0.1 (2018-07-08)
|
||||||
|
|||||||
@@ -35,28 +35,37 @@ def decode_metadata_from_querystring(querystring=None):
|
|||||||
return metadata_list
|
return metadata_list
|
||||||
|
|
||||||
|
|
||||||
def save_metadata_list(metadata_list, document, create=False):
|
def save_metadata_list(metadata_list, document, create=False, _user=None):
|
||||||
"""
|
"""
|
||||||
Take a list of metadata dictionaries and associate them to a
|
Take a list of metadata dictionaries and associate them to a
|
||||||
document
|
document
|
||||||
"""
|
"""
|
||||||
for item in metadata_list:
|
for item in metadata_list:
|
||||||
save_metadata(item, document, create)
|
save_metadata(
|
||||||
|
metadata_dict=item, document=document, create=create, _user=_user
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def save_metadata(metadata_dict, document, create=False):
|
def save_metadata(metadata_dict, document, create=False, _user=None):
|
||||||
"""
|
"""
|
||||||
Take a dictionary of metadata type & value and associate it to a
|
Take a dictionary of metadata type & value and associate it to a
|
||||||
document
|
document
|
||||||
"""
|
"""
|
||||||
|
parameters = {
|
||||||
|
'document': document,
|
||||||
|
'metadata_type': get_object_or_404(
|
||||||
|
MetadataType,
|
||||||
|
pk=metadata_dict['id']
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
if create:
|
if create:
|
||||||
# Use matched metadata now to create document metadata
|
# Use matched metadata now to create document metadata
|
||||||
document_metadata, created = DocumentMetadata.objects.get_or_create(
|
try:
|
||||||
document=document,
|
DocumentMetadata.objects.get(**parameters)
|
||||||
metadata_type=get_object_or_404(
|
except DocumentMetadata.DoesNotExist:
|
||||||
MetadataType,
|
document_metadata = DocumentMetadata(**parameters)
|
||||||
pk=metadata_dict['id'])
|
document_metadata.save(_user=_user)
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
document_metadata = DocumentMetadata.objects.get(
|
document_metadata = DocumentMetadata.objects.get(
|
||||||
@@ -77,7 +86,7 @@ def save_metadata(metadata_dict, document, create=False):
|
|||||||
# .decode('utf-8')
|
# .decode('utf-8')
|
||||||
if document_metadata:
|
if document_metadata:
|
||||||
document_metadata.value = unquote_plus(metadata_dict['value'])
|
document_metadata.value = unquote_plus(metadata_dict['value'])
|
||||||
document_metadata.save()
|
document_metadata.save(_user=_user)
|
||||||
|
|
||||||
|
|
||||||
def metadata_repr(metadata_list):
|
def metadata_repr(metadata_list):
|
||||||
|
|||||||
@@ -28,8 +28,9 @@ from navigation import SourceColumn
|
|||||||
|
|
||||||
from .classes import DocumentMetadataHelper
|
from .classes import DocumentMetadataHelper
|
||||||
from .events import (
|
from .events import (
|
||||||
event_metadata_type_created, event_metadata_type_edited,
|
event_document_metadata_added, event_document_metadata_edited,
|
||||||
event_metadata_type_relationship
|
event_document_metadata_removed,event_metadata_type_created,
|
||||||
|
event_metadata_type_edited, event_metadata_type_relationship
|
||||||
)
|
)
|
||||||
from .handlers import (
|
from .handlers import (
|
||||||
handler_index_document, post_document_type_metadata_type_add,
|
handler_index_document, post_document_type_metadata_type_add,
|
||||||
@@ -112,13 +113,30 @@ class MetadataApp(MayanAppConfig):
|
|||||||
type_name=['property', 'indexing']
|
type_name=['property', 'indexing']
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ModelEventType.register(
|
||||||
|
model=Document, event_types=(
|
||||||
|
event_document_metadata_added,
|
||||||
|
event_document_metadata_edited,
|
||||||
|
event_document_metadata_removed,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
ModelEventType.register(
|
ModelEventType.register(
|
||||||
model=MetadataType, event_types=(
|
model=MetadataType, event_types=(
|
||||||
|
event_document_metadata_added,
|
||||||
|
event_document_metadata_edited,
|
||||||
|
event_document_metadata_removed,
|
||||||
event_metadata_type_edited,
|
event_metadata_type_edited,
|
||||||
event_metadata_type_relationship,
|
event_metadata_type_relationship,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ModelEventType.register(
|
||||||
|
model=DocumentType, event_types=(
|
||||||
|
event_metadata_type_relationship,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
ModelPermission.register(
|
ModelPermission.register(
|
||||||
model=Document, permissions=(
|
model=Document, permissions=(
|
||||||
permission_metadata_document_add,
|
permission_metadata_document_add,
|
||||||
|
|||||||
@@ -6,6 +6,21 @@ from events import EventTypeNamespace
|
|||||||
|
|
||||||
namespace = EventTypeNamespace(name='metadata', label=_('Metadata'))
|
namespace = EventTypeNamespace(name='metadata', label=_('Metadata'))
|
||||||
|
|
||||||
|
event_document_metadata_added = namespace.add_event_type(
|
||||||
|
name='document_metadata_added', label=_(
|
||||||
|
'Document metadata added'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
event_document_metadata_edited = namespace.add_event_type(
|
||||||
|
name='document_metadata_edited', label=_(
|
||||||
|
'Document metadata edited'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
event_document_metadata_removed = namespace.add_event_type(
|
||||||
|
name='document_metadata_removed', label=_(
|
||||||
|
'Document metadata removed'
|
||||||
|
)
|
||||||
|
)
|
||||||
event_metadata_type_created = namespace.add_event_type(
|
event_metadata_type_created = namespace.add_event_type(
|
||||||
name='metadata_type_created', label=_('Metadata type created')
|
name='metadata_type_created', label=_('Metadata type created')
|
||||||
)
|
)
|
||||||
@@ -17,3 +32,4 @@ event_metadata_type_relationship = namespace.add_event_type(
|
|||||||
'Metadata type relationship updated'
|
'Metadata type relationship updated'
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import shlex
|
|||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.template import Context, Template
|
from django.template import Context, Template
|
||||||
|
from django.urls import reverse, reverse_lazy
|
||||||
from django.utils.encoding import force_text, python_2_unicode_compatible
|
from django.utils.encoding import force_text, python_2_unicode_compatible
|
||||||
from django.utils.module_loading import import_string
|
from django.utils.module_loading import import_string
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
@@ -13,8 +14,9 @@ from documents.models import Document, DocumentType
|
|||||||
|
|
||||||
from .classes import MetadataLookup
|
from .classes import MetadataLookup
|
||||||
from .events import (
|
from .events import (
|
||||||
event_metadata_type_created, event_metadata_type_edited,
|
event_document_metadata_added, event_document_metadata_edited,
|
||||||
event_metadata_type_relationship
|
event_document_metadata_removed,event_metadata_type_created,
|
||||||
|
event_metadata_type_edited, event_metadata_type_relationship
|
||||||
)
|
)
|
||||||
from .managers import DocumentTypeMetadataTypeManager, MetadataTypeManager
|
from .managers import DocumentTypeMetadataTypeManager, MetadataTypeManager
|
||||||
from .settings import setting_available_parsers, setting_available_validators
|
from .settings import setting_available_parsers, setting_available_validators
|
||||||
@@ -91,6 +93,9 @@ class MetadataType(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.label
|
return self.label
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
return reverse('metadata:setup_metadata_type_edit', args=(self.pk,))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def comma_splitter(string):
|
def comma_splitter(string):
|
||||||
splitter = shlex.shlex(string.encode('utf-8'), posix=True)
|
splitter = shlex.shlex(string.encode('utf-8'), posix=True)
|
||||||
@@ -208,7 +213,13 @@ class DocumentMetadata(models.Model):
|
|||||||
_('Metadata type is required for this document type.')
|
_('Metadata type is required for this document type.')
|
||||||
)
|
)
|
||||||
|
|
||||||
return super(DocumentMetadata, self).delete(*args, **kwargs)
|
user = kwargs.pop('_user', None)
|
||||||
|
result = super(DocumentMetadata, self).delete(*args, **kwargs)
|
||||||
|
|
||||||
|
event_document_metadata_removed.commit(
|
||||||
|
action_object=self.metadata_type, actor=user, target=self.document,
|
||||||
|
)
|
||||||
|
return result
|
||||||
|
|
||||||
def natural_key(self):
|
def natural_key(self):
|
||||||
return self.document.natural_key() + self.metadata_type.natural_key()
|
return self.document.natural_key() + self.metadata_type.natural_key()
|
||||||
@@ -226,7 +237,23 @@ class DocumentMetadata(models.Model):
|
|||||||
_('Metadata type is not valid for this document type.')
|
_('Metadata type is not valid for this document type.')
|
||||||
)
|
)
|
||||||
|
|
||||||
return super(DocumentMetadata, self).save(*args, **kwargs)
|
user = kwargs.pop('_user', None)
|
||||||
|
created = not self.pk
|
||||||
|
|
||||||
|
result = super(DocumentMetadata, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
if created:
|
||||||
|
event_document_metadata_added.commit(
|
||||||
|
action_object=self.metadata_type, actor=user,
|
||||||
|
target=self.document,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
event_document_metadata_edited.commit(
|
||||||
|
action_object=self.metadata_type, actor=user,
|
||||||
|
target=self.document,
|
||||||
|
)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
|
|||||||
@@ -149,11 +149,19 @@ class DocumentMetadataAddView(MultipleObjectFormActionView):
|
|||||||
def object_action(self, form, instance):
|
def object_action(self, form, instance):
|
||||||
for metadata_type in form.cleaned_data['metadata_type']:
|
for metadata_type in form.cleaned_data['metadata_type']:
|
||||||
try:
|
try:
|
||||||
document_metadata, created = DocumentMetadata.objects.get_or_create(
|
created = False
|
||||||
document=instance,
|
try:
|
||||||
metadata_type=metadata_type,
|
DocumentMetadata.objects.get(
|
||||||
defaults={'value': ''}
|
document=instance,
|
||||||
)
|
metadata_type=metadata_type,
|
||||||
|
)
|
||||||
|
except DocumentMetadata.DoesNotExist:
|
||||||
|
instance = DocumentMetadata(
|
||||||
|
document=instance,
|
||||||
|
metadata_type=metadata_type,
|
||||||
|
)
|
||||||
|
instance.save(_user=self.request.user)
|
||||||
|
created = True
|
||||||
except ValidationError as exception:
|
except ValidationError as exception:
|
||||||
messages.error(
|
messages.error(
|
||||||
self.request,
|
self.request,
|
||||||
@@ -310,7 +318,10 @@ class DocumentMetadataEditView(MultipleObjectFormActionView):
|
|||||||
for form in form.forms:
|
for form in form.forms:
|
||||||
if form.cleaned_data['update']:
|
if form.cleaned_data['update']:
|
||||||
try:
|
try:
|
||||||
save_metadata_list([form.cleaned_data], instance)
|
save_metadata_list(
|
||||||
|
metadata_list=[form.cleaned_data], document=instance,
|
||||||
|
_user=self.request.user
|
||||||
|
)
|
||||||
except Exception as exception:
|
except Exception as exception:
|
||||||
errors.append(exception)
|
errors.append(exception)
|
||||||
|
|
||||||
@@ -488,7 +499,7 @@ class DocumentMetadataRemoveView(MultipleObjectFormActionView):
|
|||||||
document_metadata = DocumentMetadata.objects.get(
|
document_metadata = DocumentMetadata.objects.get(
|
||||||
document=instance, metadata_type=metadata_type
|
document=instance, metadata_type=metadata_type
|
||||||
)
|
)
|
||||||
document_metadata.delete()
|
document_metadata.delete(_user=self.request.user)
|
||||||
messages.success(
|
messages.success(
|
||||||
self.request,
|
self.request,
|
||||||
_(
|
_(
|
||||||
|
|||||||
Reference in New Issue
Block a user