Пример #1
0
    def retrieve(self, document):
        """Read document CouchDB metadata.

        @param document: is a DMS Document() instance
        """
        docrule = document.get_docrule()
        mapping = docrule.get_docrule_plugin_mappings()
        # No actions for no docrule documents
        # No actions for documents without 'mapping has DB plugins'
        if document.get_docrule().uncategorized:
            return document
        else:
            if not mapping.get_database_storage_plugins():
                return document
            else:
                self.check_user(document)
                doc_name = document.get_code()
                couchdoc = CouchDocument()
                try:
                    couchdoc = CouchDocument.get(docid=doc_name)
                except Exception, e:
                    # Skip deleted errors (they are not used in DMS)
                    e_message = str(e)
                    if not e_message in ['deleted', 'missing']:
                        raise PluginError('CouchDB error: %s' % e, e)
                    pass
                document = couchdoc.populate_into_dms(document)
                return document
Пример #2
0
    def remove(self, document):
        """Updates document CouchDB metadata on removal.

        (Removes CouchDB document or acts as prescribed in removal workflows)
        @param document: is a DMS Document() instance
        """
        # Doing nothing for mark deleted call
        code = document.get_code()
        couchdoc = CouchDocument.get(docid=code)
        if 'mark_deleted' in document.options.iterkeys():
            couchdoc['deleted'] = 'deleted'
            couchdoc.save()
            return document
        if 'mark_revision_deleted' in document.options.iterkeys():
            mark_revision = document.options['mark_revision_deleted']
            if mark_revision in couchdoc.revisions.iterkeys():
                couchdoc.revisions[mark_revision]['deleted'] = True
            else:
                raise PluginError('Object has no revision: %s' % mark_revision,
                                  404)
            couchdoc.save()
            return document
        if 'delete_revision' in document.options.iterkeys():
            revision = document.options['delete_revision']
            del couchdoc.revisions[revision]
            couchdoc.save()
            return document
        if not document.get_file_obj():
            #doc is fully deleted from fs
            couchdoc.delete()
        return document
Пример #3
0
    def update_document_metadata(self, document):
        """Updates document with new indexes and stores old one into another revision.

        @param document: is a DMS Document() instance
        """
        self.check_user(document)
        if 'update_file' in document.options and document.options[
                'update_file']:
            name = document.get_code()
            # We need to create couchdb document in case it does not exists in database.
            couchdoc = CouchDocument.get_or_create(docid=name)
            couchdoc.update_file_revisions_metadata(document)
            couchdoc.save()
        if document.old_docrule:
            old_couchdoc = None
            couchdoc = CouchDocument.get_or_create(docid=document.file_name)
            try:
                old_couchdoc = CouchDocument.get(docid=document.old_name_code)
            except Exception, e:
                log.error('%s' % e)
                pass
            if old_couchdoc:
                # Migrate from existing CouchDB document
                couchdoc.migrate_metadata_for_docrule(document, old_couchdoc)
                couchdoc.save()
                old_couchdoc.delete()
            else:
                # store from current Document() instance
                user = document.user
                couchdoc.populate_from_dms(user, document)
                couchdoc.save()
Пример #4
0
    def retrieve(self, document):
        """Read document CouchDB metadata.

        @param document: is a DMS Document() instance
        """
        docrule = document.get_docrule()
        mapping = docrule.get_docrule_plugin_mappings()
        # No actions for no docrule documents
        # No actions for documents without 'mapping has DB plugins'
        if document.get_docrule().uncategorized:
            return document
        else:
            if not mapping.get_database_storage_plugins():
                return document
            else:
                self.check_user(document)
                doc_name = document.get_code()
                couchdoc = CouchDocument()
                try:
                    couchdoc = CouchDocument.get(docid=doc_name)
                except Exception, e:
                    # Skip deleted errors (they are not used in DMS)
                    e_message = str(e)
                    if not e_message in ['deleted', 'missing']:
                        raise PluginError('CouchDB error: %s' % e, e)
                    pass
                document = couchdoc.populate_into_dms(document)
                return document
Пример #5
0
    def remove(self, document):
        """Updates document CouchDB metadata on removal.

        (Removes CouchDB document or acts as prescribed in removal workflows)
        @param document: is a DMS Document() instance
        """
        # Doing nothing for mark deleted call
        code = document.get_code()
        couchdoc = CouchDocument.get(docid=code)
        if 'mark_deleted' in document.options.iterkeys():
            couchdoc['deleted'] = 'deleted'
            couchdoc.save()
            return document
        if 'mark_revision_deleted' in document.options.iterkeys():
            mark_revision = document.options['mark_revision_deleted']
            if mark_revision in couchdoc.revisions.iterkeys():
                couchdoc.revisions[mark_revision]['deleted'] = True
            else:
                raise PluginError('Object has no revision: %s' % mark_revision, 404)
            couchdoc.save()
            return document
        if 'delete_revision' in document.options.iterkeys():
            revision = document.options['delete_revision']
            del couchdoc.revisions[revision]
            couchdoc.save()
            return document
        if not document.get_file_obj():
            #doc is fully deleted from fs
            couchdoc.delete()
        return document
