Add database indexes and minor performance fixes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
370b0e9815
commit
0169f09131
@ -18,7 +18,9 @@ class UserAdmin(BaseUserAdmin):
|
|||||||
list_display = ('username', 'first_name', 'last_name', 'is_staff', 'get_groups')
|
list_display = ('username', 'first_name', 'last_name', 'is_staff', 'get_groups')
|
||||||
list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups')
|
list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups')
|
||||||
|
|
||||||
# Reorder fieldsets so Groups appears near the top
|
def get_queryset(self, request):
|
||||||
|
return super().get_queryset(request).prefetch_related('groups')
|
||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(None, {'fields': ('username', 'password')}),
|
(None, {'fields': ('username', 'password')}),
|
||||||
('Personal info', {'fields': ('first_name', 'last_name', 'email')}),
|
('Personal info', {'fields': ('first_name', 'last_name', 'email')}),
|
||||||
@ -63,6 +65,9 @@ class ProjectAdmin(admin.ModelAdmin):
|
|||||||
list_filter = ('is_active',)
|
list_filter = ('is_active',)
|
||||||
filter_horizontal = ('supervisors',)
|
filter_horizontal = ('supervisors',)
|
||||||
|
|
||||||
|
def get_queryset(self, request):
|
||||||
|
return super().get_queryset(request).prefetch_related('supervisors')
|
||||||
|
|
||||||
def get_supervisors(self, obj):
|
def get_supervisors(self, obj):
|
||||||
return ', '.join(u.username for u in obj.supervisors.all()) or '-'
|
return ', '.join(u.username for u in obj.supervisors.all()) or '-'
|
||||||
get_supervisors.short_description = 'Supervisors'
|
get_supervisors.short_description = 'Supervisors'
|
||||||
|
|||||||
@ -1,6 +1,9 @@
|
|||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
# Computed once at module load — changes per server restart/deploy
|
||||||
|
_DEPLOYMENT_TIMESTAMP = int(time.time())
|
||||||
|
|
||||||
|
|
||||||
# === TEMPLATE CONTEXT PROCESSORS ===
|
# === TEMPLATE CONTEXT PROCESSORS ===
|
||||||
|
|
||||||
@ -11,6 +14,5 @@ def project_context(request):
|
|||||||
return {
|
return {
|
||||||
"project_description": os.getenv("PROJECT_DESCRIPTION", ""),
|
"project_description": os.getenv("PROJECT_DESCRIPTION", ""),
|
||||||
"project_image_url": os.getenv("PROJECT_IMAGE_URL", ""),
|
"project_image_url": os.getenv("PROJECT_IMAGE_URL", ""),
|
||||||
# Used for cache-busting static assets
|
"deployment_timestamp": _DEPLOYMENT_TIMESTAMP,
|
||||||
"deployment_timestamp": int(time.time()),
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,34 @@
|
|||||||
|
# Generated by Django 5.2.7 on 2026-02-19 22:25
|
||||||
|
|
||||||
|
import django.utils.timezone
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('core', '0016_alter_payrolladjustment_type'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='payrolladjustment',
|
||||||
|
name='date',
|
||||||
|
field=models.DateField(db_index=True, default=django.utils.timezone.now),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='payrolladjustment',
|
||||||
|
name='type',
|
||||||
|
field=models.CharField(choices=[('BONUS', 'Bonus'), ('OVERTIME', 'Overtime'), ('DEDUCTION', 'Deduction'), ('LOAN_REPAYMENT', 'Loan Repayment'), ('LOAN', 'New Loan'), ('ADVANCE', 'Advance Payment')], db_index=True, default='DEDUCTION', max_length=20),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='payrollrecord',
|
||||||
|
name='date',
|
||||||
|
field=models.DateField(db_index=True, default=django.utils.timezone.now),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='worklog',
|
||||||
|
name='date',
|
||||||
|
field=models.DateField(db_index=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -95,7 +95,7 @@ class WorkLog(models.Model):
|
|||||||
(Decimal('1.0'), 'Full Day'),
|
(Decimal('1.0'), 'Full Day'),
|
||||||
]
|
]
|
||||||
|
|
||||||
date = models.DateField()
|
date = models.DateField(db_index=True)
|
||||||
project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='logs')
|
project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='logs')
|
||||||
team = models.ForeignKey(Team, on_delete=models.SET_NULL, null=True, blank=True, related_name='work_logs')
|
team = models.ForeignKey(Team, on_delete=models.SET_NULL, null=True, blank=True, related_name='work_logs')
|
||||||
workers = models.ManyToManyField(Worker, related_name='work_logs')
|
workers = models.ManyToManyField(Worker, related_name='work_logs')
|
||||||
@ -117,7 +117,7 @@ class WorkLog(models.Model):
|
|||||||
|
|
||||||
class PayrollRecord(models.Model):
|
class PayrollRecord(models.Model):
|
||||||
worker = models.ForeignKey(Worker, on_delete=models.CASCADE, related_name='payroll_records')
|
worker = models.ForeignKey(Worker, on_delete=models.CASCADE, related_name='payroll_records')
|
||||||
date = models.DateField(default=timezone.now)
|
date = models.DateField(default=timezone.now, db_index=True)
|
||||||
amount = models.DecimalField(max_digits=10, decimal_places=2)
|
amount = models.DecimalField(max_digits=10, decimal_places=2)
|
||||||
work_logs = models.ManyToManyField(WorkLog, related_name='paid_in')
|
work_logs = models.ManyToManyField(WorkLog, related_name='paid_in')
|
||||||
created_at = models.DateTimeField(auto_now_add=True)
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
@ -171,9 +171,9 @@ class PayrollAdjustment(models.Model):
|
|||||||
work_log = models.ForeignKey(WorkLog, on_delete=models.SET_NULL, null=True, blank=True, related_name='adjustments')
|
work_log = models.ForeignKey(WorkLog, on_delete=models.SET_NULL, null=True, blank=True, related_name='adjustments')
|
||||||
|
|
||||||
amount = models.DecimalField(max_digits=10, decimal_places=2, help_text="Positive adds to pay, negative subtracts (except for Loan Repayment which is auto-handled)")
|
amount = models.DecimalField(max_digits=10, decimal_places=2, help_text="Positive adds to pay, negative subtracts (except for Loan Repayment which is auto-handled)")
|
||||||
date = models.DateField(default=timezone.now)
|
date = models.DateField(default=timezone.now, db_index=True)
|
||||||
description = models.CharField(max_length=255)
|
description = models.CharField(max_length=255)
|
||||||
type = models.CharField(max_length=20, choices=ADJUSTMENT_TYPES, default='DEDUCTION')
|
type = models.CharField(max_length=20, choices=ADJUSTMENT_TYPES, default='DEDUCTION', db_index=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Payroll Adjustment"
|
verbose_name = "Payroll Adjustment"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user