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:
Roberto Rosario
2018-08-15 05:04:09 -04:00
parent 0a653a08bd
commit 0022548e35
6 changed files with 105 additions and 23 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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,
_( _(