class EventSerializer(serializers.ModelSerializer):
    actor = DynamicSerializerField(read_only=True)
    target = DynamicSerializerField(read_only=True)
    actor_content_type = ContentTypeSerializer(read_only=True)
    target_content_type = ContentTypeSerializer(read_only=True)
    verb = EventTypeSerializer(read_only=True)

    class Meta:
        exclude = ('action_object_content_type', 'action_object_object_id')
        model = Action
Beispiel #2
0
    def ready(self):
        super(UserManagementApp, self).ready()
        from actstream import registry

        Group = apps.get_model(app_label='auth', model_name='Group')
        User = get_user_model()

        DynamicSerializerField.add_serializer(
            klass=get_user_model(),
            serializer_class=
            'mayan.apps.user_management.serializers.UserSerializer')

        # Silence UnorderedObjectListWarning
        # "Pagination may yield inconsistent result"
        # TODO: Remove on Django 2.x
        Group._meta.ordering = ('name', )
        Group._meta.verbose_name = _('Group')
        Group._meta.verbose_name_plural = _('Groups')
        Group._meta.get_field('name').verbose_name = _('Name')

        # Silence UnorderedObjectListWarning
        # "Pagination may yield inconsistent result"
        # TODO: Remove on Django 2.x
        User._meta.ordering = ('pk', )
        User._meta.verbose_name = _('User')
        User._meta.verbose_name_plural = _('Users')
        User._meta.ordering = ('last_name', 'first_name')

        User._meta.get_field('username').verbose_name = _('Username')
        User._meta.get_field('first_name').verbose_name = _('First name')
        User._meta.get_field('last_name').verbose_name = _('Last name')
        User._meta.get_field('email').verbose_name = _('Email')
        User._meta.get_field('is_active').verbose_name = _('Is active?')
        if six.PY3:
            User.has_usable_password.short_description = _(
                'Has usable password?')
        else:
            User.has_usable_password.__func__.short_description = _(
                'Has usable password?')

        Group.add_to_class(name='get_users', value=method_group_get_users)
        Group.add_to_class(name='users_add', value=method_group_users_add)
        Group.add_to_class(name='users_remove',
                           value=method_group_users_remove)
        Group.add_to_class(name='save', value=get_method_group_save())

        MetadataLookup(description=_('All the groups.'),
                       name='groups',
                       value=get_groups)
        MetadataLookup(description=_('All the users.'),
                       name='users',
                       value=get_users)

        ModelEventType.register(event_types=(event_group_created,
                                             event_group_edited),
                                model=Group)

        ModelEventType.register(event_types=(event_user_created,
                                             event_user_edited),
                                model=User)

        ModelPermission.register(model=Group,
                                 permissions=(
                                     permission_acl_edit,
                                     permission_acl_view,
                                     permission_events_view,
                                     permission_group_delete,
                                     permission_group_edit,
                                     permission_group_view,
                                 ))
        ModelPermission.register(
            model=User,
            permissions=(permission_acl_edit, permission_acl_view,
                         permission_events_view, permission_user_delete,
                         permission_user_edit, permission_user_view))

        SourceColumn(attribute='name',
                     is_identifier=True,
                     is_sortable=True,
                     source=Group)
        SourceColumn(attribute='user_set.count',
                     label=_('Users'),
                     source=Group)

        SourceColumn(attribute='username',
                     is_object_absolute_url=True,
                     is_identifier=True,
                     is_sortable=True,
                     source=User)
        SourceColumn(attribute='first_name', is_sortable=True, source=User)
        SourceColumn(attribute='last_name', is_sortable=True, source=User)
        SourceColumn(attribute='email', is_sortable=True, source=User)
        SourceColumn(attribute='is_active',
                     is_sortable=True,
                     source=User,
                     widget=TwoStateWidget)
        SourceColumn(attribute='has_usable_password',
                     source=User,
                     widget=TwoStateWidget)

        User.add_to_class(name='get_absolute_url',
                          value=method_user_get_absolute_url)
        User.add_to_class(name='get_groups', value=method_user_get_groups)
        User.add_to_class(name='groups_add', value=method_user_groups_add)
        User.add_to_class(name='groups_remove',
                          value=method_user_groups_remove)
        User.add_to_class(name='save', value=get_method_user_save())

        dashboard_main.add_widget(widget=DashboardWidgetUserTotal, order=99)
        dashboard_main.add_widget(widget=DashboardWidgetGroupTotal, order=99)

        menu_list_facet.bind_links(links=(
            link_acl_list,
            link_events_for_object,
            link_object_event_types_user_subcriptions_list,
            link_group_user_list,
        ),
                                   sources=(Group, ))
        menu_list_facet.bind_links(
            links=(link_acl_list, link_events_for_object,
                   link_object_event_types_user_subcriptions_list,
                   link_user_group_list, link_user_set_options),
            sources=(User, ))
        menu_multi_item.bind_links(links=(link_user_multiple_delete, ),
                                   sources=('user_management:user_list', ))
        menu_object.bind_links(links=(link_group_edit, ), sources=(Group, ))
        menu_object.bind_links(links=(link_group_delete, ),
                               position=99,
                               sources=(Group, ))
        menu_object.bind_links(links=(
            link_user_delete,
            link_user_edit,
        ),
                               sources=(User, ))
        menu_secondary.bind_links(
            links=(link_group_list, link_group_create),
            sources=('user_management:group_multiple_delete',
                     'user_management:group_list',
                     'user_management:group_create', Group))
        menu_secondary.bind_links(
            links=(link_user_list, link_user_create),
            sources=(User, 'authentication:user_multiple_set_password',
                     'user_management:user_multiple_delete',
                     'user_management:user_list',
                     'user_management:user_create'))
        menu_setup.bind_links(links=(link_user_setup, link_group_setup))
        menu_user.bind_links(links=(
            text_user_label,
            separator_user_label,
            link_current_user_details,
            link_current_user_edit,
        ),
                             position=0)

        post_save.connect(
            dispatch_uid='user_management_handler_initialize_new_user_options',
            receiver=handler_initialize_new_user_options,
            sender=User)

        user_logged_in.connect(
            dispatch_uid='user_management_handler_user_logged_in',
            receiver=handler_user_logged_in,
            sender=User)
        user_logged_out.connect(
            dispatch_uid='user_management_handler_user_logged_out',
            receiver=handler_user_logged_out,
            sender=User)

        registry.register(Group)
        registry.register(User)