Пример #6
0
    def update_document_metadata(self, document):
        """Updates document with new indexes and stores old one into another revision.

        @param document: is a DMS Document() instance
        """
        self.check_user(document)
        if 'update_file' in document.options and document.options['update_file']:
            name = document.get_code()
            # We need to create couchdb document in case it does not exists in database.
            couchdoc = CouchDocument.get_or_create(docid=name)
            couchdoc.update_file_revisions_metadata(document)
            couchdoc.save()
        if document.old_docrule:
            old_couchdoc = None
            couchdoc = CouchDocument.get_or_create(docid=document.file_name)
            try:
                old_couchdoc = CouchDocument.get(docid=document.old_name_code)
            except Exception, e:
                log.error('%s' % e)
                pass
            if old_couchdoc:
                # Migrate from existing CouchDB document
                couchdoc.migrate_metadata_for_docrule(document, old_couchdoc)
                couchdoc.save()
                old_couchdoc.delete()
            else:
                # store from current Document() instance
                user = document.user
                couchdoc.populate_from_dms(user, document)
                couchdoc.save()
Пример #7
0
class CouchDBMetadataWorker(object):
    """Stores metadata in CouchDB DatabaseManager.

    Handles required logic for metadata <==> Document(object) manipulations.
    """
    def store(self, document):
        """Stores CouchDB object into DB.

        (Updates or overwrites CouchDB document)

        @param document: is a DMS Document() instance
        """
        # FIXME: Refactor me. We should upload new "secondary_indexes" or metatags with update() workflow,
        # not a create(), like it is now. Because this method is a mess.
        docrule = document.get_docrule()
        # doing nothing for no docrule documents
        if docrule.uncategorized:
            return document
        else:
            user = self.check_user(document)
            processor = DocumentProcessor()
            # FIXME: there might be more than one mapping
            mapping = docrule.get_docrule_plugin_mappings()
            # doing nothing for documents without mapping has DB plugins
            if not mapping.get_database_storage_plugins():
                return document
            else:
                # if not exists all required metadata getting them from docrule retrieve sequence
                if not document.file_revision_data:
                    # HACK: Preserving db_info here... (May be Solution!!!)
                    db_info = document.get_db_info()
                    document = processor.read(document.file_name,
                                              options={
                                                  'only_metadata': True,
                                                  'user': document.user
                                              })

                    # saving NEW file_revision_data ONLY if they exist in new uploaded doc (Preserving old indexes)
                    if db_info:
                        # Storing new indexes
                        document.set_db_info(db_info)
                    else:
                        # TODO: move this code into a proper place (UPDATE method)
                        # Asking couchdb about if old file_revision_data exists and updating them properly
                        current_revisions = document.file_revision_data
                        try:
                            # Only if document exists in DB. Falling gracefully if not.
                            temp_doc = self.retrieve(document)
                            old_metadata = temp_doc.get_db_info()
                            old_index_revisions = None
                            if old_metadata['mdt_indexes']:
                                # Preserving Description, User, Created Date, indexes revisions
                                if temp_doc.index_revisions:
                                    old_index_revisions = temp_doc.index_revisions
                                old_metadata['mdt_indexes'][
                                    'description'] = old_metadata[
                                        'description']
                                old_metadata['mdt_indexes'][
                                    'metadata_user_name'] = old_metadata[
                                        'metadata_user_name']
                                old_metadata['mdt_indexes'][
                                    'metadata_user_id'] = old_metadata[
                                        'metadata_user_id']
                                old_cr_date = datetime.datetime.strftime(
                                    old_metadata['metadata_created_date'],
                                    settings.DATE_FORMAT)
                                old_metadata['mdt_indexes'][
                                    'date'] = old_cr_date
                                document.set_db_info(
                                    old_metadata['mdt_indexes'])
                                document.set_index_revisions(
                                    old_index_revisions)
                                document.set_file_revisions_data(
                                    current_revisions)
                            else:
                                # Preserving set revisions anyway.
                                document.set_file_revisions_data(
                                    current_revisions)
                        except ResourceNotFound:
                            pass
                # updating tags to sync with Django DB
                self.sync_document_tags(document)
                # assuming no document with this _id exists. SAVING or overwriting existing
                couchdoc = CouchDocument()

                couchdoc.populate_from_dms(user, document)
                couchdoc.save(force_update=True)
                return document

    def update_document_metadata(self, document):
        """Updates document with new indexes and stores old one into another revision.

        @param document: is a DMS Document() instance
        """
        self.check_user(document)
        if 'update_file' in document.options and document.options[
                'update_file']:
            name = document.get_code()
            # We need to create couchdb document in case it does not exists in database.
            couchdoc = CouchDocument.get_or_create(docid=name)
            couchdoc.update_file_revisions_metadata(document)
            couchdoc.save()
        if document.old_docrule:
            old_couchdoc = None
            couchdoc = CouchDocument.get_or_create(docid=document.file_name)
            try:
                old_couchdoc = CouchDocument.get(docid=document.old_name_code)
            except Exception, e:
                log.error('%s' % e)
                pass
            if old_couchdoc:
                # Migrate from existing CouchDB document
                couchdoc.migrate_metadata_for_docrule(document, old_couchdoc)
                couchdoc.save()
                old_couchdoc.delete()
            else:
                # store from current Document() instance
                user = document.user
                couchdoc.populate_from_dms(user, document)
                couchdoc.save()
        # We have to do it after moving document names.
        if document.new_indexes and document.file_name:
            couchdoc = CouchDocument.get(docid=document.file_name)
            couchdoc.update_indexes_revision(document)
            couchdoc.save()
            document = couchdoc.populate_into_dms(document)
        return document