Coverage for src/backend/InvenTree/users/migrations/0014_userprofile.py: 85%
11 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 17:47 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 17:47 +0000
1# Generated by Django 4.2.19 on 2025-03-03 00:43
3from django.conf import settings
4from django.db import migrations, models
5import django.db.models.deletion
7def backfill_user_profiles(apps, schema_editor):
8 User = apps.get_model('auth', 'User')
9 UserProfile = apps.get_model('users', 'UserProfile')
10 for user in User.objects.all(): 10 ↛ 11line 10 didn't jump to line 11 because the loop on line 10 never started
11 UserProfile.objects.get_or_create(user=user)
14class Migration(migrations.Migration):
16 dependencies = [
17 migrations.swappable_dependency(settings.AUTH_USER_MODEL),
18 ("auth", "0012_alter_user_first_name_max_length"),
19 ("users", "0013_migrate_mfa_20240408_1659"),
20 ]
22 operations = [
23 migrations.CreateModel(
24 name="UserProfile",
25 fields=[
26 (
27 "id",
28 models.AutoField(
29 auto_created=True,
30 primary_key=True,
31 serialize=False,
32 verbose_name="ID",
33 ),
34 ),
35 (
36 "metadata",
37 models.JSONField(
38 blank=True,
39 help_text="JSON metadata field, for use by external plugins",
40 null=True,
41 verbose_name="Plugin Metadata",
42 ),
43 ),
44 (
45 "language",
46 models.CharField(
47 blank=True,
48 help_text="Preferred language for the user",
49 max_length=10,
50 null=True,
51 verbose_name="Language",
52 ),
53 ),
54 (
55 "theme",
56 models.JSONField(
57 blank=True,
58 help_text="Settings for the web UI as JSON - do not edit manually!",
59 null=True,
60 verbose_name="Theme",
61 ),
62 ),
63 (
64 "widgets",
65 models.JSONField(
66 blank=True,
67 help_text="Settings for the dashboard widgets as JSON - do not edit manually!",
68 null=True,
69 verbose_name="Widgets",
70 ),
71 ),
72 (
73 "displayname",
74 models.CharField(
75 blank=True,
76 help_text="Chosen display name for the user",
77 max_length=255,
78 null=True,
79 verbose_name="Display Name",
80 ),
81 ),
82 (
83 "position",
84 models.CharField(
85 blank=True,
86 help_text="Main job title or position",
87 max_length=255,
88 null=True,
89 verbose_name="Position",
90 ),
91 ),
92 (
93 "status",
94 models.CharField(
95 blank=True,
96 help_text="User status message",
97 max_length=2000,
98 null=True,
99 verbose_name="Status",
100 ),
101 ),
102 (
103 "location",
104 models.CharField(
105 blank=True,
106 help_text="User location information",
107 max_length=2000,
108 null=True,
109 verbose_name="Location",
110 ),
111 ),
112 (
113 "active",
114 models.BooleanField(
115 default=True,
116 help_text="User is actively using the system",
117 verbose_name="Active",
118 ),
119 ),
120 (
121 "contact",
122 models.CharField(
123 blank=True,
124 help_text="Preferred contact information for the user",
125 max_length=255,
126 null=True,
127 verbose_name="Contact",
128 ),
129 ),
130 (
131 "type",
132 models.CharField(
133 choices=[
134 ("bot", "Bot"),
135 ("internal", "Internal"),
136 ("external", "External"),
137 ("guest", "Guest"),
138 ],
139 default="internal",
140 help_text="Which type of user is this?",
141 max_length=10,
142 verbose_name="Type",
143 ),
144 ),
145 (
146 "organisation",
147 models.CharField(
148 blank=True,
149 help_text="Users primary organisation/affiliation",
150 max_length=255,
151 null=True,
152 verbose_name="Organisation",
153 ),
154 ),
155 (
156 "primary_group",
157 models.ForeignKey(
158 blank=True,
159 help_text="Primary group for the user",
160 null=True,
161 on_delete=django.db.models.deletion.SET_NULL,
162 related_name="primary_users",
163 to="auth.group",
164 verbose_name="Primary Group",
165 ),
166 ),
167 (
168 "user",
169 models.OneToOneField(
170 on_delete=django.db.models.deletion.CASCADE,
171 related_name="profile",
172 to=settings.AUTH_USER_MODEL,
173 verbose_name="User",
174 ),
175 ),
176 ],
177 options={
178 "abstract": False,
179 },
180 ),
181 migrations.RunPython(backfill_user_profiles),
182 ]