Beispiel #3
0
    def ready(self):
        super(DocumentsApp, self).ready()
        from actstream import registry

        DeletedDocument = self.get_model(model_name='DeletedDocument')
        Document = self.get_model(model_name='Document')
        DocumentPage = self.get_model(model_name='DocumentPage')
        DocumentPageResult = self.get_model(model_name='DocumentPageResult')
        DocumentType = self.get_model(model_name='DocumentType')
        DocumentTypeFilename = self.get_model(
            model_name='DocumentTypeFilename')
        DocumentVersion = self.get_model(model_name='DocumentVersion')
        DuplicatedDocument = self.get_model(model_name='DuplicatedDocument')

        DynamicSerializerField.add_serializer(
            klass=Document,
            serializer_class=
            'mayan.apps.documents.serializers.DocumentSerializer')

        MissingItem(
            label=_('Create a document type'),
            description=_(
                'Every uploaded document must be assigned a document type, '
                'it is the basic way Mayan EDMS categorizes documents.'),
            condition=lambda: not DocumentType.objects.exists(),
            view='documents:document_type_list')

        ModelEventType.register(model=DocumentType,
                                event_types=(
                                    event_document_create,
                                    event_document_type_created,
                                    event_document_type_edited,
                                ))
        ModelEventType.register(model=Document,
                                event_types=(event_document_download,
                                             event_document_properties_edit,
                                             event_document_type_changed,
                                             event_document_version_new,
                                             event_document_version_revert,
                                             event_document_view))

        ModelField(model=Document, name='description')
        ModelField(model=Document, name='date_added')
        ModelField(model=Document, name='deleted_date_time')
        ModelField(model=Document, name='document_type')
        ModelField(model=Document, name='in_trash')
        ModelField(model=Document, name='is_stub')
        ModelField(model=Document, name='label')
        ModelField(model=Document, name='language')
        ModelField(model=Document, name='uuid')

        ModelFieldRelated(model=Document, name='document_type__label')
        ModelFieldRelated(model=Document, name='versions__checksum')
        ModelFieldRelated(model=Document,
                          label=_('Versions comment'),
                          name='versions__comment')
        ModelFieldRelated(model=Document,
                          label=_('Versions encoding'),
                          name='versions__encoding')
        ModelFieldRelated(model=Document,
                          label=_('Versions mime type'),
                          name='versions__mimetype')
        ModelFieldRelated(model=Document,
                          label=_('Versions timestamp'),
                          name='versions__timestamp')

        ModelProperty(
            description=_('Return the lastest version of the document.'),
            model=Document,
            label=_('Latest version'),
            name='latest_version')

        ModelPermission.register(model=Document,
                                 permissions=(
                                     permission_acl_edit,
                                     permission_acl_view,
                                     permission_document_delete,
                                     permission_document_download,
                                     permission_document_edit,
                                     permission_document_new_version,
                                     permission_document_print,
                                     permission_document_properties_edit,
                                     permission_document_restore,
                                     permission_document_tools,
                                     permission_document_trash,
                                     permission_document_version_revert,
                                     permission_document_version_view,
                                     permission_document_view,
                                     permission_events_view,
                                     permission_transformation_create,
                                     permission_transformation_delete,
                                     permission_transformation_edit,
                                     permission_transformation_view,
                                 ))

        ModelPermission.register(model=DocumentType,
                                 permissions=(
                                     permission_document_create,
                                     permission_document_type_delete,
                                     permission_document_type_edit,
                                     permission_document_type_view,
                                     permission_acl_edit,
                                     permission_acl_view,
                                     permission_events_view,
                                 ))

        ModelPermission.register_inheritance(
            model=Document,
            related='document_type',
        )
        ModelPermission.register_manager(model=Document,
                                         manager_name='passthrough')
        ModelPermission.register_inheritance(
            model=DocumentPage,
            related='document_version__document',
        )
        ModelPermission.register_manager(model=DocumentPage,
                                         manager_name='passthrough')
        ModelPermission.register_inheritance(
            model=DocumentPageResult,
            related='document_version__document',
        )
        ModelPermission.register_manager(model=DocumentPageResult,
                                         manager_name='passthrough')
        ModelPermission.register_inheritance(
            model=DocumentTypeFilename,
            related='document_type',
        )
        ModelPermission.register_inheritance(
            model=DocumentVersion,
            related='document',
        )

        # Document and document page thumbnail widget
        document_page_thumbnail_widget = DocumentPageThumbnailWidget()

        # Document
        SourceColumn(attribute='label',
                     is_object_absolute_url=True,
                     is_identifier=True,
                     is_sortable=True,
                     source=Document)
        SourceColumn(func=lambda context: document_page_thumbnail_widget.
                     render(instance=context['object']),
                     html_extra_classes='text-center document-thumbnail-list',
                     label=_('Thumbnail'),
                     source=Document)
        SourceColumn(
            attribute='document_type',
            is_sortable=True,
            source=Document,
        )
        SourceColumn(func=lambda context: widget_document_page_number(
            document=context['object']),
                     label=_('Pages'),
                     source=Document)
        SourceColumn(attribute='date_added',
                     include_label=True,
                     is_sortable=True,
                     source=Document,
                     views=('documents:document_list_recent_added', ))
        SourceColumn(func=lambda context: DuplicatedDocument.objects.get(
            document=context['object']).documents.count(),
                     include_label=True,
                     label=_('Duplicates'),
                     source=Document,
                     views=('documents:duplicated_document_list', ))

        # DocumentPage
        SourceColumn(attribute='get_label',
                     is_identifier=True,
                     is_object_absolute_url=True,
                     source=DocumentPage,
                     widget_condition=is_document_page_enabled)
        SourceColumn(func=lambda context: document_page_thumbnail_widget.
                     render(instance=context['object']),
                     html_extra_classes='text-center document-thumbnail-list',
                     label=_('Thumbnail'),
                     source=DocumentPage)
        SourceColumn(attribute='enabled',
                     include_label=True,
                     source=DocumentPage,
                     widget=TwoStateWidget)
        SourceColumn(attribute='page_number',
                     include_label=True,
                     source=DocumentPage)

        SourceColumn(attribute='get_label',
                     is_identifier=True,
                     is_object_absolute_url=True,
                     source=DocumentPageResult)
        SourceColumn(func=lambda context: document_page_thumbnail_widget.
                     render(instance=context['object']),
                     html_extra_classes='text-center document-thumbnail-list',
                     label=_('Thumbnail'),
                     source=DocumentPageResult)
        SourceColumn(attribute='document_version.document.document_type',
                     label=_('Type'),
                     source=DocumentPageResult)

        # DocumentType
        SourceColumn(attribute='label',
                     is_identifier=True,
                     is_sortable=True,
                     source=DocumentType)

        SourceColumn(func=lambda context: context['object'].get_document_count(
            user=context['request'].user),
                     include_label=True,
                     label=_('Documents'),
                     source=DocumentType)

        SourceColumn(attribute='filename',
                     is_identifier=True,
                     is_sortable=True,
                     source=DocumentTypeFilename)
        SourceColumn(attribute='enabled',
                     include_label=True,
                     is_sortable=True,
                     source=DocumentTypeFilename,
                     widget=TwoStateWidget)

        # DeletedDocument
        SourceColumn(attribute='label',
                     is_identifier=True,
                     is_sortable=True,
                     source=DeletedDocument)
        SourceColumn(attribute='deleted_date_time',
                     include_label=True,
                     order=99,
                     source=DeletedDocument)

        # DocumentVersion
        SourceColumn(source=DocumentVersion,
                     attribute='timestamp',
                     is_identifier=True,
                     is_object_absolute_url=True)
        SourceColumn(func=lambda context: document_page_thumbnail_widget.
                     render(instance=context['object']),
                     html_extra_classes='text-center document-thumbnail-list',
                     label=_('Thumbnail'),
                     source=DocumentVersion)
        SourceColumn(func=lambda context: widget_document_version_page_number(
            document_version=context['object']),
                     label=_('Pages'),
                     source=DocumentVersion)
        SourceColumn(attribute='mimetype',
                     is_sortable=True,
                     source=DocumentVersion)
        SourceColumn(attribute='encoding',
                     is_sortable=True,
                     source=DocumentVersion)
        SourceColumn(attribute='comment',
                     is_sortable=True,
                     source=DocumentVersion)

        Template(name='invalid_document',
                 template_name='documents/invalid_document.html')

        dashboard_main.add_widget(widget=DashboardWidgetDocumentsTotal,
                                  order=0)
        dashboard_main.add_widget(widget=DashboardWidgetDocumentPagesTotal,
                                  order=1)
        dashboard_main.add_widget(widget=DashboardWidgetDocumentsInTrash,
                                  order=2)
        dashboard_main.add_widget(widget=DashboardWidgetDocumentsTypesTotal,
                                  order=3)
        dashboard_main.add_widget(widget=DashboardWidgetDocumentsNewThisMonth,
                                  order=4)
        dashboard_main.add_widget(
            widget=DashboardWidgetDocumentsPagesNewThisMonth, order=5)

        menu_documents.bind_links(links=(
            link_document_list_recent_access,
            link_document_list_recent_added,
            link_document_list_favorites,
            link_document_list,
            link_document_list_deleted,
            link_duplicated_document_list,
        ))

        menu_main.bind_links(links=(menu_documents, ), position=0)

        menu_setup.bind_links(links=(link_document_type_setup, ))
        menu_tools.bind_links(links=(link_duplicated_document_scan, ))

        # Document type links
        menu_list_facet.bind_links(links=(
            link_document_type_filename_list,
            link_document_type_policies,
            link_acl_list,
            link_object_event_types_user_subcriptions_list,
            link_events_for_object,
        ),
                                   sources=(DocumentType, ))

        menu_object.bind_links(links=(link_document_type_delete,
                                      link_document_type_edit),
                               sources=(DocumentType, ))
        menu_object.bind_links(links=(link_document_type_filename_edit,
                                      link_document_type_filename_delete),
                               sources=(DocumentTypeFilename, ))
        menu_secondary.bind_links(links=(link_document_type_list,
                                         link_document_type_create),
                                  sources=(DocumentType,
                                           'documents:document_type_create',
                                           'documents:document_type_list'))
        menu_secondary.bind_links(
            links=(link_document_type_filename_create, ),
            sources=(DocumentTypeFilename,
                     'documents:document_type_filename_list',
                     'documents:document_type_filename_create'))
        menu_secondary.bind_links(links=(link_trash_can_empty, ),
                                  sources=('documents:document_list_deleted',
                                           'documents:trash_can_empty'))

        # Document object links
        menu_object.bind_links(links=(
            link_document_favorites_add,
            link_document_favorites_remove,
            link_document_edit,
            link_document_document_type_edit,
            link_document_print,
            link_document_trash,
            link_document_quick_download,
            link_document_download,
            link_document_clear_transformations,
            link_document_clone_transformations,
            link_document_update_page_count,
        ),
                               sources=(Document, ))
        menu_object.bind_links(links=(link_document_restore,
                                      link_document_delete),
                               sources=(DeletedDocument, ))

        # Document facet links
        menu_facet.bind_links(links=(
            link_document_duplicates_list,
            link_acl_list,
        ),
                              sources=(Document, ))
        menu_facet.bind_links(links=(link_document_preview, ),
                              sources=(Document, ),
                              position=0)
        menu_facet.bind_links(links=(link_document_properties, ),
                              sources=(Document, ),
                              position=2)
        menu_facet.bind_links(links=(
            link_events_for_object,
            link_object_event_types_user_subcriptions_list,
            link_document_version_list,
        ),
                              sources=(Document, ),
                              position=2)
        menu_facet.bind_links(links=(link_document_pages, ),
                              sources=(Document, ))

        # Document actions
        menu_object.bind_links(links=(link_document_version_revert,
                                      link_document_version_download),
                               sources=(DocumentVersion, ))
        menu_multi_item.bind_links(links=(
            link_document_multiple_favorites_add,
            link_document_multiple_favorites_remove,
            link_document_multiple_clear_transformations,
            link_document_multiple_trash,
            link_document_multiple_download,
            link_document_multiple_update_page_count,
            link_document_multiple_document_type_edit,
        ),
                                   sources=(Document, ))
        menu_multi_item.bind_links(links=(link_document_multiple_restore,
                                          link_document_multiple_delete),
                                   sources=(DeletedDocument, ))

        # Document pages
        menu_facet.add_unsorted_source(source=DocumentPage)
        menu_facet.bind_links(
            links=(link_document_page_rotate_left,
                   link_document_page_rotate_right, link_document_page_zoom_in,
                   link_document_page_zoom_out, link_document_page_view_reset),
            sources=('documents:document_page_view', ))
        menu_facet.bind_links(links=(link_document_page_view, ),
                              sources=(DocumentPage, ))
        menu_facet.bind_links(links=(link_document_page_navigation_first,
                                     link_document_page_navigation_previous,
                                     link_document_page_navigation_next,
                                     link_document_page_navigation_last),
                              sources=(DocumentPage, ))
        menu_list_facet.bind_links(links=(link_transformation_list, ),
                                   sources=(DocumentPage, ))
        menu_multi_item.bind_links(links=(link_document_page_multiple_disable,
                                          link_document_page_multiple_enable),
                                   sources=(DocumentPage, ))
        menu_object.bind_links(links=(link_document_page_disable,
                                      link_document_page_enable),
                               sources=(DocumentPage, ))
        menu_secondary.bind_links(links=(link_document_page_return, ),
                                  sources=(DocumentPage, ))

        # Document versions
        menu_list_facet.bind_links(links=(link_document_version_view, ),
                                   sources=(DocumentVersion, ))
        menu_secondary.bind_links(links=(link_document_version_return_document,
                                         link_document_version_return_list),
                                  sources=(DocumentVersion, ))

        post_delete.connect(
            dispatch_uid='documents_handler_remove_empty_duplicates_lists',
            receiver=handler_remove_empty_duplicates_lists,
            sender=Document)
        post_initial_setup.connect(
            dispatch_uid='documents_handler_create_default_document_type',
            receiver=handler_create_default_document_type)
        post_migrate.connect(
            dispatch_uid='documents_handler_create_document_cache',
            receiver=handler_create_document_cache,
        )
        post_version_upload.connect(
            dispatch_uid='documents_handler_scan_duplicates_for',
            receiver=handler_scan_duplicates_for)

        registry.register(DeletedDocument)
        registry.register(Document)
        registry.register(DocumentType)
        registry.register(DocumentVersion)