PyInventory 0.19.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. PyInventory-0.19.0.dist-info/AUTHORS +14 -0
  2. PyInventory-0.19.0.dist-info/LICENSE +674 -0
  3. PyInventory-0.19.0.dist-info/METADATA +347 -0
  4. PyInventory-0.19.0.dist-info/RECORD +101 -0
  5. PyInventory-0.19.0.dist-info/WHEEL +5 -0
  6. PyInventory-0.19.0.dist-info/entry_points.txt +2 -0
  7. PyInventory-0.19.0.dist-info/top_level.txt +2 -0
  8. inventory/__init__.py +7 -0
  9. inventory/admin/__init__.py +3 -0
  10. inventory/admin/base.py +104 -0
  11. inventory/admin/item.py +169 -0
  12. inventory/admin/location.py +78 -0
  13. inventory/admin/memo.py +76 -0
  14. inventory/admin/tagulous_fix.py +45 -0
  15. inventory/apps.py +18 -0
  16. inventory/ckeditor_upload.py +15 -0
  17. inventory/context_processors.py +5 -0
  18. inventory/forms.py +36 -0
  19. inventory/locale/ca/LC_MESSAGES/django.mo +0 -0
  20. inventory/locale/ca/LC_MESSAGES/django.po +297 -0
  21. inventory/locale/de/LC_MESSAGES/django.mo +0 -0
  22. inventory/locale/de/LC_MESSAGES/django.po +294 -0
  23. inventory/locale/en/LC_MESSAGES/django.mo +0 -0
  24. inventory/locale/en/LC_MESSAGES/django.po +294 -0
  25. inventory/locale/es/LC_MESSAGES/django.mo +0 -0
  26. inventory/locale/es/LC_MESSAGES/django.po +297 -0
  27. inventory/management/__init__.py +0 -0
  28. inventory/management/commands/__init__.py +0 -0
  29. inventory/management/commands/seed_data.py +135 -0
  30. inventory/management/commands/tree.py +62 -0
  31. inventory/middlewares.py +21 -0
  32. inventory/migrations/0001_initial.py +596 -0
  33. inventory/migrations/0002_auto_20201017_2211.py +87 -0
  34. inventory/migrations/0003_auto_20201024_1830.py +23 -0
  35. inventory/migrations/0004_item_user_images.py +129 -0
  36. inventory/migrations/0005_serve_uploads_by_django_tools.py +77 -0
  37. inventory/migrations/0006_refactor_image_model.py +46 -0
  38. inventory/migrations/0007_add_file_attachment.py +128 -0
  39. inventory/migrations/0008_last_check_datetime.py +23 -0
  40. inventory/migrations/0009_add_memo.py +517 -0
  41. inventory/migrations/0010_version_protect_models.py +37 -0
  42. inventory/migrations/0011_parent_tree1.py +97 -0
  43. inventory/migrations/0012_parent_tree2.py +20 -0
  44. inventory/migrations/0013_alter_itemmodel_location.py +26 -0
  45. inventory/migrations/__init__.py +0 -0
  46. inventory/models/__init__.py +3 -0
  47. inventory/models/base.py +239 -0
  48. inventory/models/item.py +228 -0
  49. inventory/models/links.py +104 -0
  50. inventory/models/location.py +24 -0
  51. inventory/models/memo.py +109 -0
  52. inventory/parent_tree.py +71 -0
  53. inventory/permissions.py +60 -0
  54. inventory/request_dict.py +16 -0
  55. inventory/signals.py +15 -0
  56. inventory/string_utils.py +15 -0
  57. inventory/templates/admin/item/related_items.html +18 -0
  58. inventory/templates/admin/location/items.html +18 -0
  59. inventory/tests/__init__.py +0 -0
  60. inventory/tests/fixtures/__init__.py +0 -0
  61. inventory/tests/fixtures/users.py +11 -0
  62. inventory/tests/test_admin_location.py +34 -0
  63. inventory/tests/test_admin_location_empty_change_list_1.snapshot.html +84 -0
  64. inventory/tests/test_item_images.py +76 -0
  65. inventory/tests/test_link_model.py +72 -0
  66. inventory/tests/test_management_command_seed_data.py +49 -0
  67. inventory/tests/test_management_command_tree.py +27 -0
  68. inventory/tests/test_parent_tree.py +40 -0
  69. inventory/tests/test_parent_tree_model.py +139 -0
  70. inventory_project/__init__.py +12 -0
  71. inventory_project/__main__.py +17 -0
  72. inventory_project/manage.py +41 -0
  73. inventory_project/middlewares.py +23 -0
  74. inventory_project/publish.py +21 -0
  75. inventory_project/settings/__init__.py +0 -0
  76. inventory_project/settings/local.py +74 -0
  77. inventory_project/settings/prod.py +393 -0
  78. inventory_project/settings/tests.py +45 -0
  79. inventory_project/templates/admin/base_site.html +22 -0
  80. inventory_project/templates/admin/login.html +32 -0
  81. inventory_project/tests/__init__.py +0 -0
  82. inventory_project/tests/fixtures.py +40 -0
  83. inventory_project/tests/mocks.py +15 -0
  84. inventory_project/tests/playwright_utils.py +22 -0
  85. inventory_project/tests/test_admin.py +15 -0
  86. inventory_project/tests/test_admin_item.py +240 -0
  87. inventory_project/tests/test_admin_item_auto_group_items_1.snapshot.html +349 -0
  88. inventory_project/tests/test_admin_item_auto_group_items_2.snapshot.html +232 -0
  89. inventory_project/tests/test_admin_item_login_1.snapshot.html +40 -0
  90. inventory_project/tests/test_admin_item_normal_user_create_minimal_item_1.snapshot.html +637 -0
  91. inventory_project/tests/test_admin_item_normal_user_create_minimal_item_2.snapshot.html +930 -0
  92. inventory_project/tests/test_admin_memo.py +153 -0
  93. inventory_project/tests/test_admin_memo_normal_user_create_minimal_item_1.snapshot.html +365 -0
  94. inventory_project/tests/test_command_shell_help_django4.2.3.snapshot.txt +60 -0
  95. inventory_project/tests/test_inventory_commands.py +26 -0
  96. inventory_project/tests/test_migrations.py +22 -0
  97. inventory_project/tests/test_models_item.py +24 -0
  98. inventory_project/tests/test_playwright_admin.py +157 -0
  99. inventory_project/tests/test_project_setup.py +102 -0
  100. inventory_project/urls.py +21 -0
  101. inventory_project/wsgi.py +9 -0
