mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Chore: Squash older automatic migrations (#7267)
This commit is contained in:
		| @@ -0,0 +1,178 @@ | ||||
| # Generated by Django 4.2.13 on 2024-06-28 17:52 | ||||
|  | ||||
| import django.db.models.deletion | ||||
| from django.db import migrations | ||||
| from django.db import models | ||||
|  | ||||
|  | ||||
| class Migration(migrations.Migration): | ||||
|     replaces = [ | ||||
|         ("documents", "0004_auto_20160114_1844"), | ||||
|         ("documents", "0005_auto_20160123_0313"), | ||||
|         ("documents", "0006_auto_20160123_0430"), | ||||
|         ("documents", "0007_auto_20160126_2114"), | ||||
|         ("documents", "0008_document_file_type"), | ||||
|         ("documents", "0009_auto_20160214_0040"), | ||||
|         ("documents", "0010_log"), | ||||
|         ("documents", "0011_auto_20160303_1929"), | ||||
|     ] | ||||
|  | ||||
|     dependencies = [ | ||||
|         ("documents", "0003_sender"), | ||||
|     ] | ||||
|  | ||||
|     operations = [ | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="sender", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.CASCADE, | ||||
|                 related_name="documents", | ||||
|                 to="documents.sender", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterModelOptions( | ||||
|             name="sender", | ||||
|             options={"ordering": ("name",)}, | ||||
|         ), | ||||
|         migrations.CreateModel( | ||||
|             name="Tag", | ||||
|             fields=[ | ||||
|                 ( | ||||
|                     "id", | ||||
|                     models.AutoField( | ||||
|                         auto_created=True, | ||||
|                         primary_key=True, | ||||
|                         serialize=False, | ||||
|                         verbose_name="ID", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ("name", models.CharField(max_length=128, unique=True)), | ||||
|                 ("slug", models.SlugField(blank=True)), | ||||
|                 ( | ||||
|                     "colour", | ||||
|                     models.PositiveIntegerField( | ||||
|                         choices=[ | ||||
|                             (1, "#a6cee3"), | ||||
|                             (2, "#1f78b4"), | ||||
|                             (3, "#b2df8a"), | ||||
|                             (4, "#33a02c"), | ||||
|                             (5, "#fb9a99"), | ||||
|                             (6, "#e31a1c"), | ||||
|                             (7, "#fdbf6f"), | ||||
|                             (8, "#ff7f00"), | ||||
|                             (9, "#cab2d6"), | ||||
|                             (10, "#6a3d9a"), | ||||
|                             (11, "#b15928"), | ||||
|                             (12, "#000000"), | ||||
|                             (13, "#cccccc"), | ||||
|                         ], | ||||
|                         default=1, | ||||
|                     ), | ||||
|                 ), | ||||
|                 ("match", models.CharField(blank=True, max_length=256)), | ||||
|                 ( | ||||
|                     "matching_algorithm", | ||||
|                     models.PositiveIntegerField( | ||||
|                         choices=[ | ||||
|                             (1, "Any"), | ||||
|                             (2, "All"), | ||||
|                             (3, "Literal"), | ||||
|                             (4, "Regular Expression"), | ||||
|                         ], | ||||
|                         default=1, | ||||
|                         help_text='Which algorithm you want to use when matching text to the OCR\'d PDF.  Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided.  A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF.  If you don\'t know what a regex is, you probably don\'t want this option.', | ||||
|                     ), | ||||
|                 ), | ||||
|             ], | ||||
|             options={ | ||||
|                 "abstract": False, | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="sender", | ||||
|             name="slug", | ||||
|             field=models.SlugField(blank=True), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="document", | ||||
|             name="file_type", | ||||
|             field=models.CharField( | ||||
|                 choices=[ | ||||
|                     ("pdf", "PDF"), | ||||
|                     ("png", "PNG"), | ||||
|                     ("jpg", "JPG"), | ||||
|                     ("gif", "GIF"), | ||||
|                     ("tiff", "TIFF"), | ||||
|                 ], | ||||
|                 default="pdf", | ||||
|                 editable=False, | ||||
|                 max_length=4, | ||||
|             ), | ||||
|             preserve_default=False, | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="document", | ||||
|             name="tags", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 related_name="documents", | ||||
|                 to="documents.tag", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.CreateModel( | ||||
|             name="Log", | ||||
|             fields=[ | ||||
|                 ( | ||||
|                     "id", | ||||
|                     models.AutoField( | ||||
|                         auto_created=True, | ||||
|                         primary_key=True, | ||||
|                         serialize=False, | ||||
|                         verbose_name="ID", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ("group", models.UUIDField(blank=True)), | ||||
|                 ("message", models.TextField()), | ||||
|                 ( | ||||
|                     "level", | ||||
|                     models.PositiveIntegerField( | ||||
|                         choices=[ | ||||
|                             (10, "Debugging"), | ||||
|                             (20, "Informational"), | ||||
|                             (30, "Warning"), | ||||
|                             (40, "Error"), | ||||
|                             (50, "Critical"), | ||||
|                         ], | ||||
|                         default=20, | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "component", | ||||
|                     models.PositiveIntegerField( | ||||
|                         choices=[(1, "Consumer"), (2, "Mail Fetcher")], | ||||
|                     ), | ||||
|                 ), | ||||
|                 ("created", models.DateTimeField(auto_now_add=True)), | ||||
|                 ("modified", models.DateTimeField(auto_now=True)), | ||||
|             ], | ||||
|             options={ | ||||
|                 "ordering": ("-modified",), | ||||
|             }, | ||||
|         ), | ||||
|         migrations.RenameModel( | ||||
|             old_name="Sender", | ||||
|             new_name="Correspondent", | ||||
|         ), | ||||
|         migrations.AlterModelOptions( | ||||
|             name="document", | ||||
|             options={"ordering": ("correspondent", "title")}, | ||||
|         ), | ||||
|         migrations.RenameField( | ||||
|             model_name="document", | ||||
|             old_name="sender", | ||||
|             new_name="correspondent", | ||||
|         ), | ||||
|     ] | ||||
| @@ -0,0 +1,91 @@ | ||||
| # Generated by Django 4.2.13 on 2024-06-28 17:57 | ||||
|  | ||||
| import django.db.models.deletion | ||||
| from django.db import migrations | ||||
| from django.db import models | ||||
|  | ||||
|  | ||||
| class Migration(migrations.Migration): | ||||
|     replaces = [ | ||||
|         ("documents", "0015_add_insensitive_to_match"), | ||||
|         ("documents", "0016_auto_20170325_1558"), | ||||
|         ("documents", "0017_auto_20170512_0507"), | ||||
|         ("documents", "0018_auto_20170715_1712"), | ||||
|     ] | ||||
|  | ||||
|     dependencies = [ | ||||
|         ("documents", "0014_document_checksum"), | ||||
|     ] | ||||
|  | ||||
|     operations = [ | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="checksum", | ||||
|             field=models.CharField( | ||||
|                 editable=False, | ||||
|                 help_text="The checksum of the original document (before it was encrypted).  We use this to prevent duplicate document imports.", | ||||
|                 max_length=32, | ||||
|                 unique=True, | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="correspondent", | ||||
|             name="is_insensitive", | ||||
|             field=models.BooleanField(default=True), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="tag", | ||||
|             name="is_insensitive", | ||||
|             field=models.BooleanField(default=True), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="content", | ||||
|             field=models.TextField( | ||||
|                 blank=True, | ||||
|                 db_index=True, | ||||
|                 help_text="The raw, text-only data of the document.  This field is primarily used for searching.", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="correspondent", | ||||
|             name="matching_algorithm", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (1, "Any"), | ||||
|                     (2, "All"), | ||||
|                     (3, "Literal"), | ||||
|                     (4, "Regular Expression"), | ||||
|                     (5, "Fuzzy Match"), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 help_text='Which algorithm you want to use when matching text to the OCR\'d PDF.  Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided.  A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF.  (If you don\'t know what a regex is, you probably don\'t want this option.)  Finally, a "fuzzy match" looks for words or phrases that are mostly—but not exactly—the same, which can be useful for matching against documents containing imperfections that foil accurate OCR.', | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="tag", | ||||
|             name="matching_algorithm", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (1, "Any"), | ||||
|                     (2, "All"), | ||||
|                     (3, "Literal"), | ||||
|                     (4, "Regular Expression"), | ||||
|                     (5, "Fuzzy Match"), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 help_text='Which algorithm you want to use when matching text to the OCR\'d PDF.  Here, "any" looks for any occurrence of any word provided in the PDF, while "all" requires that every word provided appear in the PDF, albeit not in the order provided.  A "literal" match means that the text you enter must appear in the PDF exactly as you\'ve entered it, and "regular expression" uses a regex to match the PDF.  (If you don\'t know what a regex is, you probably don\'t want this option.)  Finally, a "fuzzy match" looks for words or phrases that are mostly—but not exactly—the same, which can be useful for matching against documents containing imperfections that foil accurate OCR.', | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="correspondent", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 related_name="documents", | ||||
|                 to="documents.correspondent", | ||||
|             ), | ||||
|         ), | ||||
|     ] | ||||
| @@ -0,0 +1,485 @@ | ||||
| # Generated by Django 4.2.13 on 2024-06-28 18:01 | ||||
|  | ||||
| import django.db.models.deletion | ||||
| import django.utils.timezone | ||||
| from django.conf import settings | ||||
| from django.db import migrations | ||||
| from django.db import models | ||||
|  | ||||
|  | ||||
| class Migration(migrations.Migration): | ||||
|     replaces = [ | ||||
|         ("documents", "1006_auto_20201208_2209"), | ||||
|         ("documents", "1007_savedview_savedviewfilterrule"), | ||||
|         ("documents", "1008_auto_20201216_1736"), | ||||
|         ("documents", "1009_auto_20201216_2005"), | ||||
|         ("documents", "1010_auto_20210101_2159"), | ||||
|         ("documents", "1011_auto_20210101_2340"), | ||||
|     ] | ||||
|  | ||||
|     dependencies = [ | ||||
|         ("documents", "1005_checksums"), | ||||
|         migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||||
|     ] | ||||
|  | ||||
|     operations = [ | ||||
|         migrations.RemoveField( | ||||
|             model_name="correspondent", | ||||
|             name="slug", | ||||
|         ), | ||||
|         migrations.RemoveField( | ||||
|             model_name="documenttype", | ||||
|             name="slug", | ||||
|         ), | ||||
|         migrations.RemoveField( | ||||
|             model_name="tag", | ||||
|             name="slug", | ||||
|         ), | ||||
|         migrations.CreateModel( | ||||
|             name="SavedView", | ||||
|             fields=[ | ||||
|                 ( | ||||
|                     "id", | ||||
|                     models.AutoField( | ||||
|                         auto_created=True, | ||||
|                         primary_key=True, | ||||
|                         serialize=False, | ||||
|                         verbose_name="ID", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ("name", models.CharField(max_length=128, verbose_name="name")), | ||||
|                 ( | ||||
|                     "show_on_dashboard", | ||||
|                     models.BooleanField(verbose_name="show on dashboard"), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "show_in_sidebar", | ||||
|                     models.BooleanField(verbose_name="show in sidebar"), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "sort_field", | ||||
|                     models.CharField(max_length=128, verbose_name="sort field"), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "sort_reverse", | ||||
|                     models.BooleanField(default=False, verbose_name="sort reverse"), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "user", | ||||
|                     models.ForeignKey( | ||||
|                         on_delete=django.db.models.deletion.CASCADE, | ||||
|                         to=settings.AUTH_USER_MODEL, | ||||
|                         verbose_name="user", | ||||
|                     ), | ||||
|                 ), | ||||
|             ], | ||||
|             options={ | ||||
|                 "ordering": ("name",), | ||||
|                 "verbose_name": "saved view", | ||||
|                 "verbose_name_plural": "saved views", | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AlterModelOptions( | ||||
|             name="correspondent", | ||||
|             options={ | ||||
|                 "ordering": ("name",), | ||||
|                 "verbose_name": "correspondent", | ||||
|                 "verbose_name_plural": "correspondents", | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AlterModelOptions( | ||||
|             name="document", | ||||
|             options={ | ||||
|                 "ordering": ("-created",), | ||||
|                 "verbose_name": "document", | ||||
|                 "verbose_name_plural": "documents", | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AlterModelOptions( | ||||
|             name="documenttype", | ||||
|             options={ | ||||
|                 "verbose_name": "document type", | ||||
|                 "verbose_name_plural": "document types", | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AlterModelOptions( | ||||
|             name="log", | ||||
|             options={ | ||||
|                 "ordering": ("-created",), | ||||
|                 "verbose_name": "log", | ||||
|                 "verbose_name_plural": "logs", | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AlterModelOptions( | ||||
|             name="tag", | ||||
|             options={"verbose_name": "tag", "verbose_name_plural": "tags"}, | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="correspondent", | ||||
|             name="is_insensitive", | ||||
|             field=models.BooleanField(default=True, verbose_name="is insensitive"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="correspondent", | ||||
|             name="match", | ||||
|             field=models.CharField(blank=True, max_length=256, verbose_name="match"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="correspondent", | ||||
|             name="matching_algorithm", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (1, "Any word"), | ||||
|                     (2, "All words"), | ||||
|                     (3, "Exact match"), | ||||
|                     (4, "Regular expression"), | ||||
|                     (5, "Fuzzy word"), | ||||
|                     (6, "Automatic"), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 verbose_name="matching algorithm", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="correspondent", | ||||
|             name="name", | ||||
|             field=models.CharField(max_length=128, unique=True, verbose_name="name"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="added", | ||||
|             field=models.DateTimeField( | ||||
|                 db_index=True, | ||||
|                 default=django.utils.timezone.now, | ||||
|                 editable=False, | ||||
|                 verbose_name="added", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="archive_checksum", | ||||
|             field=models.CharField( | ||||
|                 blank=True, | ||||
|                 editable=False, | ||||
|                 help_text="The checksum of the archived document.", | ||||
|                 max_length=32, | ||||
|                 null=True, | ||||
|                 verbose_name="archive checksum", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="archive_serial_number", | ||||
|             field=models.IntegerField( | ||||
|                 blank=True, | ||||
|                 db_index=True, | ||||
|                 help_text="The position of this document in your physical document archive.", | ||||
|                 null=True, | ||||
|                 unique=True, | ||||
|                 verbose_name="archive serial number", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="checksum", | ||||
|             field=models.CharField( | ||||
|                 editable=False, | ||||
|                 help_text="The checksum of the original document.", | ||||
|                 max_length=32, | ||||
|                 unique=True, | ||||
|                 verbose_name="checksum", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="content", | ||||
|             field=models.TextField( | ||||
|                 blank=True, | ||||
|                 help_text="The raw, text-only data of the document. This field is primarily used for searching.", | ||||
|                 verbose_name="content", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="correspondent", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 related_name="documents", | ||||
|                 to="documents.correspondent", | ||||
|                 verbose_name="correspondent", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="created", | ||||
|             field=models.DateTimeField( | ||||
|                 db_index=True, | ||||
|                 default=django.utils.timezone.now, | ||||
|                 verbose_name="created", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="document_type", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 related_name="documents", | ||||
|                 to="documents.documenttype", | ||||
|                 verbose_name="document type", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="filename", | ||||
|             field=models.FilePathField( | ||||
|                 default=None, | ||||
|                 editable=False, | ||||
|                 help_text="Current filename in storage", | ||||
|                 max_length=1024, | ||||
|                 null=True, | ||||
|                 verbose_name="filename", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="mime_type", | ||||
|             field=models.CharField( | ||||
|                 editable=False, | ||||
|                 max_length=256, | ||||
|                 verbose_name="mime type", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="modified", | ||||
|             field=models.DateTimeField( | ||||
|                 auto_now=True, | ||||
|                 db_index=True, | ||||
|                 verbose_name="modified", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="storage_type", | ||||
|             field=models.CharField( | ||||
|                 choices=[ | ||||
|                     ("unencrypted", "Unencrypted"), | ||||
|                     ("gpg", "Encrypted with GNU Privacy Guard"), | ||||
|                 ], | ||||
|                 default="unencrypted", | ||||
|                 editable=False, | ||||
|                 max_length=11, | ||||
|                 verbose_name="storage type", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="tags", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 related_name="documents", | ||||
|                 to="documents.tag", | ||||
|                 verbose_name="tags", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="title", | ||||
|             field=models.CharField( | ||||
|                 blank=True, | ||||
|                 db_index=True, | ||||
|                 max_length=128, | ||||
|                 verbose_name="title", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="documenttype", | ||||
|             name="is_insensitive", | ||||
|             field=models.BooleanField(default=True, verbose_name="is insensitive"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="documenttype", | ||||
|             name="match", | ||||
|             field=models.CharField(blank=True, max_length=256, verbose_name="match"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="documenttype", | ||||
|             name="matching_algorithm", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (1, "Any word"), | ||||
|                     (2, "All words"), | ||||
|                     (3, "Exact match"), | ||||
|                     (4, "Regular expression"), | ||||
|                     (5, "Fuzzy word"), | ||||
|                     (6, "Automatic"), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 verbose_name="matching algorithm", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="documenttype", | ||||
|             name="name", | ||||
|             field=models.CharField(max_length=128, unique=True, verbose_name="name"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="log", | ||||
|             name="created", | ||||
|             field=models.DateTimeField(auto_now_add=True, verbose_name="created"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="log", | ||||
|             name="group", | ||||
|             field=models.UUIDField(blank=True, null=True, verbose_name="group"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="log", | ||||
|             name="level", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (10, "debug"), | ||||
|                     (20, "information"), | ||||
|                     (30, "warning"), | ||||
|                     (40, "error"), | ||||
|                     (50, "critical"), | ||||
|                 ], | ||||
|                 default=20, | ||||
|                 verbose_name="level", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="log", | ||||
|             name="message", | ||||
|             field=models.TextField(verbose_name="message"), | ||||
|         ), | ||||
|         migrations.CreateModel( | ||||
|             name="SavedViewFilterRule", | ||||
|             fields=[ | ||||
|                 ( | ||||
|                     "id", | ||||
|                     models.AutoField( | ||||
|                         auto_created=True, | ||||
|                         primary_key=True, | ||||
|                         serialize=False, | ||||
|                         verbose_name="ID", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "rule_type", | ||||
|                     models.PositiveIntegerField( | ||||
|                         choices=[ | ||||
|                             (0, "title contains"), | ||||
|                             (1, "content contains"), | ||||
|                             (2, "ASN is"), | ||||
|                             (3, "correspondent is"), | ||||
|                             (4, "document type is"), | ||||
|                             (5, "is in inbox"), | ||||
|                             (6, "has tag"), | ||||
|                             (7, "has any tag"), | ||||
|                             (8, "created before"), | ||||
|                             (9, "created after"), | ||||
|                             (10, "created year is"), | ||||
|                             (11, "created month is"), | ||||
|                             (12, "created day is"), | ||||
|                             (13, "added before"), | ||||
|                             (14, "added after"), | ||||
|                             (15, "modified before"), | ||||
|                             (16, "modified after"), | ||||
|                             (17, "does not have tag"), | ||||
|                         ], | ||||
|                         verbose_name="rule type", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "value", | ||||
|                     models.CharField( | ||||
|                         blank=True, | ||||
|                         max_length=128, | ||||
|                         null=True, | ||||
|                         verbose_name="value", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "saved_view", | ||||
|                     models.ForeignKey( | ||||
|                         on_delete=django.db.models.deletion.CASCADE, | ||||
|                         related_name="filter_rules", | ||||
|                         to="documents.savedview", | ||||
|                         verbose_name="saved view", | ||||
|                     ), | ||||
|                 ), | ||||
|             ], | ||||
|             options={ | ||||
|                 "verbose_name": "filter rule", | ||||
|                 "verbose_name_plural": "filter rules", | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="tag", | ||||
|             name="colour", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (1, "#a6cee3"), | ||||
|                     (2, "#1f78b4"), | ||||
|                     (3, "#b2df8a"), | ||||
|                     (4, "#33a02c"), | ||||
|                     (5, "#fb9a99"), | ||||
|                     (6, "#e31a1c"), | ||||
|                     (7, "#fdbf6f"), | ||||
|                     (8, "#ff7f00"), | ||||
|                     (9, "#cab2d6"), | ||||
|                     (10, "#6a3d9a"), | ||||
|                     (11, "#b15928"), | ||||
|                     (12, "#000000"), | ||||
|                     (13, "#cccccc"), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 verbose_name="color", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="tag", | ||||
|             name="is_inbox_tag", | ||||
|             field=models.BooleanField( | ||||
|                 default=False, | ||||
|                 help_text="Marks this tag as an inbox tag: All newly consumed documents will be tagged with inbox tags.", | ||||
|                 verbose_name="is inbox tag", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="tag", | ||||
|             name="is_insensitive", | ||||
|             field=models.BooleanField(default=True, verbose_name="is insensitive"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="tag", | ||||
|             name="match", | ||||
|             field=models.CharField(blank=True, max_length=256, verbose_name="match"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="tag", | ||||
|             name="matching_algorithm", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (1, "Any word"), | ||||
|                     (2, "All words"), | ||||
|                     (3, "Exact match"), | ||||
|                     (4, "Regular expression"), | ||||
|                     (5, "Fuzzy word"), | ||||
|                     (6, "Automatic"), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 verbose_name="matching algorithm", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="tag", | ||||
|             name="name", | ||||
|             field=models.CharField(max_length=128, unique=True, verbose_name="name"), | ||||
|         ), | ||||
|     ] | ||||
| @@ -0,0 +1,190 @@ | ||||
| # Generated by Django 4.2.13 on 2024-06-28 18:09 | ||||
|  | ||||
| import django.db.models.deletion | ||||
| from django.conf import settings | ||||
| from django.db import migrations | ||||
| from django.db import models | ||||
|  | ||||
|  | ||||
| class Migration(migrations.Migration): | ||||
|     replaces = [ | ||||
|         ("documents", "1016_auto_20210317_1351"), | ||||
|         ("documents", "1017_alter_savedviewfilterrule_rule_type"), | ||||
|         ("documents", "1018_alter_savedviewfilterrule_value"), | ||||
|         ("documents", "1019_uisettings"), | ||||
|         ("documents", "1019_storagepath_document_storage_path"), | ||||
|         ("documents", "1020_merge_20220518_1839"), | ||||
|     ] | ||||
|  | ||||
|     dependencies = [ | ||||
|         migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||||
|         ("documents", "1015_remove_null_characters"), | ||||
|     ] | ||||
|  | ||||
|     operations = [ | ||||
|         migrations.AlterField( | ||||
|             model_name="savedview", | ||||
|             name="sort_field", | ||||
|             field=models.CharField( | ||||
|                 blank=True, | ||||
|                 max_length=128, | ||||
|                 null=True, | ||||
|                 verbose_name="sort field", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="savedviewfilterrule", | ||||
|             name="rule_type", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (0, "title contains"), | ||||
|                     (1, "content contains"), | ||||
|                     (2, "ASN is"), | ||||
|                     (3, "correspondent is"), | ||||
|                     (4, "document type is"), | ||||
|                     (5, "is in inbox"), | ||||
|                     (6, "has tag"), | ||||
|                     (7, "has any tag"), | ||||
|                     (8, "created before"), | ||||
|                     (9, "created after"), | ||||
|                     (10, "created year is"), | ||||
|                     (11, "created month is"), | ||||
|                     (12, "created day is"), | ||||
|                     (13, "added before"), | ||||
|                     (14, "added after"), | ||||
|                     (15, "modified before"), | ||||
|                     (16, "modified after"), | ||||
|                     (17, "does not have tag"), | ||||
|                     (18, "does not have ASN"), | ||||
|                     (19, "title or content contains"), | ||||
|                     (20, "fulltext query"), | ||||
|                     (21, "more like this"), | ||||
|                 ], | ||||
|                 verbose_name="rule type", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="savedviewfilterrule", | ||||
|             name="rule_type", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (0, "title contains"), | ||||
|                     (1, "content contains"), | ||||
|                     (2, "ASN is"), | ||||
|                     (3, "correspondent is"), | ||||
|                     (4, "document type is"), | ||||
|                     (5, "is in inbox"), | ||||
|                     (6, "has tag"), | ||||
|                     (7, "has any tag"), | ||||
|                     (8, "created before"), | ||||
|                     (9, "created after"), | ||||
|                     (10, "created year is"), | ||||
|                     (11, "created month is"), | ||||
|                     (12, "created day is"), | ||||
|                     (13, "added before"), | ||||
|                     (14, "added after"), | ||||
|                     (15, "modified before"), | ||||
|                     (16, "modified after"), | ||||
|                     (17, "does not have tag"), | ||||
|                     (18, "does not have ASN"), | ||||
|                     (19, "title or content contains"), | ||||
|                     (20, "fulltext query"), | ||||
|                     (21, "more like this"), | ||||
|                     (22, "has tags in"), | ||||
|                 ], | ||||
|                 verbose_name="rule type", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="savedviewfilterrule", | ||||
|             name="value", | ||||
|             field=models.CharField( | ||||
|                 blank=True, | ||||
|                 max_length=255, | ||||
|                 null=True, | ||||
|                 verbose_name="value", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.CreateModel( | ||||
|             name="UiSettings", | ||||
|             fields=[ | ||||
|                 ( | ||||
|                     "id", | ||||
|                     models.AutoField( | ||||
|                         auto_created=True, | ||||
|                         primary_key=True, | ||||
|                         serialize=False, | ||||
|                         verbose_name="ID", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ("settings", models.JSONField(null=True)), | ||||
|                 ( | ||||
|                     "user", | ||||
|                     models.OneToOneField( | ||||
|                         on_delete=django.db.models.deletion.CASCADE, | ||||
|                         related_name="ui_settings", | ||||
|                         to=settings.AUTH_USER_MODEL, | ||||
|                     ), | ||||
|                 ), | ||||
|             ], | ||||
|         ), | ||||
|         migrations.CreateModel( | ||||
|             name="StoragePath", | ||||
|             fields=[ | ||||
|                 ( | ||||
|                     "id", | ||||
|                     models.AutoField( | ||||
|                         auto_created=True, | ||||
|                         primary_key=True, | ||||
|                         serialize=False, | ||||
|                         verbose_name="ID", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "name", | ||||
|                     models.CharField(max_length=128, unique=True, verbose_name="name"), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "match", | ||||
|                     models.CharField(blank=True, max_length=256, verbose_name="match"), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "matching_algorithm", | ||||
|                     models.PositiveIntegerField( | ||||
|                         choices=[ | ||||
|                             (1, "Any word"), | ||||
|                             (2, "All words"), | ||||
|                             (3, "Exact match"), | ||||
|                             (4, "Regular expression"), | ||||
|                             (5, "Fuzzy word"), | ||||
|                             (6, "Automatic"), | ||||
|                         ], | ||||
|                         default=1, | ||||
|                         verbose_name="matching algorithm", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "is_insensitive", | ||||
|                     models.BooleanField(default=True, verbose_name="is insensitive"), | ||||
|                 ), | ||||
|                 ("path", models.CharField(max_length=512, verbose_name="path")), | ||||
|             ], | ||||
|             options={ | ||||
|                 "verbose_name": "storage path", | ||||
|                 "verbose_name_plural": "storage paths", | ||||
|                 "ordering": ("name",), | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="document", | ||||
|             name="storage_path", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 related_name="documents", | ||||
|                 to="documents.storagepath", | ||||
|                 verbose_name="storage path", | ||||
|             ), | ||||
|         ), | ||||
|     ] | ||||
| @@ -0,0 +1,668 @@ | ||||
| # Generated by Django 4.2.13 on 2024-06-28 18:10 | ||||
|  | ||||
| import django.core.validators | ||||
| import django.db.models.deletion | ||||
| import django.utils.timezone | ||||
| from django.conf import settings | ||||
| from django.db import migrations | ||||
| from django.db import models | ||||
|  | ||||
|  | ||||
| class Migration(migrations.Migration): | ||||
|     replaces = [ | ||||
|         ("documents", "1022_paperlesstask"), | ||||
|         ("documents", "1023_add_comments"), | ||||
|         ("documents", "1024_document_original_filename"), | ||||
|         ("documents", "1025_alter_savedviewfilterrule_rule_type"), | ||||
|         ("documents", "1026_transition_to_celery"), | ||||
|         ("documents", "1027_remove_paperlesstask_attempted_task_and_more"), | ||||
|         ("documents", "1028_remove_paperlesstask_task_args_and_more"), | ||||
|         ("documents", "1029_alter_document_archive_serial_number"), | ||||
|         ("documents", "1030_alter_paperlesstask_task_file_name"), | ||||
|         ("documents", "1031_remove_savedview_user_correspondent_owner_and_more"), | ||||
|         ("documents", "1032_alter_correspondent_matching_algorithm_and_more"), | ||||
|         ("documents", "1033_alter_documenttype_options_alter_tag_options_and_more"), | ||||
|         ("documents", "1034_alter_savedviewfilterrule_rule_type"), | ||||
|         ("documents", "1035_rename_comment_note"), | ||||
|         ("documents", "1036_alter_savedviewfilterrule_rule_type"), | ||||
|     ] | ||||
|  | ||||
|     dependencies = [ | ||||
|         migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||||
|         ("django_celery_results", "0011_taskresult_periodic_task_name"), | ||||
|         ("documents", "1021_webp_thumbnail_conversion"), | ||||
|     ] | ||||
|  | ||||
|     operations = [ | ||||
|         migrations.CreateModel( | ||||
|             name="Comment", | ||||
|             fields=[ | ||||
|                 ( | ||||
|                     "id", | ||||
|                     models.AutoField( | ||||
|                         auto_created=True, | ||||
|                         primary_key=True, | ||||
|                         serialize=False, | ||||
|                         verbose_name="ID", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "comment", | ||||
|                     models.TextField( | ||||
|                         blank=True, | ||||
|                         help_text="Comment for the document", | ||||
|                         verbose_name="content", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "created", | ||||
|                     models.DateTimeField( | ||||
|                         db_index=True, | ||||
|                         default=django.utils.timezone.now, | ||||
|                         verbose_name="created", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "document", | ||||
|                     models.ForeignKey( | ||||
|                         blank=True, | ||||
|                         null=True, | ||||
|                         on_delete=django.db.models.deletion.CASCADE, | ||||
|                         related_name="documents", | ||||
|                         to="documents.document", | ||||
|                         verbose_name="document", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "user", | ||||
|                     models.ForeignKey( | ||||
|                         blank=True, | ||||
|                         null=True, | ||||
|                         on_delete=django.db.models.deletion.SET_NULL, | ||||
|                         related_name="users", | ||||
|                         to=settings.AUTH_USER_MODEL, | ||||
|                         verbose_name="user", | ||||
|                     ), | ||||
|                 ), | ||||
|             ], | ||||
|             options={ | ||||
|                 "verbose_name": "comment", | ||||
|                 "verbose_name_plural": "comments", | ||||
|                 "ordering": ("created",), | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="document", | ||||
|             name="original_filename", | ||||
|             field=models.CharField( | ||||
|                 default=None, | ||||
|                 editable=False, | ||||
|                 help_text="The original name of the file when it was uploaded", | ||||
|                 max_length=1024, | ||||
|                 null=True, | ||||
|                 verbose_name="original filename", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="savedviewfilterrule", | ||||
|             name="rule_type", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (0, "title contains"), | ||||
|                     (1, "content contains"), | ||||
|                     (2, "ASN is"), | ||||
|                     (3, "correspondent is"), | ||||
|                     (4, "document type is"), | ||||
|                     (5, "is in inbox"), | ||||
|                     (6, "has tag"), | ||||
|                     (7, "has any tag"), | ||||
|                     (8, "created before"), | ||||
|                     (9, "created after"), | ||||
|                     (10, "created year is"), | ||||
|                     (11, "created month is"), | ||||
|                     (12, "created day is"), | ||||
|                     (13, "added before"), | ||||
|                     (14, "added after"), | ||||
|                     (15, "modified before"), | ||||
|                     (16, "modified after"), | ||||
|                     (17, "does not have tag"), | ||||
|                     (18, "does not have ASN"), | ||||
|                     (19, "title or content contains"), | ||||
|                     (20, "fulltext query"), | ||||
|                     (21, "more like this"), | ||||
|                     (22, "has tags in"), | ||||
|                     (23, "ASN greater than"), | ||||
|                     (24, "ASN less than"), | ||||
|                     (25, "storage path is"), | ||||
|                 ], | ||||
|                 verbose_name="rule type", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.CreateModel( | ||||
|             name="PaperlessTask", | ||||
|             fields=[ | ||||
|                 ( | ||||
|                     "id", | ||||
|                     models.AutoField( | ||||
|                         auto_created=True, | ||||
|                         primary_key=True, | ||||
|                         serialize=False, | ||||
|                         verbose_name="ID", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ("task_id", models.CharField(max_length=128)), | ||||
|                 ("acknowledged", models.BooleanField(default=False)), | ||||
|                 ( | ||||
|                     "attempted_task", | ||||
|                     models.OneToOneField( | ||||
|                         blank=True, | ||||
|                         null=True, | ||||
|                         on_delete=django.db.models.deletion.CASCADE, | ||||
|                         related_name="attempted_task", | ||||
|                         to="django_celery_results.taskresult", | ||||
|                     ), | ||||
|                 ), | ||||
|             ], | ||||
|         ), | ||||
|         migrations.RunSQL( | ||||
|             sql="DROP TABLE IF EXISTS django_q_ormq", | ||||
|             reverse_sql="", | ||||
|         ), | ||||
|         migrations.RunSQL( | ||||
|             sql="DROP TABLE IF EXISTS django_q_schedule", | ||||
|             reverse_sql="", | ||||
|         ), | ||||
|         migrations.RunSQL( | ||||
|             sql="DROP TABLE IF EXISTS django_q_task", | ||||
|             reverse_sql="", | ||||
|         ), | ||||
|         migrations.RemoveField( | ||||
|             model_name="paperlesstask", | ||||
|             name="attempted_task", | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="paperlesstask", | ||||
|             name="date_created", | ||||
|             field=models.DateTimeField( | ||||
|                 default=django.utils.timezone.now, | ||||
|                 help_text="Datetime field when the task result was created in UTC", | ||||
|                 null=True, | ||||
|                 verbose_name="Created DateTime", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="paperlesstask", | ||||
|             name="date_done", | ||||
|             field=models.DateTimeField( | ||||
|                 default=None, | ||||
|                 help_text="Datetime field when the task was completed in UTC", | ||||
|                 null=True, | ||||
|                 verbose_name="Completed DateTime", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="paperlesstask", | ||||
|             name="date_started", | ||||
|             field=models.DateTimeField( | ||||
|                 default=None, | ||||
|                 help_text="Datetime field when the task was started in UTC", | ||||
|                 null=True, | ||||
|                 verbose_name="Started DateTime", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="paperlesstask", | ||||
|             name="result", | ||||
|             field=models.TextField( | ||||
|                 default=None, | ||||
|                 help_text="The data returned by the task", | ||||
|                 null=True, | ||||
|                 verbose_name="Result Data", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="paperlesstask", | ||||
|             name="status", | ||||
|             field=models.CharField( | ||||
|                 choices=[ | ||||
|                     ("FAILURE", "FAILURE"), | ||||
|                     ("PENDING", "PENDING"), | ||||
|                     ("RECEIVED", "RECEIVED"), | ||||
|                     ("RETRY", "RETRY"), | ||||
|                     ("REVOKED", "REVOKED"), | ||||
|                     ("STARTED", "STARTED"), | ||||
|                     ("SUCCESS", "SUCCESS"), | ||||
|                 ], | ||||
|                 default="PENDING", | ||||
|                 help_text="Current state of the task being run", | ||||
|                 max_length=30, | ||||
|                 verbose_name="Task State", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="paperlesstask", | ||||
|             name="task_name", | ||||
|             field=models.CharField( | ||||
|                 help_text="Name of the Task which was run", | ||||
|                 max_length=255, | ||||
|                 null=True, | ||||
|                 verbose_name="Task Name", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="paperlesstask", | ||||
|             name="acknowledged", | ||||
|             field=models.BooleanField( | ||||
|                 default=False, | ||||
|                 help_text="If the task is acknowledged via the frontend or API", | ||||
|                 verbose_name="Acknowledged", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="paperlesstask", | ||||
|             name="task_id", | ||||
|             field=models.CharField( | ||||
|                 help_text="Celery ID for the Task that was run", | ||||
|                 max_length=255, | ||||
|                 unique=True, | ||||
|                 verbose_name="Task ID", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="document", | ||||
|             name="archive_serial_number", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 blank=True, | ||||
|                 db_index=True, | ||||
|                 help_text="The position of this document in your physical document archive.", | ||||
|                 null=True, | ||||
|                 unique=True, | ||||
|                 validators=[ | ||||
|                     django.core.validators.MaxValueValidator(4294967295), | ||||
|                     django.core.validators.MinValueValidator(0), | ||||
|                 ], | ||||
|                 verbose_name="archive serial number", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="paperlesstask", | ||||
|             name="task_file_name", | ||||
|             field=models.CharField( | ||||
|                 help_text="Name of the file which the Task was run for", | ||||
|                 max_length=255, | ||||
|                 null=True, | ||||
|                 verbose_name="Task Filename", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.RenameField( | ||||
|             model_name="savedview", | ||||
|             old_name="user", | ||||
|             new_name="owner", | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="savedview", | ||||
|             name="owner", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 to=settings.AUTH_USER_MODEL, | ||||
|                 verbose_name="owner", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="correspondent", | ||||
|             name="owner", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 to=settings.AUTH_USER_MODEL, | ||||
|                 verbose_name="owner", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="document", | ||||
|             name="owner", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 to=settings.AUTH_USER_MODEL, | ||||
|                 verbose_name="owner", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="documenttype", | ||||
|             name="owner", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 to=settings.AUTH_USER_MODEL, | ||||
|                 verbose_name="owner", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="storagepath", | ||||
|             name="owner", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 to=settings.AUTH_USER_MODEL, | ||||
|                 verbose_name="owner", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="tag", | ||||
|             name="owner", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 to=settings.AUTH_USER_MODEL, | ||||
|                 verbose_name="owner", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="correspondent", | ||||
|             name="matching_algorithm", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (0, "None"), | ||||
|                     (1, "Any word"), | ||||
|                     (2, "All words"), | ||||
|                     (3, "Exact match"), | ||||
|                     (4, "Regular expression"), | ||||
|                     (5, "Fuzzy word"), | ||||
|                     (6, "Automatic"), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 verbose_name="matching algorithm", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="documenttype", | ||||
|             name="matching_algorithm", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (0, "None"), | ||||
|                     (1, "Any word"), | ||||
|                     (2, "All words"), | ||||
|                     (3, "Exact match"), | ||||
|                     (4, "Regular expression"), | ||||
|                     (5, "Fuzzy word"), | ||||
|                     (6, "Automatic"), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 verbose_name="matching algorithm", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="storagepath", | ||||
|             name="matching_algorithm", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (0, "None"), | ||||
|                     (1, "Any word"), | ||||
|                     (2, "All words"), | ||||
|                     (3, "Exact match"), | ||||
|                     (4, "Regular expression"), | ||||
|                     (5, "Fuzzy word"), | ||||
|                     (6, "Automatic"), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 verbose_name="matching algorithm", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="tag", | ||||
|             name="matching_algorithm", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (0, "None"), | ||||
|                     (1, "Any word"), | ||||
|                     (2, "All words"), | ||||
|                     (3, "Exact match"), | ||||
|                     (4, "Regular expression"), | ||||
|                     (5, "Fuzzy word"), | ||||
|                     (6, "Automatic"), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 verbose_name="matching algorithm", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterModelOptions( | ||||
|             name="documenttype", | ||||
|             options={ | ||||
|                 "ordering": ("name",), | ||||
|                 "verbose_name": "document type", | ||||
|                 "verbose_name_plural": "document types", | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AlterModelOptions( | ||||
|             name="tag", | ||||
|             options={ | ||||
|                 "ordering": ("name",), | ||||
|                 "verbose_name": "tag", | ||||
|                 "verbose_name_plural": "tags", | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="correspondent", | ||||
|             name="name", | ||||
|             field=models.CharField(max_length=128, verbose_name="name"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="documenttype", | ||||
|             name="name", | ||||
|             field=models.CharField(max_length=128, verbose_name="name"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="storagepath", | ||||
|             name="name", | ||||
|             field=models.CharField(max_length=128, verbose_name="name"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="tag", | ||||
|             name="name", | ||||
|             field=models.CharField(max_length=128, verbose_name="name"), | ||||
|         ), | ||||
|         migrations.AddConstraint( | ||||
|             model_name="correspondent", | ||||
|             constraint=models.UniqueConstraint( | ||||
|                 fields=("name", "owner"), | ||||
|                 name="documents_correspondent_unique_name_owner", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddConstraint( | ||||
|             model_name="correspondent", | ||||
|             constraint=models.UniqueConstraint( | ||||
|                 condition=models.Q(("owner__isnull", True)), | ||||
|                 fields=("name",), | ||||
|                 name="documents_correspondent_name_uniq", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddConstraint( | ||||
|             model_name="documenttype", | ||||
|             constraint=models.UniqueConstraint( | ||||
|                 fields=("name", "owner"), | ||||
|                 name="documents_documenttype_unique_name_owner", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddConstraint( | ||||
|             model_name="documenttype", | ||||
|             constraint=models.UniqueConstraint( | ||||
|                 condition=models.Q(("owner__isnull", True)), | ||||
|                 fields=("name",), | ||||
|                 name="documents_documenttype_name_uniq", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddConstraint( | ||||
|             model_name="storagepath", | ||||
|             constraint=models.UniqueConstraint( | ||||
|                 fields=("name", "owner"), | ||||
|                 name="documents_storagepath_unique_name_owner", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddConstraint( | ||||
|             model_name="storagepath", | ||||
|             constraint=models.UniqueConstraint( | ||||
|                 condition=models.Q(("owner__isnull", True)), | ||||
|                 fields=("name",), | ||||
|                 name="documents_storagepath_name_uniq", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddConstraint( | ||||
|             model_name="tag", | ||||
|             constraint=models.UniqueConstraint( | ||||
|                 fields=("name", "owner"), | ||||
|                 name="documents_tag_unique_name_owner", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddConstraint( | ||||
|             model_name="tag", | ||||
|             constraint=models.UniqueConstraint( | ||||
|                 condition=models.Q(("owner__isnull", True)), | ||||
|                 fields=("name",), | ||||
|                 name="documents_tag_name_uniq", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="savedviewfilterrule", | ||||
|             name="rule_type", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (0, "title contains"), | ||||
|                     (1, "content contains"), | ||||
|                     (2, "ASN is"), | ||||
|                     (3, "correspondent is"), | ||||
|                     (4, "document type is"), | ||||
|                     (5, "is in inbox"), | ||||
|                     (6, "has tag"), | ||||
|                     (7, "has any tag"), | ||||
|                     (8, "created before"), | ||||
|                     (9, "created after"), | ||||
|                     (10, "created year is"), | ||||
|                     (11, "created month is"), | ||||
|                     (12, "created day is"), | ||||
|                     (13, "added before"), | ||||
|                     (14, "added after"), | ||||
|                     (15, "modified before"), | ||||
|                     (16, "modified after"), | ||||
|                     (17, "does not have tag"), | ||||
|                     (18, "does not have ASN"), | ||||
|                     (19, "title or content contains"), | ||||
|                     (20, "fulltext query"), | ||||
|                     (21, "more like this"), | ||||
|                     (22, "has tags in"), | ||||
|                     (23, "ASN greater than"), | ||||
|                     (24, "ASN less than"), | ||||
|                     (25, "storage path is"), | ||||
|                     (26, "has correspondent in"), | ||||
|                     (27, "does not have correspondent in"), | ||||
|                     (28, "has document type in"), | ||||
|                     (29, "does not have document type in"), | ||||
|                     (30, "has storage path in"), | ||||
|                     (31, "does not have storage path in"), | ||||
|                 ], | ||||
|                 verbose_name="rule type", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.RenameModel( | ||||
|             old_name="Comment", | ||||
|             new_name="Note", | ||||
|         ), | ||||
|         migrations.RenameField( | ||||
|             model_name="note", | ||||
|             old_name="comment", | ||||
|             new_name="note", | ||||
|         ), | ||||
|         migrations.AlterModelOptions( | ||||
|             name="note", | ||||
|             options={ | ||||
|                 "ordering": ("created",), | ||||
|                 "verbose_name": "note", | ||||
|                 "verbose_name_plural": "notes", | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="note", | ||||
|             name="document", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.CASCADE, | ||||
|                 related_name="notes", | ||||
|                 to="documents.document", | ||||
|                 verbose_name="document", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="note", | ||||
|             name="note", | ||||
|             field=models.TextField( | ||||
|                 blank=True, | ||||
|                 help_text="Note for the document", | ||||
|                 verbose_name="content", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="note", | ||||
|             name="user", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 related_name="notes", | ||||
|                 to=settings.AUTH_USER_MODEL, | ||||
|                 verbose_name="user", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="savedviewfilterrule", | ||||
|             name="rule_type", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (0, "title contains"), | ||||
|                     (1, "content contains"), | ||||
|                     (2, "ASN is"), | ||||
|                     (3, "correspondent is"), | ||||
|                     (4, "document type is"), | ||||
|                     (5, "is in inbox"), | ||||
|                     (6, "has tag"), | ||||
|                     (7, "has any tag"), | ||||
|                     (8, "created before"), | ||||
|                     (9, "created after"), | ||||
|                     (10, "created year is"), | ||||
|                     (11, "created month is"), | ||||
|                     (12, "created day is"), | ||||
|                     (13, "added before"), | ||||
|                     (14, "added after"), | ||||
|                     (15, "modified before"), | ||||
|                     (16, "modified after"), | ||||
|                     (17, "does not have tag"), | ||||
|                     (18, "does not have ASN"), | ||||
|                     (19, "title or content contains"), | ||||
|                     (20, "fulltext query"), | ||||
|                     (21, "more like this"), | ||||
|                     (22, "has tags in"), | ||||
|                     (23, "ASN greater than"), | ||||
|                     (24, "ASN less than"), | ||||
|                     (25, "storage path is"), | ||||
|                     (26, "has correspondent in"), | ||||
|                     (27, "does not have correspondent in"), | ||||
|                     (28, "has document type in"), | ||||
|                     (29, "does not have document type in"), | ||||
|                     (30, "has storage path in"), | ||||
|                     (31, "does not have storage path in"), | ||||
|                     (32, "owner is"), | ||||
|                     (33, "has owner in"), | ||||
|                     (34, "does not have owner"), | ||||
|                     (35, "does not have owner in"), | ||||
|                 ], | ||||
|                 verbose_name="rule type", | ||||
|             ), | ||||
|         ), | ||||
|     ] | ||||
| @@ -0,0 +1,331 @@ | ||||
| # Generated by Django 4.2.13 on 2024-06-28 19:39 | ||||
|  | ||||
| import django.core.validators | ||||
| import django.db.models.deletion | ||||
| from django.conf import settings | ||||
| from django.db import migrations | ||||
| from django.db import models | ||||
|  | ||||
|  | ||||
| class Migration(migrations.Migration): | ||||
|     replaces = [ | ||||
|         ("documents", "1045_alter_customfieldinstance_value_monetary"), | ||||
|         ("documents", "1046_workflowaction_remove_all_correspondents_and_more"), | ||||
|         ("documents", "1047_savedview_display_mode_and_more"), | ||||
|         ("documents", "1048_alter_savedviewfilterrule_rule_type"), | ||||
|         ("documents", "1049_document_deleted_at_document_restored_at"), | ||||
|     ] | ||||
|  | ||||
|     dependencies = [ | ||||
|         ("documents", "1044_workflow_workflowaction_workflowtrigger_and_more"), | ||||
|         migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||||
|         ("auth", "0012_alter_user_first_name_max_length"), | ||||
|     ] | ||||
|  | ||||
|     operations = [ | ||||
|         migrations.AlterField( | ||||
|             model_name="customfieldinstance", | ||||
|             name="value_monetary", | ||||
|             field=models.CharField(max_length=128, null=True), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_all_correspondents", | ||||
|             field=models.BooleanField( | ||||
|                 default=False, | ||||
|                 verbose_name="remove all correspondents", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_all_custom_fields", | ||||
|             field=models.BooleanField( | ||||
|                 default=False, | ||||
|                 verbose_name="remove all custom fields", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_all_document_types", | ||||
|             field=models.BooleanField( | ||||
|                 default=False, | ||||
|                 verbose_name="remove all document types", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_all_owners", | ||||
|             field=models.BooleanField(default=False, verbose_name="remove all owners"), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_all_permissions", | ||||
|             field=models.BooleanField( | ||||
|                 default=False, | ||||
|                 verbose_name="remove all permissions", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_all_storage_paths", | ||||
|             field=models.BooleanField( | ||||
|                 default=False, | ||||
|                 verbose_name="remove all storage paths", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_all_tags", | ||||
|             field=models.BooleanField(default=False, verbose_name="remove all tags"), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_change_groups", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 related_name="+", | ||||
|                 to="auth.group", | ||||
|                 verbose_name="remove change permissions for these groups", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_change_users", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 related_name="+", | ||||
|                 to=settings.AUTH_USER_MODEL, | ||||
|                 verbose_name="remove change permissions for these users", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_correspondents", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 related_name="+", | ||||
|                 to="documents.correspondent", | ||||
|                 verbose_name="remove these correspondent(s)", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_custom_fields", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 related_name="+", | ||||
|                 to="documents.customfield", | ||||
|                 verbose_name="remove these custom fields", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_document_types", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 related_name="+", | ||||
|                 to="documents.documenttype", | ||||
|                 verbose_name="remove these document type(s)", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_owners", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 related_name="+", | ||||
|                 to=settings.AUTH_USER_MODEL, | ||||
|                 verbose_name="remove these owner(s)", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_storage_paths", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 related_name="+", | ||||
|                 to="documents.storagepath", | ||||
|                 verbose_name="remove these storage path(s)", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_tags", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 related_name="+", | ||||
|                 to="documents.tag", | ||||
|                 verbose_name="remove these tag(s)", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_view_groups", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 related_name="+", | ||||
|                 to="auth.group", | ||||
|                 verbose_name="remove view permissions for these groups", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="workflowaction", | ||||
|             name="remove_view_users", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 related_name="+", | ||||
|                 to=settings.AUTH_USER_MODEL, | ||||
|                 verbose_name="remove view permissions for these users", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="workflowaction", | ||||
|             name="assign_correspondent", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 related_name="+", | ||||
|                 to="documents.correspondent", | ||||
|                 verbose_name="assign this correspondent", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="workflowaction", | ||||
|             name="assign_document_type", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 related_name="+", | ||||
|                 to="documents.documenttype", | ||||
|                 verbose_name="assign this document type", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="workflowaction", | ||||
|             name="assign_storage_path", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 related_name="+", | ||||
|                 to="documents.storagepath", | ||||
|                 verbose_name="assign this storage path", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="workflowaction", | ||||
|             name="assign_tags", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 related_name="+", | ||||
|                 to="documents.tag", | ||||
|                 verbose_name="assign this tag", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="workflowaction", | ||||
|             name="type", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[(1, "Assignment"), (2, "Removal")], | ||||
|                 default=1, | ||||
|                 verbose_name="Workflow Action Type", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="savedview", | ||||
|             name="display_mode", | ||||
|             field=models.CharField( | ||||
|                 blank=True, | ||||
|                 choices=[ | ||||
|                     ("table", "Table"), | ||||
|                     ("smallCards", "Small Cards"), | ||||
|                     ("largeCards", "Large Cards"), | ||||
|                 ], | ||||
|                 max_length=128, | ||||
|                 null=True, | ||||
|                 verbose_name="View display mode", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="savedview", | ||||
|             name="page_size", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 validators=[django.core.validators.MinValueValidator(1)], | ||||
|                 verbose_name="View page size", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="savedview", | ||||
|             name="display_fields", | ||||
|             field=models.JSONField( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 verbose_name="Document display fields", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="savedviewfilterrule", | ||||
|             name="rule_type", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (0, "title contains"), | ||||
|                     (1, "content contains"), | ||||
|                     (2, "ASN is"), | ||||
|                     (3, "correspondent is"), | ||||
|                     (4, "document type is"), | ||||
|                     (5, "is in inbox"), | ||||
|                     (6, "has tag"), | ||||
|                     (7, "has any tag"), | ||||
|                     (8, "created before"), | ||||
|                     (9, "created after"), | ||||
|                     (10, "created year is"), | ||||
|                     (11, "created month is"), | ||||
|                     (12, "created day is"), | ||||
|                     (13, "added before"), | ||||
|                     (14, "added after"), | ||||
|                     (15, "modified before"), | ||||
|                     (16, "modified after"), | ||||
|                     (17, "does not have tag"), | ||||
|                     (18, "does not have ASN"), | ||||
|                     (19, "title or content contains"), | ||||
|                     (20, "fulltext query"), | ||||
|                     (21, "more like this"), | ||||
|                     (22, "has tags in"), | ||||
|                     (23, "ASN greater than"), | ||||
|                     (24, "ASN less than"), | ||||
|                     (25, "storage path is"), | ||||
|                     (26, "has correspondent in"), | ||||
|                     (27, "does not have correspondent in"), | ||||
|                     (28, "has document type in"), | ||||
|                     (29, "does not have document type in"), | ||||
|                     (30, "has storage path in"), | ||||
|                     (31, "does not have storage path in"), | ||||
|                     (32, "owner is"), | ||||
|                     (33, "has owner in"), | ||||
|                     (34, "does not have owner"), | ||||
|                     (35, "does not have owner in"), | ||||
|                     (36, "has custom field value"), | ||||
|                     (37, "is shared by me"), | ||||
|                     (38, "has custom fields"), | ||||
|                     (39, "has custom field in"), | ||||
|                     (40, "does not have custom field in"), | ||||
|                     (41, "does not have custom field"), | ||||
|                 ], | ||||
|                 verbose_name="rule type", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="document", | ||||
|             name="deleted_at", | ||||
|             field=models.DateTimeField(blank=True, null=True), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="document", | ||||
|             name="restored_at", | ||||
|             field=models.DateTimeField(blank=True, null=True), | ||||
|         ), | ||||
|     ] | ||||
| @@ -120,7 +120,7 @@ simple_png2 = os.path.join(os.path.dirname(__file__), "examples", "no-text.png") | ||||
|  | ||||
| @override_settings(FILENAME_FORMAT="") | ||||
| class TestMigrateArchiveFiles(DirectoriesMixin, FileSystemAssertsMixin, TestMigrations): | ||||
|     migrate_from = "1011_auto_20210101_2340" | ||||
|     migrate_from = "1006_auto_20201208_2209_squashed_1011_auto_20210101_2340" | ||||
|     migrate_to = "1012_fix_archive_files" | ||||
|  | ||||
|     def setUpBeforeMigration(self, apps): | ||||
| @@ -287,7 +287,7 @@ def fake_parse_wrapper(parser, path, mime_type, file_name): | ||||
|  | ||||
| @override_settings(FILENAME_FORMAT="") | ||||
| class TestMigrateArchiveFilesErrors(DirectoriesMixin, TestMigrations): | ||||
|     migrate_from = "1011_auto_20210101_2340" | ||||
|     migrate_from = "1006_auto_20201208_2209_squashed_1011_auto_20210101_2340" | ||||
|     migrate_to = "1012_fix_archive_files" | ||||
|     auto_migrate = False | ||||
|  | ||||
| @@ -458,7 +458,7 @@ class TestMigrateArchiveFilesBackwards( | ||||
|     TestMigrations, | ||||
| ): | ||||
|     migrate_from = "1012_fix_archive_files" | ||||
|     migrate_to = "1011_auto_20210101_2340" | ||||
|     migrate_to = "1006_auto_20201208_2209_squashed_1011_auto_20210101_2340" | ||||
|  | ||||
|     def setUpBeforeMigration(self, apps): | ||||
|         Document = apps.get_model("documents", "Document") | ||||
| @@ -521,7 +521,7 @@ class TestMigrateArchiveFilesBackwardsWithFilenameFormat( | ||||
| @override_settings(FILENAME_FORMAT="") | ||||
| class TestMigrateArchiveFilesBackwardsErrors(DirectoriesMixin, TestMigrations): | ||||
|     migrate_from = "1012_fix_archive_files" | ||||
|     migrate_to = "1011_auto_20210101_2340" | ||||
|     migrate_to = "1006_auto_20201208_2209_squashed_1011_auto_20210101_2340" | ||||
|     auto_migrate = False | ||||
|  | ||||
|     def test_filename_clash(self): | ||||
|   | ||||
| @@ -23,7 +23,9 @@ migration_1037_obj = importlib.import_module( | ||||
| ) | ||||
| @mock.patch(f"{__name__}.migration_1037_obj.run_convert") | ||||
| class TestMigrateToEncrytpedWebPThumbnails(TestMigrations): | ||||
|     migrate_from = "1036_alter_savedviewfilterrule_rule_type" | ||||
|     migrate_from = ( | ||||
|         "1022_paperlesstask_squashed_1036_alter_savedviewfilterrule_rule_type" | ||||
|     ) | ||||
|     migrate_to = "1037_webp_encrypted_thumbnail_conversion" | ||||
|     auto_migrate = False | ||||
|  | ||||
|   | ||||
| @@ -22,7 +22,7 @@ migration_1021_obj = importlib.import_module( | ||||
| ) | ||||
| @mock.patch(f"{__name__}.migration_1021_obj.run_convert") | ||||
| class TestMigrateWebPThumbnails(TestMigrations): | ||||
|     migrate_from = "1020_merge_20220518_1839" | ||||
|     migrate_from = "1016_auto_20210317_1351_squashed_1020_merge_20220518_1839" | ||||
|     migrate_to = "1021_webp_thumbnail_conversion" | ||||
|     auto_migrate = False | ||||
|  | ||||
|   | ||||
| @@ -0,0 +1,477 @@ | ||||
| # Generated by Django 4.2.13 on 2024-06-28 17:46 | ||||
|  | ||||
| import django.db.migrations.operations.special | ||||
| import django.db.models.deletion | ||||
| from django.db import migrations | ||||
| from django.db import models | ||||
|  | ||||
|  | ||||
| class Migration(migrations.Migration): | ||||
|     replaces = [ | ||||
|         ("paperless_mail", "0001_initial"), | ||||
|         ("paperless_mail", "0002_auto_20201117_1334"), | ||||
|         ("paperless_mail", "0003_auto_20201118_1940"), | ||||
|         ("paperless_mail", "0004_mailrule_order"), | ||||
|         ("paperless_mail", "0005_help_texts"), | ||||
|         ("paperless_mail", "0006_auto_20210101_2340"), | ||||
|         ("paperless_mail", "0007_auto_20210106_0138"), | ||||
|         ("paperless_mail", "0008_auto_20210516_0940"), | ||||
|         ("paperless_mail", "0009_mailrule_assign_tags"), | ||||
|     ] | ||||
|  | ||||
|     dependencies = [ | ||||
|         ("documents", "1002_auto_20201111_1105"), | ||||
|         ("documents", "1011_auto_20210101_2340"), | ||||
|     ] | ||||
|  | ||||
|     operations = [ | ||||
|         migrations.CreateModel( | ||||
|             name="MailAccount", | ||||
|             fields=[ | ||||
|                 ( | ||||
|                     "id", | ||||
|                     models.AutoField( | ||||
|                         auto_created=True, | ||||
|                         primary_key=True, | ||||
|                         serialize=False, | ||||
|                         verbose_name="ID", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ("name", models.CharField(max_length=256, unique=True)), | ||||
|                 ("imap_server", models.CharField(max_length=256)), | ||||
|                 ("imap_port", models.IntegerField(blank=True, null=True)), | ||||
|                 ( | ||||
|                     "imap_security", | ||||
|                     models.PositiveIntegerField( | ||||
|                         choices=[ | ||||
|                             (1, "No encryption"), | ||||
|                             (2, "Use SSL"), | ||||
|                             (3, "Use STARTTLS"), | ||||
|                         ], | ||||
|                         default=2, | ||||
|                     ), | ||||
|                 ), | ||||
|                 ("username", models.CharField(max_length=256)), | ||||
|                 ("password", models.CharField(max_length=256)), | ||||
|             ], | ||||
|         ), | ||||
|         migrations.CreateModel( | ||||
|             name="MailRule", | ||||
|             fields=[ | ||||
|                 ( | ||||
|                     "id", | ||||
|                     models.AutoField( | ||||
|                         auto_created=True, | ||||
|                         primary_key=True, | ||||
|                         serialize=False, | ||||
|                         verbose_name="ID", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ("name", models.CharField(max_length=256)), | ||||
|                 ("folder", models.CharField(default="INBOX", max_length=256)), | ||||
|                 ( | ||||
|                     "filter_from", | ||||
|                     models.CharField(blank=True, max_length=256, null=True), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "filter_subject", | ||||
|                     models.CharField(blank=True, max_length=256, null=True), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "filter_body", | ||||
|                     models.CharField(blank=True, max_length=256, null=True), | ||||
|                 ), | ||||
|                 ("maximum_age", models.PositiveIntegerField(default=30)), | ||||
|                 ( | ||||
|                     "action", | ||||
|                     models.PositiveIntegerField( | ||||
|                         choices=[ | ||||
|                             (1, "Delete"), | ||||
|                             (2, "Move to specified folder"), | ||||
|                             (3, "Mark as read, don't process read mails"), | ||||
|                             (4, "Flag the mail, don't process flagged mails"), | ||||
|                         ], | ||||
|                         default=3, | ||||
|                         help_text="The action applied to the mail. This action is only performed when documents were consumed from the mail. Mails without attachments will remain entirely untouched.", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "action_parameter", | ||||
|                     models.CharField( | ||||
|                         blank=True, | ||||
|                         help_text="Additional parameter for the action selected above, i.e., the target folder of the move to folder action.", | ||||
|                         max_length=256, | ||||
|                         null=True, | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "assign_title_from", | ||||
|                     models.PositiveIntegerField( | ||||
|                         choices=[ | ||||
|                             (1, "Use subject as title"), | ||||
|                             (2, "Use attachment filename as title"), | ||||
|                         ], | ||||
|                         default=1, | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "assign_correspondent_from", | ||||
|                     models.PositiveIntegerField( | ||||
|                         choices=[ | ||||
|                             (1, "Do not assign a correspondent"), | ||||
|                             (2, "Use mail address"), | ||||
|                             (3, "Use name (or mail address if not available)"), | ||||
|                             (4, "Use correspondent selected below"), | ||||
|                         ], | ||||
|                         default=1, | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "account", | ||||
|                     models.ForeignKey( | ||||
|                         on_delete=django.db.models.deletion.CASCADE, | ||||
|                         related_name="rules", | ||||
|                         to="paperless_mail.mailaccount", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "assign_correspondent", | ||||
|                     models.ForeignKey( | ||||
|                         blank=True, | ||||
|                         null=True, | ||||
|                         on_delete=django.db.models.deletion.SET_NULL, | ||||
|                         to="documents.correspondent", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "assign_document_type", | ||||
|                     models.ForeignKey( | ||||
|                         blank=True, | ||||
|                         null=True, | ||||
|                         on_delete=django.db.models.deletion.SET_NULL, | ||||
|                         to="documents.documenttype", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "assign_tag", | ||||
|                     models.ForeignKey( | ||||
|                         blank=True, | ||||
|                         null=True, | ||||
|                         on_delete=django.db.models.deletion.SET_NULL, | ||||
|                         to="documents.tag", | ||||
|                     ), | ||||
|                 ), | ||||
|             ], | ||||
|         ), | ||||
|         migrations.RunPython( | ||||
|             code=django.db.migrations.operations.special.RunPython.noop, | ||||
|             reverse_code=django.db.migrations.operations.special.RunPython.noop, | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailaccount", | ||||
|             name="imap_port", | ||||
|             field=models.IntegerField( | ||||
|                 blank=True, | ||||
|                 help_text="This is usually 143 for unencrypted and STARTTLS connections, and 993 for SSL connections.", | ||||
|                 null=True, | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="name", | ||||
|             field=models.CharField(max_length=256, unique=True), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="mailrule", | ||||
|             name="order", | ||||
|             field=models.IntegerField(default=0), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="action", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (3, "Mark as read, don't process read mails"), | ||||
|                     (4, "Flag the mail, don't process flagged mails"), | ||||
|                     (2, "Move to specified folder"), | ||||
|                     (1, "Delete"), | ||||
|                 ], | ||||
|                 default=3, | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="maximum_age", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 default=30, | ||||
|                 help_text="Specified in days.", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterModelOptions( | ||||
|             name="mailaccount", | ||||
|             options={ | ||||
|                 "verbose_name": "mail account", | ||||
|                 "verbose_name_plural": "mail accounts", | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AlterModelOptions( | ||||
|             name="mailrule", | ||||
|             options={"verbose_name": "mail rule", "verbose_name_plural": "mail rules"}, | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailaccount", | ||||
|             name="imap_port", | ||||
|             field=models.IntegerField( | ||||
|                 blank=True, | ||||
|                 help_text="This is usually 143 for unencrypted and STARTTLS connections, and 993 for SSL connections.", | ||||
|                 null=True, | ||||
|                 verbose_name="IMAP port", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailaccount", | ||||
|             name="imap_security", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[(1, "No encryption"), (2, "Use SSL"), (3, "Use STARTTLS")], | ||||
|                 default=2, | ||||
|                 verbose_name="IMAP security", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailaccount", | ||||
|             name="imap_server", | ||||
|             field=models.CharField(max_length=256, verbose_name="IMAP server"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailaccount", | ||||
|             name="name", | ||||
|             field=models.CharField(max_length=256, unique=True, verbose_name="name"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailaccount", | ||||
|             name="password", | ||||
|             field=models.CharField(max_length=256, verbose_name="password"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailaccount", | ||||
|             name="username", | ||||
|             field=models.CharField(max_length=256, verbose_name="username"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="account", | ||||
|             field=models.ForeignKey( | ||||
|                 on_delete=django.db.models.deletion.CASCADE, | ||||
|                 related_name="rules", | ||||
|                 to="paperless_mail.mailaccount", | ||||
|                 verbose_name="account", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="action", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (3, "Mark as read, don't process read mails"), | ||||
|                     (4, "Flag the mail, don't process flagged mails"), | ||||
|                     (2, "Move to specified folder"), | ||||
|                     (1, "Delete"), | ||||
|                 ], | ||||
|                 default=3, | ||||
|                 verbose_name="action", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="action_parameter", | ||||
|             field=models.CharField( | ||||
|                 blank=True, | ||||
|                 help_text="Additional parameter for the action selected above, i.e., the target folder of the move to folder action.", | ||||
|                 max_length=256, | ||||
|                 null=True, | ||||
|                 verbose_name="action parameter", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="assign_correspondent", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 to="documents.correspondent", | ||||
|                 verbose_name="assign this correspondent", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="assign_correspondent_from", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (1, "Do not assign a correspondent"), | ||||
|                     (2, "Use mail address"), | ||||
|                     (3, "Use name (or mail address if not available)"), | ||||
|                     (4, "Use correspondent selected below"), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 verbose_name="assign correspondent from", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="assign_document_type", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 to="documents.documenttype", | ||||
|                 verbose_name="assign this document type", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="assign_tag", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 to="documents.tag", | ||||
|                 verbose_name="assign this tag", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="assign_title_from", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (1, "Use subject as title"), | ||||
|                     (2, "Use attachment filename as title"), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 verbose_name="assign title from", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="filter_body", | ||||
|             field=models.CharField( | ||||
|                 blank=True, | ||||
|                 max_length=256, | ||||
|                 null=True, | ||||
|                 verbose_name="filter body", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="filter_from", | ||||
|             field=models.CharField( | ||||
|                 blank=True, | ||||
|                 max_length=256, | ||||
|                 null=True, | ||||
|                 verbose_name="filter from", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="filter_subject", | ||||
|             field=models.CharField( | ||||
|                 blank=True, | ||||
|                 max_length=256, | ||||
|                 null=True, | ||||
|                 verbose_name="filter subject", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="folder", | ||||
|             field=models.CharField( | ||||
|                 default="INBOX", | ||||
|                 max_length=256, | ||||
|                 verbose_name="folder", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="maximum_age", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 default=30, | ||||
|                 help_text="Specified in days.", | ||||
|                 verbose_name="maximum age", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="name", | ||||
|             field=models.CharField(max_length=256, unique=True, verbose_name="name"), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="order", | ||||
|             field=models.IntegerField(default=0, verbose_name="order"), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="mailrule", | ||||
|             name="attachment_type", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (1, "Only process attachments."), | ||||
|                     (2, "Process all files, including 'inline' attachments."), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 help_text="Inline attachments include embedded images, so it's best to combine this option with a filename filter.", | ||||
|                 verbose_name="attachment type", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="mailrule", | ||||
|             name="filter_attachment_filename", | ||||
|             field=models.CharField( | ||||
|                 blank=True, | ||||
|                 help_text="Only consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive.", | ||||
|                 max_length=256, | ||||
|                 null=True, | ||||
|                 verbose_name="filter attachment filename", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="mailaccount", | ||||
|             name="character_set", | ||||
|             field=models.CharField( | ||||
|                 default="UTF-8", | ||||
|                 help_text="The character set to use when communicating with the mail server, such as 'UTF-8' or 'US-ASCII'.", | ||||
|                 max_length=256, | ||||
|                 verbose_name="character set", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="action_parameter", | ||||
|             field=models.CharField( | ||||
|                 blank=True, | ||||
|                 help_text="Additional parameter for the action selected above, i.e., the target folder of the move to folder action. Subfolders must be separated by dots.", | ||||
|                 max_length=256, | ||||
|                 null=True, | ||||
|                 verbose_name="action parameter", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="folder", | ||||
|             field=models.CharField( | ||||
|                 default="INBOX", | ||||
|                 help_text="Subfolders must be separated by dots.", | ||||
|                 max_length=256, | ||||
|                 verbose_name="folder", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="mailrule", | ||||
|             name="assign_tags", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 related_name="mail_rules_multi", | ||||
|                 to="documents.tag", | ||||
|                 verbose_name="assign this tag", | ||||
|             ), | ||||
|         ), | ||||
|     ] | ||||
| @@ -0,0 +1,321 @@ | ||||
| # Generated by Django 4.2.13 on 2024-06-28 17:47 | ||||
|  | ||||
| import django.db.models.deletion | ||||
| import django.utils.timezone | ||||
| from django.conf import settings | ||||
| from django.db import migrations | ||||
| from django.db import models | ||||
|  | ||||
|  | ||||
| class Migration(migrations.Migration): | ||||
|     replaces = [ | ||||
|         ("paperless_mail", "0011_remove_mailrule_assign_tag"), | ||||
|         ("paperless_mail", "0012_alter_mailrule_assign_tags"), | ||||
|         ("paperless_mail", "0009_alter_mailrule_action_alter_mailrule_folder"), | ||||
|         ("paperless_mail", "0013_merge_20220412_1051"), | ||||
|         ("paperless_mail", "0014_alter_mailrule_action"), | ||||
|         ("paperless_mail", "0015_alter_mailrule_action"), | ||||
|         ("paperless_mail", "0016_mailrule_consumption_scope"), | ||||
|         ("paperless_mail", "0017_mailaccount_owner_mailrule_owner"), | ||||
|         ("paperless_mail", "0018_processedmail"), | ||||
|         ("paperless_mail", "0019_mailrule_filter_to"), | ||||
|         ("paperless_mail", "0020_mailaccount_is_token"), | ||||
|         ("paperless_mail", "0021_alter_mailaccount_password"), | ||||
|         ("paperless_mail", "0022_mailrule_assign_owner_from_rule_and_more"), | ||||
|         ("paperless_mail", "0023_remove_mailrule_filter_attachment_filename_and_more"), | ||||
|         ("paperless_mail", "0024_alter_mailrule_name_and_more"), | ||||
|     ] | ||||
|  | ||||
|     dependencies = [ | ||||
|         migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||||
|         ("paperless_mail", "0010_auto_20220311_1602"), | ||||
|     ] | ||||
|  | ||||
|     operations = [ | ||||
|         migrations.RemoveField( | ||||
|             model_name="mailrule", | ||||
|             name="assign_tag", | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="assign_tags", | ||||
|             field=models.ManyToManyField( | ||||
|                 blank=True, | ||||
|                 to="documents.tag", | ||||
|                 verbose_name="assign this tag", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="action", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (1, "Mark as read, don't process read mails"), | ||||
|                     (2, "Flag the mail, don't process flagged mails"), | ||||
|                     (3, "Move to specified folder"), | ||||
|                     (4, "Delete"), | ||||
|                 ], | ||||
|                 default=3, | ||||
|                 verbose_name="action", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="folder", | ||||
|             field=models.CharField( | ||||
|                 default="INBOX", | ||||
|                 help_text="Subfolders must be separated by a delimiter, often a dot ('.') or slash ('/'), but it varies by mail server.", | ||||
|                 max_length=256, | ||||
|                 verbose_name="folder", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="action", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (1, "Delete"), | ||||
|                     (2, "Move to specified folder"), | ||||
|                     (3, "Mark as read, don't process read mails"), | ||||
|                     (4, "Flag the mail, don't process flagged mails"), | ||||
|                 ], | ||||
|                 default=3, | ||||
|                 verbose_name="action", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="action", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (1, "Delete"), | ||||
|                     (2, "Move to specified folder"), | ||||
|                     (3, "Mark as read, don't process read mails"), | ||||
|                     (4, "Flag the mail, don't process flagged mails"), | ||||
|                     (5, "Tag the mail with specified tag, don't process tagged mails"), | ||||
|                 ], | ||||
|                 default=3, | ||||
|                 verbose_name="action", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="mailrule", | ||||
|             name="consumption_scope", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (1, "Only process attachments."), | ||||
|                     ( | ||||
|                         2, | ||||
|                         "Process full Mail (with embedded attachments in file) as .eml", | ||||
|                     ), | ||||
|                     ( | ||||
|                         3, | ||||
|                         "Process full Mail (with embedded attachments in file) as .eml + process attachments as separate documents", | ||||
|                     ), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 verbose_name="consumption scope", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="mailaccount", | ||||
|             name="owner", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 to=settings.AUTH_USER_MODEL, | ||||
|                 verbose_name="owner", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="mailrule", | ||||
|             name="owner", | ||||
|             field=models.ForeignKey( | ||||
|                 blank=True, | ||||
|                 null=True, | ||||
|                 on_delete=django.db.models.deletion.SET_NULL, | ||||
|                 to=settings.AUTH_USER_MODEL, | ||||
|                 verbose_name="owner", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.CreateModel( | ||||
|             name="ProcessedMail", | ||||
|             fields=[ | ||||
|                 ( | ||||
|                     "id", | ||||
|                     models.AutoField( | ||||
|                         auto_created=True, | ||||
|                         primary_key=True, | ||||
|                         serialize=False, | ||||
|                         verbose_name="ID", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "folder", | ||||
|                     models.CharField( | ||||
|                         editable=False, | ||||
|                         max_length=256, | ||||
|                         verbose_name="folder", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "uid", | ||||
|                     models.CharField( | ||||
|                         editable=False, | ||||
|                         max_length=256, | ||||
|                         verbose_name="uid", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "subject", | ||||
|                     models.CharField( | ||||
|                         editable=False, | ||||
|                         max_length=256, | ||||
|                         verbose_name="subject", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "received", | ||||
|                     models.DateTimeField(editable=False, verbose_name="received"), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "processed", | ||||
|                     models.DateTimeField( | ||||
|                         default=django.utils.timezone.now, | ||||
|                         editable=False, | ||||
|                         verbose_name="processed", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "status", | ||||
|                     models.CharField( | ||||
|                         editable=False, | ||||
|                         max_length=256, | ||||
|                         verbose_name="status", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "error", | ||||
|                     models.TextField( | ||||
|                         blank=True, | ||||
|                         editable=False, | ||||
|                         null=True, | ||||
|                         verbose_name="error", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "owner", | ||||
|                     models.ForeignKey( | ||||
|                         blank=True, | ||||
|                         null=True, | ||||
|                         on_delete=django.db.models.deletion.SET_NULL, | ||||
|                         to=settings.AUTH_USER_MODEL, | ||||
|                         verbose_name="owner", | ||||
|                     ), | ||||
|                 ), | ||||
|                 ( | ||||
|                     "rule", | ||||
|                     models.ForeignKey( | ||||
|                         editable=False, | ||||
|                         on_delete=django.db.models.deletion.CASCADE, | ||||
|                         to="paperless_mail.mailrule", | ||||
|                     ), | ||||
|                 ), | ||||
|             ], | ||||
|             options={ | ||||
|                 "abstract": False, | ||||
|             }, | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="mailrule", | ||||
|             name="filter_to", | ||||
|             field=models.CharField( | ||||
|                 blank=True, | ||||
|                 max_length=256, | ||||
|                 null=True, | ||||
|                 verbose_name="filter to", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="mailaccount", | ||||
|             name="is_token", | ||||
|             field=models.BooleanField( | ||||
|                 default=False, | ||||
|                 verbose_name="Is token authentication", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailaccount", | ||||
|             name="password", | ||||
|             field=models.CharField(max_length=2048, verbose_name="password"), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="mailrule", | ||||
|             name="assign_owner_from_rule", | ||||
|             field=models.BooleanField( | ||||
|                 default=True, | ||||
|                 verbose_name="Assign the rule owner to documents", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="assign_title_from", | ||||
|             field=models.PositiveIntegerField( | ||||
|                 choices=[ | ||||
|                     (1, "Use subject as title"), | ||||
|                     (2, "Use attachment filename as title"), | ||||
|                     (3, "Do not assign title from rule"), | ||||
|                 ], | ||||
|                 default=1, | ||||
|                 verbose_name="assign title from", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.RenameField( | ||||
|             model_name="mailrule", | ||||
|             old_name="filter_attachment_filename", | ||||
|             new_name="filter_attachment_filename_include", | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name="mailrule", | ||||
|             name="filter_attachment_filename_exclude", | ||||
|             field=models.CharField( | ||||
|                 blank=True, | ||||
|                 help_text="Do not consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive.", | ||||
|                 max_length=256, | ||||
|                 null=True, | ||||
|                 verbose_name="filter attachment filename exclusive", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="filter_attachment_filename_include", | ||||
|             field=models.CharField( | ||||
|                 blank=True, | ||||
|                 help_text="Only consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive.", | ||||
|                 max_length=256, | ||||
|                 null=True, | ||||
|                 verbose_name="filter attachment filename inclusive", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name="mailrule", | ||||
|             name="name", | ||||
|             field=models.CharField(max_length=256, verbose_name="name"), | ||||
|         ), | ||||
|         migrations.AddConstraint( | ||||
|             model_name="mailrule", | ||||
|             constraint=models.UniqueConstraint( | ||||
|                 fields=("name", "owner"), | ||||
|                 name="paperless_mail_mailrule_unique_name_owner", | ||||
|             ), | ||||
|         ), | ||||
|         migrations.AddConstraint( | ||||
|             model_name="mailrule", | ||||
|             constraint=models.UniqueConstraint( | ||||
|                 condition=models.Q(("owner__isnull", True)), | ||||
|                 fields=("name",), | ||||
|                 name="paperless_mail_mailrule_name_unique", | ||||
|             ), | ||||
|         ), | ||||
|     ] | ||||
		Reference in New Issue
	
	Block a user
	 Trenton H
					Trenton H