Load models by calling AppConfig.get_model method instead.
This commit is contained in:
@@ -6,7 +6,6 @@ from common import MayanAppConfig, menu_object, menu_sidebar
|
|||||||
from navigation import SourceColumn
|
from navigation import SourceColumn
|
||||||
|
|
||||||
from .links import link_acl_new, link_acl_delete, link_acl_permissions
|
from .links import link_acl_new, link_acl_delete, link_acl_permissions
|
||||||
from .models import AccessControlList
|
|
||||||
|
|
||||||
|
|
||||||
class ACLsApp(MayanAppConfig):
|
class ACLsApp(MayanAppConfig):
|
||||||
@@ -17,6 +16,8 @@ class ACLsApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(ACLsApp, self).ready()
|
super(ACLsApp, self).ready()
|
||||||
|
|
||||||
|
AccessControlList = self.get_model('AccessControlList')
|
||||||
|
|
||||||
SourceColumn(
|
SourceColumn(
|
||||||
source=AccessControlList, label=_('Permissions'),
|
source=AccessControlList, label=_('Permissions'),
|
||||||
attribute='get_permission_titles'
|
attribute='get_permission_titles'
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ from .links import (
|
|||||||
link_checkout_list
|
link_checkout_list
|
||||||
)
|
)
|
||||||
from .literals import CHECK_EXPIRED_CHECK_OUTS_INTERVAL
|
from .literals import CHECK_EXPIRED_CHECK_OUTS_INTERVAL
|
||||||
from .models import DocumentCheckout
|
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_document_checkin, permission_document_checkin_override,
|
permission_document_checkin, permission_document_checkin_override,
|
||||||
permission_document_checkout
|
permission_document_checkout
|
||||||
@@ -36,6 +35,8 @@ class CheckoutsApp(MayanAppConfig):
|
|||||||
|
|
||||||
APIEndPoint(app=self, version_string='1')
|
APIEndPoint(app=self, version_string='1')
|
||||||
|
|
||||||
|
DocumentCheckout = self.get_model('DocumentCheckout')
|
||||||
|
|
||||||
Document.add_to_class(
|
Document.add_to_class(
|
||||||
'check_in',
|
'check_in',
|
||||||
lambda document, user=None: DocumentCheckout.objects.check_in_document(document, user)
|
lambda document, user=None: DocumentCheckout.objects.check_in_document(document, user)
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ from .links import (
|
|||||||
link_transformation_create, link_transformation_delete,
|
link_transformation_create, link_transformation_delete,
|
||||||
link_transformation_edit
|
link_transformation_edit
|
||||||
)
|
)
|
||||||
from .models import Transformation
|
|
||||||
|
|
||||||
|
|
||||||
class ConverterApp(MayanAppConfig):
|
class ConverterApp(MayanAppConfig):
|
||||||
@@ -21,6 +20,8 @@ class ConverterApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(ConverterApp, self).ready()
|
super(ConverterApp, self).ready()
|
||||||
|
|
||||||
|
Transformation = self.get_model('Transformation')
|
||||||
|
|
||||||
Package(label='Pillow', license_text='''
|
Package(label='Pillow', license_text='''
|
||||||
The Python Imaging Library (PIL) is
|
The Python Imaging Library (PIL) is
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ from navigation import SourceColumn
|
|||||||
from .links import (
|
from .links import (
|
||||||
link_comment_add, link_comment_delete, link_comments_for_document
|
link_comment_add, link_comment_delete, link_comments_for_document
|
||||||
)
|
)
|
||||||
from .models import Comment
|
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_comment_create, permission_comment_delete,
|
permission_comment_create, permission_comment_delete,
|
||||||
permission_comment_view
|
permission_comment_view
|
||||||
@@ -26,6 +25,8 @@ class DocumentCommentsApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(DocumentCommentsApp, self).ready()
|
super(DocumentCommentsApp, self).ready()
|
||||||
|
|
||||||
|
Comment = self.get_model('Comment')
|
||||||
|
|
||||||
ModelPermission.register(
|
ModelPermission.register(
|
||||||
model=Document, permissions=(
|
model=Document, permissions=(
|
||||||
permission_comment_create, permission_comment_delete,
|
permission_comment_create, permission_comment_delete,
|
||||||
|
|||||||
@@ -30,10 +30,6 @@ from .links import (
|
|||||||
link_template_node_create, link_template_node_delete,
|
link_template_node_create, link_template_node_delete,
|
||||||
link_template_node_edit
|
link_template_node_edit
|
||||||
)
|
)
|
||||||
from .models import (
|
|
||||||
DocumentIndexInstanceNode, Index, IndexInstance, IndexInstanceNode,
|
|
||||||
IndexTemplateNode
|
|
||||||
)
|
|
||||||
from .widgets import get_breadcrumbs, index_instance_item_link, node_level
|
from .widgets import get_breadcrumbs, index_instance_item_link, node_level
|
||||||
|
|
||||||
|
|
||||||
@@ -47,6 +43,12 @@ class DocumentIndexingApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(DocumentIndexingApp, self).ready()
|
super(DocumentIndexingApp, self).ready()
|
||||||
|
|
||||||
|
DocumentIndexInstanceNode = self.get_model('DocumentIndexInstanceNode')
|
||||||
|
Index = self.get_model('Index')
|
||||||
|
IndexInstance = self.get_model('IndexInstance')
|
||||||
|
IndexInstanceNode = self.get_model('IndexInstanceNode')
|
||||||
|
IndexTemplateNode = self.get_model('IndexTemplateNode')
|
||||||
|
|
||||||
APIEndPoint(app=self, version_string='1')
|
APIEndPoint(app=self, version_string='1')
|
||||||
|
|
||||||
Package(label='Django MPTT', license_text='''
|
Package(label='Django MPTT', license_text='''
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ from django_gpg.exceptions import GPGDecryptionError
|
|||||||
from django_gpg.runtime import gpg
|
from django_gpg.runtime import gpg
|
||||||
from documents.models import Document, DocumentVersion
|
from documents.models import Document, DocumentVersion
|
||||||
|
|
||||||
|
from .hooks import document_pre_open_hook, document_version_post_save_hook
|
||||||
from .links import (
|
from .links import (
|
||||||
link_document_signature_delete, link_document_signature_download,
|
link_document_signature_delete, link_document_signature_download,
|
||||||
link_document_signature_upload, link_document_verify
|
link_document_signature_upload, link_document_verify
|
||||||
)
|
)
|
||||||
from .models import DocumentVersionSignature
|
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_document_verify, permission_signature_delete,
|
permission_document_verify, permission_signature_delete,
|
||||||
permission_signature_download, permission_signature_upload
|
permission_signature_download, permission_signature_upload
|
||||||
@@ -24,37 +24,6 @@ from .permissions import (
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def document_pre_open_hook(descriptor, instance):
|
|
||||||
if DocumentVersionSignature.objects.has_embedded_signature(document_version=instance):
|
|
||||||
# If it has an embedded signature, decrypt
|
|
||||||
try:
|
|
||||||
result = gpg.decrypt_file(descriptor, close_descriptor=False)
|
|
||||||
# gpg return a string, turn it into a file like object
|
|
||||||
except GPGDecryptionError:
|
|
||||||
# At least return the original raw content
|
|
||||||
descriptor.seek(0)
|
|
||||||
return descriptor
|
|
||||||
else:
|
|
||||||
descriptor.close()
|
|
||||||
return io.BytesIO(result.data)
|
|
||||||
else:
|
|
||||||
return descriptor
|
|
||||||
|
|
||||||
|
|
||||||
def document_version_post_save_hook(instance):
|
|
||||||
logger.debug('instance: %s', instance)
|
|
||||||
|
|
||||||
try:
|
|
||||||
document_signature = DocumentVersionSignature.objects.get(
|
|
||||||
document_version=instance
|
|
||||||
)
|
|
||||||
except DocumentVersionSignature.DoesNotExist:
|
|
||||||
document_signature = DocumentVersionSignature.objects.create(
|
|
||||||
document_version=instance
|
|
||||||
)
|
|
||||||
document_signature.check_for_embedded_signature()
|
|
||||||
|
|
||||||
|
|
||||||
class DocumentSignaturesApp(MayanAppConfig):
|
class DocumentSignaturesApp(MayanAppConfig):
|
||||||
app_namespace = 'signatures'
|
app_namespace = 'signatures'
|
||||||
app_url = 'signatures'
|
app_url = 'signatures'
|
||||||
@@ -65,6 +34,8 @@ class DocumentSignaturesApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(DocumentSignaturesApp, self).ready()
|
super(DocumentSignaturesApp, self).ready()
|
||||||
|
|
||||||
|
DocumentVersionSignature = self.get_model('DocumentVersionSignature')
|
||||||
|
|
||||||
DocumentVersion.register_post_save_hook(
|
DocumentVersion.register_post_save_hook(
|
||||||
1, document_version_post_save_hook
|
1, document_version_post_save_hook
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -12,10 +12,6 @@ from documents.models import Document
|
|||||||
from navigation import SourceColumn
|
from navigation import SourceColumn
|
||||||
|
|
||||||
from .handlers import launch_workflow
|
from .handlers import launch_workflow
|
||||||
from .models import (
|
|
||||||
Workflow, WorkflowInstance, WorkflowInstanceLogEntry, WorkflowState,
|
|
||||||
WorkflowTransition
|
|
||||||
)
|
|
||||||
from .links import (
|
from .links import (
|
||||||
link_document_workflow_instance_list, link_setup_workflow_document_types,
|
link_document_workflow_instance_list, link_setup_workflow_document_types,
|
||||||
link_setup_workflow_create, link_setup_workflow_delete,
|
link_setup_workflow_create, link_setup_workflow_delete,
|
||||||
@@ -37,6 +33,12 @@ class DocumentStatesApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(DocumentStatesApp, self).ready()
|
super(DocumentStatesApp, self).ready()
|
||||||
|
|
||||||
|
Workflow = self.get_model('Workflow')
|
||||||
|
WorkflowInstance = self.get_model('WorkflowInstance')
|
||||||
|
WorkflowInstanceLogEntry = self.get_model('WorkflowInstanceLogEntry')
|
||||||
|
WorkflowState = self.get_model('WorkflowState')
|
||||||
|
WorkflowTransition = self.get_model('WorkflowTransition')
|
||||||
|
|
||||||
SourceColumn(
|
SourceColumn(
|
||||||
source=Workflow, label=_('Initial state'),
|
source=Workflow, label=_('Initial state'),
|
||||||
func=lambda context: context['object'].get_initial_state() or _('None')
|
func=lambda context: context['object'].get_initial_state() or _('None')
|
||||||
|
|||||||
@@ -60,10 +60,6 @@ from .literals import (
|
|||||||
CHECK_DELETE_PERIOD_INTERVAL, CHECK_TRASH_PERIOD_INTERVAL,
|
CHECK_DELETE_PERIOD_INTERVAL, CHECK_TRASH_PERIOD_INTERVAL,
|
||||||
DELETE_STALE_STUBS_INTERVAL
|
DELETE_STALE_STUBS_INTERVAL
|
||||||
)
|
)
|
||||||
from .models import (
|
|
||||||
DeletedDocument, Document, DocumentPage, DocumentType,
|
|
||||||
DocumentTypeFilename, DocumentVersion
|
|
||||||
)
|
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_document_delete, permission_document_download,
|
permission_document_delete, permission_document_download,
|
||||||
permission_document_edit, permission_document_new_version,
|
permission_document_edit, permission_document_new_version,
|
||||||
@@ -90,6 +86,13 @@ class DocumentsApp(MayanAppConfig):
|
|||||||
|
|
||||||
APIEndPoint(app=self, version_string='1')
|
APIEndPoint(app=self, version_string='1')
|
||||||
|
|
||||||
|
DeletedDocument = self.get_model('DeletedDocument')
|
||||||
|
Document = self.get_model('Document')
|
||||||
|
DocumentPage = self.get_model('DocumentPage')
|
||||||
|
DocumentType = self.get_model('DocumentType')
|
||||||
|
DocumentTypeFilename = self.get_model('DocumentTypeFilename')
|
||||||
|
DocumentVersion = self.get_model('DocumentVersion')
|
||||||
|
|
||||||
MissingItem(
|
MissingItem(
|
||||||
label=_('Create a document type'),
|
label=_('Create a document type'),
|
||||||
description=_(
|
description=_(
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ from .links import (
|
|||||||
link_folder_delete, link_folder_document_multiple_remove,
|
link_folder_delete, link_folder_document_multiple_remove,
|
||||||
link_folder_edit, link_folder_view
|
link_folder_edit, link_folder_view
|
||||||
)
|
)
|
||||||
from .models import DocumentFolder, Folder
|
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_folder_add_document, permission_folder_delete,
|
permission_folder_add_document, permission_folder_delete,
|
||||||
permission_folder_edit, permission_folder_remove_document,
|
permission_folder_edit, permission_folder_remove_document,
|
||||||
@@ -36,6 +35,9 @@ class FoldersApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(FoldersApp, self).ready()
|
super(FoldersApp, self).ready()
|
||||||
|
|
||||||
|
DocumentFolder = self.get_model('DocumentFolder')
|
||||||
|
Folder = self.get_model('Folder')
|
||||||
|
|
||||||
APIEndPoint(app=self, version_string='1')
|
APIEndPoint(app=self, version_string='1')
|
||||||
|
|
||||||
Document.add_to_class(
|
Document.add_to_class(
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ from .links import (
|
|||||||
link_smart_link_instance_view, link_smart_link_instances_for_document,
|
link_smart_link_instance_view, link_smart_link_instances_for_document,
|
||||||
link_smart_link_list, link_smart_link_setup
|
link_smart_link_list, link_smart_link_setup
|
||||||
)
|
)
|
||||||
from .models import ResolvedSmartLink, SmartLink, SmartLinkCondition
|
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_smart_link_delete, permission_smart_link_edit,
|
permission_smart_link_delete, permission_smart_link_edit,
|
||||||
permission_smart_link_view
|
permission_smart_link_view
|
||||||
@@ -35,6 +34,10 @@ class LinkingApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(LinkingApp, self).ready()
|
super(LinkingApp, self).ready()
|
||||||
|
|
||||||
|
ResolvedSmartLink = self.get_model('ResolvedSmartLink')
|
||||||
|
SmartLink = self.get_model('SmartLink')
|
||||||
|
SmartLinkCondition = self.get_model('SmartLinkCondition')
|
||||||
|
|
||||||
ModelPermission.register(
|
ModelPermission.register(
|
||||||
model=SmartLink, permissions=(
|
model=SmartLink, permissions=(
|
||||||
permission_acl_edit, permission_acl_view,
|
permission_acl_edit, permission_acl_view,
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ from .links import (
|
|||||||
link_document_mailing_error_log, link_send_document_link,
|
link_document_mailing_error_log, link_send_document_link,
|
||||||
link_send_document
|
link_send_document
|
||||||
)
|
)
|
||||||
from .models import LogEntry
|
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_mailing_link, permission_mailing_send_document
|
permission_mailing_link, permission_mailing_send_document
|
||||||
)
|
)
|
||||||
@@ -27,6 +26,8 @@ class MailerApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(MailerApp, self).ready()
|
super(MailerApp, self).ready()
|
||||||
|
|
||||||
|
LogEntry = self.get_model('LogEntry')
|
||||||
|
|
||||||
SourceColumn(
|
SourceColumn(
|
||||||
source=LogEntry, label=_('Date and time'), attribute='datetime'
|
source=LogEntry, label=_('Date and time'), attribute='datetime'
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ from .links import (
|
|||||||
link_setup_metadata_type_create, link_setup_metadata_type_delete,
|
link_setup_metadata_type_create, link_setup_metadata_type_delete,
|
||||||
link_setup_metadata_type_edit, link_setup_metadata_type_list,
|
link_setup_metadata_type_edit, link_setup_metadata_type_list,
|
||||||
)
|
)
|
||||||
from .models import DocumentMetadata, DocumentTypeMetadataType, MetadataType
|
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_metadata_document_add, permission_metadata_document_edit,
|
permission_metadata_document_add, permission_metadata_document_edit,
|
||||||
permission_metadata_document_remove, permission_metadata_document_view
|
permission_metadata_document_remove, permission_metadata_document_view
|
||||||
@@ -55,6 +54,10 @@ class MetadataApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(MetadataApp, self).ready()
|
super(MetadataApp, self).ready()
|
||||||
|
|
||||||
|
DocumentMetadata = self.get_model('DocumentMetadata')
|
||||||
|
DocumentTypeMetadataType = self.get_model('DocumentTypeMetadataType')
|
||||||
|
MetadataType = self.get_model('MetadataType')
|
||||||
|
|
||||||
APIEndPoint(app=self, version_string='1')
|
APIEndPoint(app=self, version_string='1')
|
||||||
|
|
||||||
Document.add_to_class(
|
Document.add_to_class(
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ from .links import (
|
|||||||
link_document_submit_multiple, link_document_type_ocr_settings,
|
link_document_submit_multiple, link_document_type_ocr_settings,
|
||||||
link_document_type_submit, link_entry_list
|
link_document_type_submit, link_entry_list
|
||||||
)
|
)
|
||||||
from .models import DocumentVersionOCRError
|
|
||||||
from .permissions import permission_ocr_document, permission_ocr_content_view
|
from .permissions import permission_ocr_document, permission_ocr_content_view
|
||||||
from .settings import (
|
from .settings import (
|
||||||
setting_pdftotext_path, setting_tesseract_path
|
setting_pdftotext_path, setting_tesseract_path
|
||||||
@@ -58,6 +57,8 @@ class OCRApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(OCRApp, self).ready()
|
super(OCRApp, self).ready()
|
||||||
|
|
||||||
|
DocumentVersionOCRError = self.get_model('DocumentVersionOCRError')
|
||||||
|
|
||||||
APIEndPoint(app=self, version_string='1')
|
APIEndPoint(app=self, version_string='1')
|
||||||
|
|
||||||
Document.add_to_class('submit_for_ocr', document_ocr_submit)
|
Document.add_to_class('submit_for_ocr', document_ocr_submit)
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ from common.signals import perform_upgrade
|
|||||||
from rest_api.classes import APIEndPoint
|
from rest_api.classes import APIEndPoint
|
||||||
|
|
||||||
from .handlers import purge_permissions
|
from .handlers import purge_permissions
|
||||||
from .models import Role
|
|
||||||
from .links import (
|
from .links import (
|
||||||
link_permission_grant, link_permission_revoke, link_role_create,
|
link_permission_grant, link_permission_revoke, link_role_create,
|
||||||
link_role_delete, link_role_edit, link_role_list, link_role_members,
|
link_role_delete, link_role_edit, link_role_list, link_role_members,
|
||||||
@@ -25,6 +24,8 @@ class PermissionsApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(PermissionsApp, self).ready()
|
super(PermissionsApp, self).ready()
|
||||||
|
|
||||||
|
Role = self.get_model('Role')
|
||||||
|
|
||||||
APIEndPoint(app=self, version_string='1')
|
APIEndPoint(app=self, version_string='1')
|
||||||
|
|
||||||
menu_object.bind_links(
|
menu_object.bind_links(
|
||||||
|
|||||||
@@ -30,10 +30,6 @@ from .links import (
|
|||||||
link_setup_source_edit, link_setup_source_logs, link_staging_file_delete,
|
link_setup_source_edit, link_setup_source_logs, link_staging_file_delete,
|
||||||
link_upload_version
|
link_upload_version
|
||||||
)
|
)
|
||||||
from .models import (
|
|
||||||
POP3Email, IMAPEmail, Source, SourceLog, StagingFolderSource,
|
|
||||||
WatchFolderSource, WebFormSource
|
|
||||||
)
|
|
||||||
from .widgets import staging_file_thumbnail
|
from .widgets import staging_file_thumbnail
|
||||||
|
|
||||||
|
|
||||||
@@ -45,6 +41,14 @@ class SourcesApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(SourcesApp, self).ready()
|
super(SourcesApp, self).ready()
|
||||||
|
|
||||||
|
POP3Email = self.get_model('POP3Email')
|
||||||
|
IMAPEmail = self.get_model('IMAPEmail')
|
||||||
|
Source = self.get_model('Source')
|
||||||
|
SourceLog = self.get_model('SourceLog')
|
||||||
|
StagingFolderSource = self.get_model('StagingFolderSource')
|
||||||
|
WatchFolderSource = self.get_model('WatchFolderSource')
|
||||||
|
WebFormSource = self.get_model('WebFormSource')
|
||||||
|
|
||||||
APIEndPoint(app=self, version_string='1')
|
APIEndPoint(app=self, version_string='1')
|
||||||
|
|
||||||
MissingItem(
|
MissingItem(
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ from .links import (
|
|||||||
link_tag_delete, link_tag_document_list, link_tag_edit, link_tag_list,
|
link_tag_delete, link_tag_document_list, link_tag_edit, link_tag_list,
|
||||||
link_tag_multiple_delete, link_tag_tagged_item_list
|
link_tag_multiple_delete, link_tag_tagged_item_list
|
||||||
)
|
)
|
||||||
from .models import DocumentTag, Tag
|
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_tag_attach, permission_tag_delete, permission_tag_edit,
|
permission_tag_attach, permission_tag_delete, permission_tag_edit,
|
||||||
permission_tag_remove, permission_tag_view
|
permission_tag_remove, permission_tag_view
|
||||||
@@ -36,6 +35,9 @@ class TagsApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(TagsApp, self).ready()
|
super(TagsApp, self).ready()
|
||||||
|
|
||||||
|
DocumentTag = self.get_model('DocumentTag')
|
||||||
|
Tag = self.get_model('Tag')
|
||||||
|
|
||||||
APIEndPoint(app=self, version_string='1')
|
APIEndPoint(app=self, version_string='1')
|
||||||
|
|
||||||
Document.add_to_class(
|
Document.add_to_class(
|
||||||
|
|||||||
Reference in New Issue
Block a user