Coverage for modules\team\migrations\0001_initial.py: 100%
10 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-05 09:24 +0800
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-05 09:24 +0800
1# Generated by Django 5.1.15 on 2026-09-01 13:46
3import django.db.models.deletion
4import django.utils.timezone
5import secrets
6import uuid
7from django.conf import settings
8from django.db import migrations, models
11class Migration(migrations.Migration):
13 initial = True
15 dependencies = [
16 migrations.swappable_dependency(settings.AUTH_USER_MODEL),
17 ]
19 operations = [
20 migrations.CreateModel(
21 name='AttendanceLog',
22 fields=[
23 ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
24 ('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
25 ('updated_at', models.DateTimeField(auto_now=True)),
26 ('tenant_id', models.UUIDField(db_index=True, help_text='Organization / Tenant ID')),
27 ('check_in', models.DateTimeField(default=django.utils.timezone.now)),
28 ('check_out', models.DateTimeField(blank=True, null=True)),
29 ('status', models.CharField(choices=[('CLOCKED_IN', 'Clocked In'), ('CLOCKED_OUT', 'Clocked Out')], default='CLOCKED_IN', max_length=32)),
30 ('notes', models.TextField(blank=True, null=True)),
31 ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attendance_logs', to=settings.AUTH_USER_MODEL)),
32 ],
33 options={
34 'ordering': ['-check_in'],
35 },
36 ),
37 migrations.CreateModel(
38 name='Department',
39 fields=[
40 ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
41 ('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
42 ('updated_at', models.DateTimeField(auto_now=True)),
43 ('tenant_id', models.UUIDField(db_index=True, help_text='Organization / Tenant ID')),
44 ('name', models.CharField(max_length=128)),
45 ('code', models.CharField(max_length=32)),
46 ('description', models.TextField(blank=True, null=True)),
47 ('manager', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='managed_departments', to=settings.AUTH_USER_MODEL)),
48 ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sub_departments', to='team.department')),
49 ],
50 options={
51 'ordering': ['name'],
52 'unique_together': {('tenant_id', 'code')},
53 },
54 ),
55 migrations.CreateModel(
56 name='Invitation',
57 fields=[
58 ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
59 ('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
60 ('updated_at', models.DateTimeField(auto_now=True)),
61 ('tenant_id', models.UUIDField(db_index=True, help_text='Organization / Tenant ID')),
62 ('email', models.EmailField(max_length=255)),
63 ('role', models.CharField(default='MEMBER', max_length=32)),
64 ('token', models.CharField(default=secrets.token_urlsafe, max_length=64, unique=True)),
65 ('status', models.CharField(choices=[('PENDING', 'Pending'), ('ACCEPTED', 'Accepted'), ('EXPIRED', 'Expired')], default='PENDING', max_length=32)),
66 ('expires_at', models.DateTimeField()),
67 ('department', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='team.department')),
68 ('invited_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sent_invitations', to=settings.AUTH_USER_MODEL)),
69 ],
70 options={
71 'abstract': False,
72 },
73 ),
74 migrations.CreateModel(
75 name='TeamMember',
76 fields=[
77 ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
78 ('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
79 ('updated_at', models.DateTimeField(auto_now=True)),
80 ('tenant_id', models.UUIDField(db_index=True, help_text='Organization / Tenant ID')),
81 ('job_title', models.CharField(blank=True, max_length=128, null=True)),
82 ('role', models.CharField(choices=[('OWNER', 'Owner'), ('ADMIN', 'Administrator'), ('MANAGER', 'Manager'), ('MEMBER', 'Member'), ('GUEST', 'Guest')], default='MEMBER', max_length=32)),
83 ('status', models.CharField(choices=[('ACTIVE', 'Active'), ('INVITED', 'Invited'), ('SUSPENDED', 'Suspended')], default='ACTIVE', max_length=32)),
84 ('joined_at', models.DateTimeField(default=django.utils.timezone.now)),
85 ('department', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='members', to='team.department')),
86 ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='team_profiles', to=settings.AUTH_USER_MODEL)),
87 ],
88 options={
89 'ordering': ['-joined_at'],
90 'unique_together': {('tenant_id', 'user')},
91 },
92 ),
93 ]