diff --git a/mayan/apps/acls/models.py b/mayan/apps/acls/models.py index 2f36366b47..171938c8be 100644 --- a/mayan/apps/acls/models.py +++ b/mayan/apps/acls/models.py @@ -30,8 +30,8 @@ class AccessControlList(models.Model): in the Setup menu. """ content_type = models.ForeignKey( - ContentType, on_delete=models.CASCADE, - related_name='object_content_type' + on_delete=models.CASCADE, related_name='object_content_type', + to=ContentType ) object_id = models.PositiveIntegerField() content_object = GenericForeignKey( @@ -39,11 +39,11 @@ class AccessControlList(models.Model): ) # TODO: limit choices to the permissions valid for the content_object permissions = models.ManyToManyField( - StoredPermission, blank=True, related_name='acls', + blank=True, related_name='acls', to=StoredPermission, verbose_name=_('Permissions') ) role = models.ForeignKey( - Role, on_delete=models.CASCADE, related_name='acls', + on_delete=models.CASCADE, related_name='acls', to=Role, verbose_name=_('Role') ) diff --git a/mayan/apps/cabinets/models.py b/mayan/apps/cabinets/models.py index d2d54598e6..014d304285 100644 --- a/mayan/apps/cabinets/models.py +++ b/mayan/apps/cabinets/models.py @@ -20,12 +20,12 @@ from .search import cabinet_search # NOQA @python_2_unicode_compatible class Cabinet(MPTTModel): parent = TreeForeignKey( - 'self', blank=True, db_index=True, null=True, - on_delete=models.CASCADE, related_name='children' + blank=True, db_index=True, null=True, on_delete=models.CASCADE, + related_name='children', to='self' ) label = models.CharField(max_length=128, verbose_name=_('Label')) documents = models.ManyToManyField( - Document, blank=True, related_name='cabinets', + blank=True, related_name='cabinets', to=Document, verbose_name=_('Documents') ) diff --git a/mayan/apps/checkouts/models.py b/mayan/apps/checkouts/models.py index 4d9eba9e67..2750fdf85f 100644 --- a/mayan/apps/checkouts/models.py +++ b/mayan/apps/checkouts/models.py @@ -25,7 +25,7 @@ class DocumentCheckout(models.Model): Model to store the state and information of a document checkout """ document = models.OneToOneField( - Document, on_delete=models.CASCADE, verbose_name=_('Document') + on_delete=models.CASCADE, to=Document, verbose_name=_('Document') ) checkout_datetime = models.DateTimeField( auto_now_add=True, verbose_name=_('Check out date and time') @@ -37,7 +37,7 @@ class DocumentCheckout(models.Model): verbose_name=_('Check out expiration date and time') ) user = models.ForeignKey( - settings.AUTH_USER_MODEL, on_delete=models.CASCADE, + on_delete=models.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name=_('User') ) block_new_version = models.BooleanField( @@ -96,7 +96,7 @@ class DocumentCheckout(models.Model): class NewVersionBlock(models.Model): document = models.ForeignKey( - Document, on_delete=models.CASCADE, verbose_name=_('Document') + on_delete=models.CASCADE, to=Document, verbose_name=_('Document') ) objects = NewVersionBlockManager() diff --git a/mayan/apps/common/models.py b/mayan/apps/common/models.py index a892bce1d3..5d75ff363b 100644 --- a/mayan/apps/common/models.py +++ b/mayan/apps/common/models.py @@ -24,8 +24,8 @@ class ErrorLogEntry(models.Model): max_length=128, verbose_name=_('Namespace') ) content_type = models.ForeignKey( - ContentType, blank=True, on_delete=models.CASCADE, null=True, - related_name='error_log_content_type' + blank=True, on_delete=models.CASCADE, null=True, + related_name='error_log_content_type', to=ContentType, ) object_id = models.PositiveIntegerField(blank=True, null=True) content_object = GenericForeignKey( @@ -77,8 +77,8 @@ class SharedUploadedFile(models.Model): @python_2_unicode_compatible class UserLocaleProfile(models.Model): user = models.OneToOneField( - settings.AUTH_USER_MODEL, on_delete=models.CASCADE, - related_name='locale_profile', verbose_name=_('User') + on_delete=models.CASCADE, related_name='locale_profile', + to=settings.AUTH_USER_MODEL, verbose_name=_('User') ) timezone = models.CharField( choices=zip(common_timezones, common_timezones), max_length=48, diff --git a/mayan/apps/converter/models.py b/mayan/apps/converter/models.py index 909a8ea718..73df0efade 100644 --- a/mayan/apps/converter/models.py +++ b/mayan/apps/converter/models.py @@ -29,10 +29,9 @@ class Transformation(models.Model): transformation argument. Example: if a page is rotated with the Rotation transformation, this field will show by how many degrees it was rotated. """ - content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) + content_type = models.ForeignKey(on_delete=models.CASCADE, to=ContentType) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') - order = models.PositiveIntegerField( blank=True, db_index=True, default=0, help_text=_( 'Order in which the transformations will be executed. If left ' diff --git a/mayan/apps/django_gpg/models.py b/mayan/apps/django_gpg/models.py index 050f587280..5569ee692a 100644 --- a/mayan/apps/django_gpg/models.py +++ b/mayan/apps/django_gpg/models.py @@ -76,6 +76,10 @@ class Key(models.Model): def get_absolute_url(self): return reverse('django_gpg:key_detail', args=(self.pk,)) + @property + def key_id(self): + return self.fingerprint[-8:] + def save(self, *args, **kwargs): import_results, key_info = gpg_backend.import_and_list_keys( key_data=self.key_data @@ -119,7 +123,3 @@ class Key(models.Model): raise NeedPassphrase return file_sign_results - - @property - def key_id(self): - return self.fingerprint[-8:] diff --git a/mayan/apps/document_comments/models.py b/mayan/apps/document_comments/models.py index c2e81a7db3..016591aae2 100644 --- a/mayan/apps/document_comments/models.py +++ b/mayan/apps/document_comments/models.py @@ -19,12 +19,12 @@ logger = logging.getLogger(__name__) @python_2_unicode_compatible class Comment(models.Model): document = models.ForeignKey( - Document, db_index=True, on_delete=models.CASCADE, - related_name='comments', verbose_name=_('Document') + db_index=True, on_delete=models.CASCADE, related_name='comments', + to=Document, verbose_name=_('Document') ) user = models.ForeignKey( - settings.AUTH_USER_MODEL, editable=False, on_delete=models.CASCADE, - related_name='comments', verbose_name=_('User'), + editable=False, on_delete=models.CASCADE, related_name='comments', + to=settings.AUTH_USER_MODEL, verbose_name=_('User'), ) # Translators: Comment here is a noun and refers to the actual text stored comment = models.TextField(verbose_name=_('Comment')) diff --git a/mayan/apps/document_indexing/models.py b/mayan/apps/document_indexing/models.py index 63948d30cf..78ef2ff4bc 100644 --- a/mayan/apps/document_indexing/models.py +++ b/mayan/apps/document_indexing/models.py @@ -46,7 +46,7 @@ class Index(models.Model): verbose_name=_('Enabled') ) document_types = models.ManyToManyField( - DocumentType, verbose_name=_('Document types') + to=DocumentType, verbose_name=_('Document types') ) objects = IndexManager() @@ -146,10 +146,10 @@ class IndexTemplateNode(MPTTModel): documents but not both. """ parent = TreeForeignKey( - 'self', blank=True, null=True, on_delete=models.CASCADE + blank=True, null=True, on_delete=models.CASCADE, to='self', ) index = models.ForeignKey( - Index, on_delete=models.CASCADE, related_name='node_templates', + on_delete=models.CASCADE, related_name='node_templates', to=Index, verbose_name=_('Index') ) expression = models.TextField( @@ -276,18 +276,17 @@ class IndexTemplateNode(MPTTModel): @python_2_unicode_compatible class IndexInstanceNode(MPTTModel): parent = TreeForeignKey( - 'self', blank=True, null=True, on_delete=models.CASCADE + blank=True, null=True, on_delete=models.CASCADE, to='self', ) index_template_node = models.ForeignKey( - IndexTemplateNode, on_delete=models.CASCADE, - related_name='index_instance_nodes', - verbose_name=_('Index template node') + on_delete=models.CASCADE, related_name='index_instance_nodes', + to=IndexTemplateNode, verbose_name=_('Index template node') ) value = models.CharField( blank=True, db_index=True, max_length=128, verbose_name=_('Value') ) documents = models.ManyToManyField( - Document, related_name='index_instance_nodes', + related_name='index_instance_nodes', to=Document, verbose_name=_('Documents') ) diff --git a/mayan/apps/document_parsing/models.py b/mayan/apps/document_parsing/models.py index d631da9ad0..23fae82a96 100644 --- a/mayan/apps/document_parsing/models.py +++ b/mayan/apps/document_parsing/models.py @@ -12,7 +12,7 @@ from .managers import DocumentPageContentManager @python_2_unicode_compatible class DocumentPageContent(models.Model): document_page = models.OneToOneField( - DocumentPage, on_delete=models.CASCADE, related_name='content', + on_delete=models.CASCADE, related_name='content', to=DocumentPage, verbose_name=_('Document page') ) content = models.TextField(blank=True, verbose_name=_('Content')) @@ -30,8 +30,8 @@ class DocumentPageContent(models.Model): @python_2_unicode_compatible class DocumentVersionParseError(models.Model): document_version = models.ForeignKey( - DocumentVersion, on_delete=models.CASCADE, - related_name='parsing_errors', verbose_name=_('Document version') + on_delete=models.CASCADE, related_name='parsing_errors', + to=DocumentVersion, verbose_name=_('Document version') ) datetime_submitted = models.DateTimeField( auto_now_add=True, db_index=True, verbose_name=_('Date time submitted') diff --git a/mayan/apps/document_signatures/models.py b/mayan/apps/document_signatures/models.py index 65dd50e447..17d1b6bb9d 100644 --- a/mayan/apps/document_signatures/models.py +++ b/mayan/apps/document_signatures/models.py @@ -36,8 +36,8 @@ class SignatureBaseModel(models.Model): even when using the same key. """ document_version = models.ForeignKey( - DocumentVersion, editable=False, on_delete=models.CASCADE, - related_name='signatures', verbose_name=_('Document version') + editable=False, on_delete=models.CASCADE, related_name='signatures', + to=DocumentVersion, verbose_name=_('Document version') ) # Basic fields date = models.DateField( diff --git a/mayan/apps/document_states/models.py b/mayan/apps/document_states/models.py index 25fb520362..5fbbaf6049 100644 --- a/mayan/apps/document_states/models.py +++ b/mayan/apps/document_states/models.py @@ -47,8 +47,9 @@ class Workflow(models.Model): max_length=255, unique=True, verbose_name=_('Label') ) document_types = models.ManyToManyField( - DocumentType, related_name='workflows', - verbose_name=_('Document types') + related_name='workflows', to=DocumentType, verbose_name=_( + 'Document types' + ) ) objects = WorkflowManager() @@ -141,7 +142,7 @@ class WorkflowState(models.Model): the Completion Amount will show 66%. """ workflow = models.ForeignKey( - Workflow, on_delete=models.CASCADE, related_name='states', + on_delete=models.CASCADE, related_name='states', to=Workflow, verbose_name=_('Workflow') ) label = models.CharField(max_length=255, verbose_name=_('Label')) @@ -210,8 +211,8 @@ class WorkflowState(models.Model): @python_2_unicode_compatible class WorkflowStateAction(models.Model): state = models.ForeignKey( - WorkflowState, on_delete=models.CASCADE, - related_name='actions', verbose_name=_('Workflow state') + on_delete=models.CASCADE, related_name='actions', to=WorkflowState, + verbose_name=_('Workflow state') ) label = models.CharField(max_length=255, verbose_name=_('Label')) enabled = models.BooleanField(default=True, verbose_name=_('Enabled')) @@ -272,18 +273,17 @@ class WorkflowStateAction(models.Model): @python_2_unicode_compatible class WorkflowTransition(models.Model): workflow = models.ForeignKey( - Workflow, on_delete=models.CASCADE, related_name='transitions', + on_delete=models.CASCADE, related_name='transitions', to=Workflow, verbose_name=_('Workflow') ) label = models.CharField(max_length=255, verbose_name=_('Label')) origin_state = models.ForeignKey( - WorkflowState, on_delete=models.CASCADE, - related_name='origin_transitions', verbose_name=_('Origin state') + on_delete=models.CASCADE, related_name='origin_transitions', + to=WorkflowState, verbose_name=_('Origin state') ) destination_state = models.ForeignKey( - WorkflowState, on_delete=models.CASCADE, - related_name='destination_transitions', - verbose_name=_('Destination state') + on_delete=models.CASCADE, related_name='destination_transitions', + to=WorkflowState, verbose_name=_('Destination state') ) class Meta: @@ -301,11 +301,11 @@ class WorkflowTransition(models.Model): @python_2_unicode_compatible class WorkflowTransitionTriggerEvent(models.Model): transition = models.ForeignKey( - WorkflowTransition, on_delete=models.CASCADE, - related_name='trigger_events', verbose_name=_('Transition') + on_delete=models.CASCADE, related_name='trigger_events', + to=WorkflowTransition, verbose_name=_('Transition') ) event_type = models.ForeignKey( - StoredEventType, on_delete=models.CASCADE, + on_delete=models.CASCADE, to=StoredEventType, verbose_name=_('Event type') ) @@ -320,11 +320,11 @@ class WorkflowTransitionTriggerEvent(models.Model): @python_2_unicode_compatible class WorkflowInstance(models.Model): workflow = models.ForeignKey( - Workflow, on_delete=models.CASCADE, related_name='instances', + on_delete=models.CASCADE, related_name='instances', to=Workflow, verbose_name=_('Workflow') ) document = models.ForeignKey( - Document, on_delete=models.CASCADE, related_name='workflows', + on_delete=models.CASCADE, related_name='workflows', to=Document, verbose_name=_('Document') ) @@ -425,19 +425,19 @@ class WorkflowInstanceLogEntry(models.Model): the document state to the Actual state. """ workflow_instance = models.ForeignKey( - WorkflowInstance, on_delete=models.CASCADE, - related_name='log_entries', verbose_name=_('Workflow instance') + on_delete=models.CASCADE, related_name='log_entries', + to=WorkflowInstance, verbose_name=_('Workflow instance') ) datetime = models.DateTimeField( auto_now_add=True, db_index=True, verbose_name=_('Datetime') ) transition = models.ForeignKey( - WorkflowTransition, on_delete=models.CASCADE, + on_delete=models.CASCADE, to=WorkflowTransition, verbose_name=_('Transition') ) user = models.ForeignKey( - settings.AUTH_USER_MODEL, blank=True, null=True, - on_delete=models.CASCADE, verbose_name=_('User') + blank=True, null=True, on_delete=models.CASCADE, + to=settings.AUTH_USER_MODEL, verbose_name=_('User') ) comment = models.TextField(blank=True, verbose_name=_('Comment')) diff --git a/mayan/apps/documents/models.py b/mayan/apps/documents/models.py index 400284e839..cb34fc233f 100644 --- a/mayan/apps/documents/models.py +++ b/mayan/apps/documents/models.py @@ -156,7 +156,7 @@ class Document(models.Model): """ uuid = models.UUIDField(default=uuid.uuid4, editable=False) document_type = models.ForeignKey( - DocumentType, on_delete=models.CASCADE, related_name='documents', + on_delete=models.CASCADE, related_name='documents', to=DocumentType, verbose_name=_('Document type') ) label = models.CharField( @@ -381,7 +381,7 @@ class DocumentVersion(models.Model): cls._post_save_hooks[order] = func document = models.ForeignKey( - Document, on_delete=models.CASCADE, related_name='versions', + on_delete=models.CASCADE, related_name='versions', to=Document, verbose_name=_('Document') ) timestamp = models.DateTimeField( @@ -455,6 +455,37 @@ class DocumentVersion(models.Model): else: return '#' + def get_intermidiate_file(self): + cache_filename = self.cache_filename + logger.debug('Intermidiate filename: %s', cache_filename) + + if cache_storage_backend.exists(cache_filename): + logger.debug('Intermidiate file "%s" found.', cache_filename) + + return cache_storage_backend.open(cache_filename) + else: + logger.debug('Intermidiate file "%s" not found.', cache_filename) + + try: + converter = converter_class(file_object=self.open()) + pdf_file_object = converter.to_pdf() + + with cache_storage_backend.open(cache_filename, 'wb+') as file_object: + for chunk in pdf_file_object: + file_object.write(chunk) + + return cache_storage_backend.open(cache_filename) + except InvalidOfficeFormat: + return self.open() + except Exception as exception: + # Cleanup in case of error + logger.error( + 'Error creating intermediate file "%s"; %s.', + cache_filename, exception + ) + cache_storage_backend.delete(cache_filename) + raise + def get_rendered_string(self, preserve_extension=False): if preserve_extension: filename, extension = os.path.splitext(self.document.label) @@ -471,6 +502,47 @@ class DocumentVersion(models.Model): context=Context({'instance': self}) ) + def invalidate_cache(self): + cache_storage_backend.delete(self.cache_filename) + for page in self.pages.all(): + page.invalidate_cache() + + def open(self, raw=False): + """ + Return a file descriptor to a document version's file irrespective of + the storage backend + """ + if raw: + return self.file.storage.open(self.file.name) + else: + result = self.file.storage.open(self.file.name) + for key in sorted(DocumentVersion._pre_open_hooks): + result = DocumentVersion._pre_open_hooks[key]( + file_object=result, document_version=self + ) + + return result + + @property + def page_count(self): + """ + The number of pages that the document posses. + """ + return self.pages.count() + + def revert(self, _user=None): + """ + Delete the subsequent versions after this one + """ + logger.info( + 'Reverting to document document: %s to version: %s', + self.document, self + ) + + event_document_version_revert.commit(actor=_user, target=self.document) + for version in self.document.versions.filter(timestamp__gt=self.timestamp): + version.delete() + def save(self, *args, **kwargs): """ Overloaded save method that updates the document version's checksum, @@ -527,78 +599,6 @@ class DocumentVersion(models.Model): sender=Document, instance=self.document ) - def get_intermidiate_file(self): - cache_filename = self.cache_filename - logger.debug('Intermidiate filename: %s', cache_filename) - - if cache_storage_backend.exists(cache_filename): - logger.debug('Intermidiate file "%s" found.', cache_filename) - - return cache_storage_backend.open(cache_filename) - else: - logger.debug('Intermidiate file "%s" not found.', cache_filename) - - try: - converter = converter_class(file_object=self.open()) - pdf_file_object = converter.to_pdf() - - with cache_storage_backend.open(cache_filename, 'wb+') as file_object: - for chunk in pdf_file_object: - file_object.write(chunk) - - return cache_storage_backend.open(cache_filename) - except InvalidOfficeFormat: - return self.open() - except Exception as exception: - # Cleanup in case of error - logger.error( - 'Error creating intermediate file "%s"; %s.', - cache_filename, exception - ) - cache_storage_backend.delete(cache_filename) - raise - - def invalidate_cache(self): - cache_storage_backend.delete(self.cache_filename) - for page in self.pages.all(): - page.invalidate_cache() - - def open(self, raw=False): - """ - Return a file descriptor to a document version's file irrespective of - the storage backend - """ - if raw: - return self.file.storage.open(self.file.name) - else: - result = self.file.storage.open(self.file.name) - for key in sorted(DocumentVersion._pre_open_hooks): - result = DocumentVersion._pre_open_hooks[key]( - file_object=result, document_version=self - ) - - return result - - @property - def page_count(self): - """ - The number of pages that the document posses. - """ - return self.pages.count() - - def revert(self, _user=None): - """ - Delete the subsequent versions after this one - """ - logger.info( - 'Reverting to document document: %s to version: %s', - self.document, self - ) - - event_document_version_revert.commit(actor=_user, target=self.document) - for version in self.document.versions.filter(timestamp__gt=self.timestamp): - version.delete() - def save_to_file(self, filepath, buffer_size=1024 * 1024): """ Save a copy of the document from the document storage backend @@ -692,7 +692,7 @@ class DocumentTypeFilename(models.Model): quick rename functionality """ document_type = models.ForeignKey( - DocumentType, on_delete=models.CASCADE, related_name='filenames', + on_delete=models.CASCADE, related_name='filenames', to=DocumentType, verbose_name=_('Document type') ) filename = models.CharField( @@ -716,7 +716,7 @@ class DocumentPage(models.Model): Model that describes a document version page """ document_version = models.ForeignKey( - DocumentVersion, on_delete=models.CASCADE, related_name='pages', + on_delete=models.CASCADE, related_name='pages', to=DocumentVersion, verbose_name=_('Document version') ) page_number = models.PositiveIntegerField( @@ -895,8 +895,8 @@ class DocumentPage(models.Model): class DocumentPageCachedImage(models.Model): document_page = models.ForeignKey( - DocumentPage, on_delete=models.CASCADE, related_name='cached_images', - verbose_name=_('Document page') + on_delete=models.CASCADE, related_name='cached_images', + to=DocumentPage, verbose_name=_('Document page') ) filename = models.CharField(max_length=128, verbose_name=_('Filename')) @@ -924,11 +924,11 @@ class RecentDocument(models.Model): a given user """ user = models.ForeignKey( - settings.AUTH_USER_MODEL, db_index=True, editable=False, - on_delete=models.CASCADE, verbose_name=_('User') + db_index=True, editable=False, on_delete=models.CASCADE, + to=settings.AUTH_USER_MODEL, verbose_name=_('User') ) document = models.ForeignKey( - Document, editable=False, on_delete=models.CASCADE, + editable=False, on_delete=models.CASCADE, to=Document, verbose_name=_('Document') ) datetime_accessed = models.DateTimeField( @@ -953,11 +953,11 @@ class RecentDocument(models.Model): @python_2_unicode_compatible class DuplicatedDocument(models.Model): document = models.ForeignKey( - Document, on_delete=models.CASCADE, related_name='duplicates', + on_delete=models.CASCADE, related_name='duplicates', to=Document, verbose_name=_('Document') ) documents = models.ManyToManyField( - Document, verbose_name=_('Duplicated documents') + to=Document, verbose_name=_('Duplicated documents') ) datetime_added = models.DateTimeField( auto_now_add=True, db_index=True, verbose_name=_('Added') diff --git a/mayan/apps/events/models.py b/mayan/apps/events/models.py index 1a8ae597fe..565c5e21d8 100644 --- a/mayan/apps/events/models.py +++ b/mayan/apps/events/models.py @@ -43,12 +43,13 @@ class StoredEventType(models.Model): @python_2_unicode_compatible class EventSubscription(models.Model): user = models.ForeignKey( - settings.AUTH_USER_MODEL, db_index=True, on_delete=models.CASCADE, - related_name='event_subscriptions', verbose_name=_('User') + db_index=True, on_delete=models.CASCADE, + related_name='event_subscriptions', to=settings.AUTH_USER_MODEL, + verbose_name=_('User') ) stored_event_type = models.ForeignKey( - StoredEventType, on_delete=models.CASCADE, - related_name='event_subscriptions', verbose_name=_('Event type') + on_delete=models.CASCADE, related_name='event_subscriptions', + to=StoredEventType, verbose_name=_('Event type') ) objects = EventSubscriptionManager() @@ -64,11 +65,12 @@ class EventSubscription(models.Model): @python_2_unicode_compatible class Notification(models.Model): user = models.ForeignKey( - settings.AUTH_USER_MODEL, db_index=True, on_delete=models.CASCADE, - related_name='notifications', verbose_name=_('User') + db_index=True, on_delete=models.CASCADE, + related_name='notifications', to=settings.AUTH_USER_MODEL, + verbose_name=_('User') ) action = models.ForeignKey( - Action, on_delete=models.CASCADE, related_name='notifications', + on_delete=models.CASCADE, related_name='notifications', to=Action, verbose_name=_('Action') ) read = models.BooleanField(default=False, verbose_name=_('Read')) @@ -85,7 +87,7 @@ class Notification(models.Model): @python_2_unicode_compatible class ObjectEventSubscription(models.Model): content_type = models.ForeignKey( - ContentType, on_delete=models.CASCADE, + on_delete=models.CASCADE, to=ContentType, ) object_id = models.PositiveIntegerField() content_object = GenericForeignKey( @@ -93,12 +95,13 @@ class ObjectEventSubscription(models.Model): fk_field='object_id', ) user = models.ForeignKey( - settings.AUTH_USER_MODEL, db_index=True, on_delete=models.CASCADE, - related_name='object_subscriptions', verbose_name=_('User') + db_index=True, on_delete=models.CASCADE, + related_name='object_subscriptions', to=settings.AUTH_USER_MODEL, + verbose_name=_('User') ) stored_event_type = models.ForeignKey( - StoredEventType, on_delete=models.CASCADE, - related_name='object_subscriptions', verbose_name=_('Event type') + on_delete=models.CASCADE, related_name='object_subscriptions', + to=StoredEventType, verbose_name=_('Event type') ) objects = ObjectEventSubscriptionManager() diff --git a/mayan/apps/linking/models.py b/mayan/apps/linking/models.py index beb9acd90a..e2e805f212 100644 --- a/mayan/apps/linking/models.py +++ b/mayan/apps/linking/models.py @@ -29,7 +29,7 @@ class SmartLink(models.Model): ) enabled = models.BooleanField(default=True, verbose_name=_('Enabled')) document_types = models.ManyToManyField( - DocumentType, verbose_name=_('Document types') + to=DocumentType, verbose_name=_('Document types') ) objects = SmartLinkManager() @@ -105,7 +105,7 @@ class ResolvedSmartLink(SmartLink): @python_2_unicode_compatible class SmartLinkCondition(models.Model): smart_link = models.ForeignKey( - SmartLink, on_delete=models.CASCADE, related_name='conditions', + on_delete=models.CASCADE, related_name='conditions', to=SmartLink, verbose_name=_('Smart link') ) inclusion = models.CharField( diff --git a/mayan/apps/mailer/models.py b/mayan/apps/mailer/models.py index 0b7eaebfb6..d2d8aca45b 100644 --- a/mayan/apps/mailer/models.py +++ b/mayan/apps/mailer/models.py @@ -111,7 +111,7 @@ class UserMailer(models.Model): class UserMailerLogEntry(models.Model): user_mailer = models.ForeignKey( - UserMailer, on_delete=models.CASCADE, related_name='error_log', + on_delete=models.CASCADE, related_name='error_log', to=UserMailer, verbose_name=_('User mailer') ) datetime = models.DateTimeField( diff --git a/mayan/apps/metadata/models.py b/mayan/apps/metadata/models.py index d7097bef4e..b7e5a21503 100644 --- a/mayan/apps/metadata/models.py +++ b/mayan/apps/metadata/models.py @@ -149,11 +149,11 @@ class DocumentMetadata(models.Model): current value """ document = models.ForeignKey( - Document, on_delete=models.CASCADE, related_name='metadata', + on_delete=models.CASCADE, related_name='metadata', to=Document, verbose_name=_('Document') ) metadata_type = models.ForeignKey( - MetadataType, on_delete=models.CASCADE, verbose_name=_('Type') + on_delete=models.CASCADE, to=MetadataType, verbose_name=_('Type') ) value = models.CharField( blank=True, db_index=True, max_length=255, null=True, @@ -207,11 +207,11 @@ class DocumentMetadata(models.Model): @python_2_unicode_compatible class DocumentTypeMetadataType(models.Model): document_type = models.ForeignKey( - DocumentType, on_delete=models.CASCADE, related_name='metadata', + on_delete=models.CASCADE, related_name='metadata', to=DocumentType, verbose_name=_('Document type') ) metadata_type = models.ForeignKey( - MetadataType, on_delete=models.CASCADE, + on_delete=models.CASCADE, to=MetadataType, verbose_name=_('Metadata type') ) required = models.BooleanField(default=False, verbose_name=_('Required')) diff --git a/mayan/apps/ocr/models.py b/mayan/apps/ocr/models.py index b82641227b..0d0b099627 100644 --- a/mayan/apps/ocr/models.py +++ b/mayan/apps/ocr/models.py @@ -14,8 +14,8 @@ class DocumentTypeSettings(models.Model): Define for OCR for a specific document should behave """ document_type = models.OneToOneField( - DocumentType, on_delete=models.CASCADE, related_name='ocr_settings', - unique=True, verbose_name=_('Document type') + on_delete=models.CASCADE, related_name='ocr_settings', + to=DocumentType, unique=True, verbose_name=_('Document type') ) auto_ocr = models.BooleanField( default=True, @@ -30,8 +30,8 @@ class DocumentTypeSettings(models.Model): @python_2_unicode_compatible class DocumentPageOCRContent(models.Model): document_page = models.OneToOneField( - DocumentPage, on_delete=models.CASCADE, related_name='ocr_content', - verbose_name=_('Document page') + on_delete=models.CASCADE, related_name='ocr_content', + to=DocumentPage, verbose_name=_('Document page') ) content = models.TextField(blank=True, verbose_name=_('Content')) @@ -48,8 +48,8 @@ class DocumentPageOCRContent(models.Model): @python_2_unicode_compatible class DocumentVersionOCRError(models.Model): document_version = models.ForeignKey( - DocumentVersion, on_delete=models.CASCADE, related_name='ocr_errors', - verbose_name=_('Document version') + on_delete=models.CASCADE, related_name='ocr_errors', + to=DocumentVersion, verbose_name=_('Document version') ) datetime_submitted = models.DateTimeField( auto_now_add=True, db_index=True, verbose_name=_('Date time submitted') diff --git a/mayan/apps/permissions/models.py b/mayan/apps/permissions/models.py index 66b58427a9..4911018b6b 100644 --- a/mayan/apps/permissions/models.py +++ b/mayan/apps/permissions/models.py @@ -75,10 +75,11 @@ class Role(models.Model): max_length=64, unique=True, verbose_name=_('Label') ) permissions = models.ManyToManyField( - StoredPermission, related_name='roles', verbose_name=_('Permissions') + related_name='roles', to=StoredPermission, + verbose_name=_('Permissions') ) groups = models.ManyToManyField( - Group, related_name='roles', verbose_name=_('Groups') + related_name='roles', to=Group, verbose_name=_('Groups') ) objects = RoleManager() diff --git a/mayan/apps/sources/models.py b/mayan/apps/sources/models.py index e9bdca400b..21b6ecc710 100644 --- a/mayan/apps/sources/models.py +++ b/mayan/apps/sources/models.py @@ -503,18 +503,18 @@ class EmailBaseModel(IntervalBaseModel): ), max_length=128, verbose_name=_('Metadata attachment name') ) subject_metadata_type = models.ForeignKey( - MetadataType, blank=True, help_text=_( + blank=True, help_text=_( 'Select a metadata type valid for the document type selected in ' 'which to store the email\'s subject.' ), on_delete=models.CASCADE, null=True, related_name='email_subject', - verbose_name=_('Subject metadata type') + to=MetadataType, verbose_name=_('Subject metadata type') ) from_metadata_type = models.ForeignKey( - MetadataType, blank=True, help_text=_( + blank=True, help_text=_( 'Select a metadata type valid for the document type selected in ' 'which to store the email\'s "from" value.' ), on_delete=models.CASCADE, null=True, related_name='email_from', - verbose_name=_('From metadata type') + to=MetadataType, verbose_name=_('From metadata type') ) store_body = models.BooleanField( default=True, help_text=_( @@ -787,7 +787,7 @@ class WatchFolderSource(IntervalBaseModel): class SourceLog(models.Model): source = models.ForeignKey( - Source, on_delete=models.CASCADE, related_name='logs', + on_delete=models.CASCADE, related_name='logs', to=Source, verbose_name=_('Source') ) datetime = models.DateTimeField( diff --git a/mayan/apps/tags/models.py b/mayan/apps/tags/models.py index 28528a8db3..975529454d 100644 --- a/mayan/apps/tags/models.py +++ b/mayan/apps/tags/models.py @@ -21,7 +21,7 @@ class Tag(models.Model): ) color = RGBColorField(verbose_name=_('Color')) documents = models.ManyToManyField( - Document, related_name='tags', verbose_name=_('Documents') + related_name='tags', to=Document, verbose_name=_('Documents') ) class Meta: