79 lines
3.9 KiB
Python
79 lines
3.9 KiB
Python
# Generated by Django 5.2.12 on 2026-05-26 08:20
|
|
|
|
import django.db.models.deletion
|
|
import uuid
|
|
from django.conf import settings
|
|
from django.db import migrations, models
|
|
|
|
|
|
def seed_rate_history(apps, schema_editor):
|
|
HourlyRateHistory = apps.get_model('workspaces', 'HourlyRateHistory')
|
|
WorkspaceUserRate = apps.get_model('workspaces', 'WorkspaceUserRate')
|
|
ProjectUserRate = apps.get_model('projects', 'ProjectUserRate')
|
|
|
|
workspace_rows = [
|
|
HourlyRateHistory(
|
|
workspace_id=rate.workspace_id,
|
|
user_id=rate.user_id,
|
|
project_id=None,
|
|
scope='workspace',
|
|
hourly_rate=rate.hourly_rate,
|
|
currency=rate.currency,
|
|
effective_from=rate.effective_from,
|
|
is_active=True,
|
|
)
|
|
for rate in WorkspaceUserRate.objects.filter(is_deleted=False)
|
|
]
|
|
project_rows = [
|
|
HourlyRateHistory(
|
|
workspace_id=rate.project.workspace_id,
|
|
user_id=rate.user_id,
|
|
project_id=rate.project_id,
|
|
scope='project',
|
|
hourly_rate=rate.hourly_rate,
|
|
currency=rate.currency,
|
|
effective_from=rate.effective_from,
|
|
is_active=True,
|
|
)
|
|
for rate in ProjectUserRate.objects.select_related('project').filter(is_deleted=False)
|
|
]
|
|
HourlyRateHistory.objects.bulk_create(workspace_rows + project_rows, ignore_conflicts=True)
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
dependencies = [
|
|
('projects', '0005_project_thumbnail'),
|
|
('workspaces', '0007_workspacemembership_membership_ws_active_user_idx'),
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name='HourlyRateHistory',
|
|
fields=[
|
|
('id', models.UUIDField(default=uuid.uuid7, primary_key=True, serialize=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('deleted_at', models.DateTimeField(blank=True, null=True)),
|
|
('is_deleted', models.BooleanField(default=False)),
|
|
('is_active', models.BooleanField(default=False)),
|
|
('scope', models.CharField(choices=[('workspace', 'Workspace'), ('project', 'Project')], max_length=16)),
|
|
('hourly_rate', models.DecimalField(decimal_places=2, max_digits=10)),
|
|
('currency', models.CharField(default='USD', max_length=3)),
|
|
('effective_from', models.DateTimeField()),
|
|
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_%(app_label)s_%(class)s_set', to=settings.AUTH_USER_MODEL)),
|
|
('project', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hourly_rate_history', to='projects.project')),
|
|
('updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='updated_%(app_label)s_%(class)s_set', to=settings.AUTH_USER_MODEL)),
|
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hourly_rate_history', to=settings.AUTH_USER_MODEL)),
|
|
('workspace', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hourly_rate_history', to='workspaces.workspace')),
|
|
],
|
|
options={
|
|
'db_table': 'hourly_rate_history',
|
|
'ordering': ('effective_from', 'created_at'),
|
|
'indexes': [models.Index(fields=['workspace', 'user', 'effective_from'], name='hrh_ws_user_eff_idx'), models.Index(fields=['project', 'user', 'effective_from'], name='hrh_project_user_eff_idx')],
|
|
},
|
|
),
|
|
migrations.RunPython(seed_rate_history, migrations.RunPython.noop),
|
|
]
|