@@ -0,0 +1,23 @@
1
+ # Generated by Django 2.2.16 on 2020-10-24 16:30
2
+
3
+ import ckeditor_uploader.fields
4
+ from django.db import migrations
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ ('inventory', '0002_auto_20201017_2211'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='locationmodel',
15
+ name='description',
16
+ field=ckeditor_uploader.fields.RichTextUploadingField(
17
+ blank=True,
18
+ help_text='LocationModel.description.help_text',
19
+ null=True,
20
+ verbose_name='LocationModel.description.verbose_name',
21
+ ),
22
+ ),
23
+ ]
@@ -0,0 +1,129 @@
1
+ # Generated by Django 2.2.17 on 2020-11-15 11:09
2
+
3
+ import uuid
4
+
5
+ import django.db.models.deletion
6
+ import tagulous.models.fields
7
+ import tagulous.models.models
8
+ from django.conf import settings
9
+ from django.db import migrations, models
10
+
11
+ import inventory.models.item
12
+
13
+
14
+ class Migration(migrations.Migration):
15
+ dependencies = [
16
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
17
+ ('inventory', '0003_auto_20201024_1830'),
18
+ ]
19
+
20
+ operations = [
21
+ migrations.CreateModel(
22
+ name='Tagulous_ItemImageModel_tags',
23
+ fields=[
24
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
25
+ ('name', models.CharField(max_length=255, unique=True)),
26
+ ('slug', models.SlugField()),
27
+ (
28
+ 'count',
29
+ models.IntegerField(default=0, help_text='Internal counter of how many times this tag is in use'),
30
+ ),
31
+ (
32
+ 'protected',
33
+ models.BooleanField(default=False, help_text='Will not be deleted when the count reaches 0'),
34
+ ),
35
+ ],
36
+ options={
37
+ 'ordering': ('name',),
38
+ 'abstract': False,
39
+ 'unique_together': {('slug',)},
40
+ },
41
+ bases=(tagulous.models.models.BaseTagModel, models.Model),
42
+ ),
43
+ migrations.CreateModel(
44
+ name='ItemImageModel',
45
+ fields=[
46
+ (
47
+ 'create_dt',
48
+ models.DateTimeField(
49
+ blank=True,
50
+ editable=False,
51
+ help_text='ModelTimetrackingMixin.create_dt.help_text',
52
+ null=True,
53
+ verbose_name='ModelTimetrackingMixin.create_dt.verbose_name',
54
+ ),
55
+ ),
56
+ (
57
+ 'update_dt',
58
+ models.DateTimeField(
59
+ blank=True,
60
+ editable=False,
61
+ help_text='ModelTimetrackingMixin.update_dt.help_text',
62
+ null=True,
63
+ verbose_name='ModelTimetrackingMixin.update_dt.verbose_name',
64
+ ),
65
+ ),
66
+ (
67
+ 'id',
68
+ models.UUIDField(
69
+ default=uuid.uuid4,
70
+ editable=False,
71
+ help_text='BaseModel.id.help_text',
72
+ primary_key=True,
73
+ serialize=False,
74
+ verbose_name='BaseModel.id.verbose_name',
75
+ ),
76
+ ),
77
+ (
78
+ 'image',
79
+ models.ImageField(
80
+ help_text='ItemImageModel.image.help_text',
81
+ upload_to=inventory.models.item.user_directory_path,
82
+ verbose_name='ItemImageModel.image.verbose_name',
83
+ ),
84
+ ),
85
+ (
86
+ 'name',
87
+ models.CharField(
88
+ blank=True,
89
+ help_text='ItemImageModel.name.help_text',
90
+ max_length=255,
91
+ null=True,
92
+ verbose_name='ItemImageModel.name.verbose_name',
93
+ ),
94
+ ),
95
+ ('position', models.PositiveSmallIntegerField(default=0)),
96
+ ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inventory.ItemModel')),
97
+ (
98
+ 'tags',
99
+ tagulous.models.fields.TagField(
100
+ _set_tag_meta=True,
101
+ blank=True,
102
+ case_sensitive=False,
103
+ force_lowercase=False,
104
+ help_text='BaseModel.tags.help_text',
105
+ max_count=10,
106
+ space_delimiter=False,
107
+ to='inventory.Tagulous_ItemImageModel_tags',
108
+ verbose_name='BaseModel.tags.verbose_name',
109
+ ),
110
+ ),
111
+ (
112
+ 'user',
113
+ models.ForeignKey(
114
+ editable=False,
115
+ help_text='BaseModel.user.help_text',
116
+ on_delete=django.db.models.deletion.CASCADE,
117
+ related_name='+',
118
+ to=settings.AUTH_USER_MODEL,
119
+ verbose_name='BaseModel.user.verbose_name',
120
+ ),
121
+ ),
122
+ ],
123
+ options={
124
+ 'verbose_name': 'ItemImageModel.verbose_name',
125
+ 'verbose_name_plural': 'ItemImageModel.verbose_name_plural',
126
+ 'ordering': ('position',),
127
+ },
128
+ ),
129
+ ]
@@ -0,0 +1,77 @@
1
+ # Generated by Django 2.2.17 on 2020-12-06 14:07
2
+ import os
3
+ from pathlib import Path
4
+
5
+ from django.conf import settings
6
+ from django.db import migrations
7
+ from django.utils import timezone
8
+
9
+
10
+ class Tee:
11
+ def __init__(self, f):
12
+ self.f = f
13
+
14
+ def __enter__(self):
15
+ return self
16
+
17
+ def __call__(self, line):
18
+ if not isinstance(line, str):
19
+ line = str(line)
20
+ print(line)
21
+ self.f.write(line)
22
+ self.f.write('\n')
23
+
24
+ def __exit__(self, exc_type, exc_val, exc_tb):
25
+ pass
26
+
27
+
28
+ def forward_code(apps, schema_editor):
29
+ ItemImageModel = apps.get_model('inventory', 'ItemImageModel')
30
+ if ItemImageModel.objects.count() == 0:
31
+ # No image uploaded, yet -> nothing to do
32
+ return
33
+
34
+ print()
35
+ log_file_path = Path(settings.MEDIA_ROOT, 'migrate.log')
36
+ print('Generate log file here:', log_file_path)
37
+ with log_file_path.open('w+') as log, Tee(log) as log:
38
+ log('-' * 100)
39
+ log(timezone.now())
40
+
41
+ from django_tools.serve_media_app.models import generate_media_path
42
+
43
+ qs = ItemImageModel.objects.all()
44
+
45
+ for instance in qs:
46
+ log('_' * 100)
47
+ log(f'Migrate {instance}')
48
+ user = instance.user
49
+ image = instance.image
50
+
51
+ file_path = Path(str(image.file))
52
+ log(f'Old path: {file_path}')
53
+
54
+ media_path = generate_media_path(user, filename=file_path.name)
55
+
56
+ new_file_path = Path(settings.MEDIA_ROOT, media_path)
57
+ log(f'New path: {new_file_path}')
58
+
59
+ os.makedirs(new_file_path.parent, exist_ok=True)
60
+ os.link(file_path, new_file_path)
61
+
62
+ instance.image = media_path
63
+ instance.save(update_fields=('image',))
64
+
65
+ log('All new path created via hardlinks!')
66
+ log('Old path can be deleted.')
67
+
68
+
69
+ class Migration(migrations.Migration):
70
+ dependencies = [
71
+ ('inventory', '0004_item_user_images'),
72
+ ('serve_media_app', '0001_initial'),
73
+ ]
74
+
75
+ operations = [
76
+ migrations.RunPython(forward_code, reverse_code=migrations.RunPython.noop),
77
+ ]
@@ -0,0 +1,46 @@
1
+ # Generated by Django 2.2.20 on 2021-04-28 15:44
2
+
3
+ import tagulous.models.models
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ ('inventory', '0005_serve_uploads_by_django_tools'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='itemimagemodel',
15
+ name='name',
16
+ field=models.CharField(
17
+ blank=True,
18
+ help_text='BaseItemAttachmentModel.name.help_text',
19
+ max_length=255,
20
+ null=True,
21
+ verbose_name='BaseItemAttachmentModel.name.verbose_name',
22
+ ),
23
+ ),
24
+ migrations.CreateModel(
25
+ name='Tagulous_BaseItemAttachmentModel_tags',
26
+ fields=[
27
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
28
+ ('name', models.CharField(max_length=255, unique=True)),
29
+ ('slug', models.SlugField()),
30
+ (
31
+ 'count',
32
+ models.IntegerField(default=0, help_text='Internal counter of how many times this tag is in use'),
33
+ ),
34
+ (
35
+ 'protected',
36
+ models.BooleanField(default=False, help_text='Will not be deleted when the count reaches 0'),
37
+ ),
38
+ ],
39
+ options={
40
+ 'ordering': ('name',),
41
+ 'abstract': False,
42
+ 'unique_together': {('slug',)},
43
+ },
44
+ bases=(tagulous.models.models.BaseTagModel, models.Model),
45
+ ),
46
+ ]
@@ -0,0 +1,128 @@
1
+ # Generated by Django 2.2.20 on 2021-04-28 15:54
2
+
3
+ import uuid
4
+
5
+ import django.db.models.deletion
6
+ import django_tools.serve_media_app.models
7
+ import tagulous.models.fields
8
+ import tagulous.models.models
9
+ from django.conf import settings
10
+ from django.db import migrations, models
11
+
12
+
13
+ class Migration(migrations.Migration):
14
+ dependencies = [
15
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
16
+ ('inventory', '0006_refactor_image_model'),
17
+ ]
18
+
19
+ operations = [
20
+ migrations.CreateModel(
21
+ name='Tagulous_ItemFileModel_tags',
22
+ fields=[
23
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
24
+ ('name', models.CharField(max_length=255, unique=True)),
25
+ ('slug', models.SlugField()),
26
+ (
27
+ 'count',
28
+ models.IntegerField(default=0, help_text='Internal counter of how many times this tag is in use'),
29
+ ),
30
+ (
31
+ 'protected',
32
+ models.BooleanField(default=False, help_text='Will not be deleted when the count reaches 0'),
33
+ ),
34
+ ],
35
+ options={
36
+ 'ordering': ('name',),
37
+ 'abstract': False,
38
+ 'unique_together': {('slug',)},
39
+ },
40
+ bases=(tagulous.models.models.BaseTagModel, models.Model),
41
+ ),
42
+ migrations.CreateModel(
43
+ name='ItemFileModel',
44
+ fields=[
45
+ (
46
+ 'create_dt',
47
+ models.DateTimeField(
48
+ blank=True,
49
+ editable=False,
50
+ help_text='ModelTimetrackingMixin.create_dt.help_text',
51
+ null=True,
52
+ verbose_name='ModelTimetrackingMixin.create_dt.verbose_name',
53
+ ),
54
+ ),
55
+ (
56
+ 'update_dt',
57
+ models.DateTimeField(
58
+ blank=True,
59
+ editable=False,
60
+ help_text='ModelTimetrackingMixin.update_dt.help_text',
61
+ null=True,
62
+ verbose_name='ModelTimetrackingMixin.update_dt.verbose_name',
63
+ ),
64
+ ),
65
+ (
66
+ 'id',
67
+ models.UUIDField(
68
+ default=uuid.uuid4,
69
+ editable=False,
70
+ help_text='BaseModel.id.help_text',
71
+ primary_key=True,
72
+ serialize=False,
73
+ verbose_name='BaseModel.id.verbose_name',
74
+ ),
75
+ ),
76
+ (
77
+ 'name',
78
+ models.CharField(
79
+ blank=True,
80
+ help_text='BaseItemAttachmentModel.name.help_text',
81
+ max_length=255,
82
+ null=True,
83
+ verbose_name='BaseItemAttachmentModel.name.verbose_name',
84
+ ),
85
+ ),
86
+ ('position', models.PositiveSmallIntegerField(default=0)),
87
+ (
88
+ 'file',
89
+ models.FileField(
90
+ help_text='ItemFileModel.file.help_text',
91
+ upload_to=django_tools.serve_media_app.models.user_directory_path,
92
+ verbose_name='ItemFileModel.file.verbose_name',
93
+ ),
94
+ ),
95
+ ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inventory.ItemModel')),
96
+ (
97
+ 'tags',
98
+ tagulous.models.fields.TagField(
99
+ _set_tag_meta=True,
100
+ blank=True,
101
+ case_sensitive=False,
102
+ force_lowercase=False,
103
+ help_text='BaseModel.tags.help_text',
104
+ max_count=10,
105
+ space_delimiter=False,
106
+ to='inventory.Tagulous_ItemFileModel_tags',
107
+ verbose_name='BaseModel.tags.verbose_name',
108
+ ),
109
+ ),
110
+ (
111
+ 'user',
112
+ models.ForeignKey(
113
+ editable=False,
114
+ help_text='BaseModel.user.help_text',
115
+ on_delete=django.db.models.deletion.CASCADE,
116
+ related_name='+',
117
+ to=settings.AUTH_USER_MODEL,
118
+ verbose_name='BaseModel.user.verbose_name',
119
+ ),
120
+ ),
121
+ ],
122
+ options={
123
+ 'verbose_name': 'ItemFileModel.verbose_name',
124
+ 'verbose_name_plural': 'ItemFileModel.verbose_name_plural',
125
+ 'ordering': ('position',),
126
+ },
127
+ ),
128
+ ]
@@ -0,0 +1,23 @@
1
+ # Generated by Django 3.1.13 on 2021-10-09 14:29
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+ dependencies = [
8
+ ('inventory', '0007_add_file_attachment'),
9
+ ]
10
+
11
+ operations = [
12
+ migrations.AlterField(
13
+ model_name='itemlinkmodel',
14
+ name='last_check',
15
+ field=models.DateTimeField(
16
+ blank=True,
17
+ editable=False,
18
+ help_text='Link.url.help_text',
19
+ null=True,
20
+ verbose_name='Link.url.verbose_name',
21
+ ),
22
+ ),
23
+ ]