36402-vm/core/views.py
2025-11-28 05:35:59 +00:00

281 lines
5.5 KiB
Python

import os
from django.db import models
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required, user_passes_test
from django.http import HttpResponseForbidden
from functools import wraps
from .models import Property, Appraisal, User, Project, Invoice
def group_required(*group_names):
"""Requires user membership in at least one of the groups passed in."""
def in_groups(user):
if user.is_authenticated and (user.is_superuser or bool(user.groups.filter(name__in=group_names))):
return True
return False
return user_passes_test(in_groups, login_url='login')
@login_required
@group_required('Org admin')
def admin_dashboard(request):
"""Displays the admin dashboard."""
return render(request, "core/admin_dashboard.html")
from django.http import HttpResponse
def health_check(request):
return HttpResponse("OK")
def index(request):
if request.user.is_authenticated:
if request.user.groups.filter(name='Org admin').exists():
return redirect('core:admin_dashboard')
# elif request.user.groups.filter(name='Client').exists():
# return redirect('client_dashboard')
else:
# Fallback for users with no assigned group
return redirect('login')
return render(request, "core/index.html")
@login_required
def property_list(request):
properties = Property.objects.all()
statuses = Property.STATUS_CHOICES
property_types = Property.PROPERTY_TYPE_CHOICES
q = request.GET.get('q')
status = request.GET.get('status')
property_type = request.GET.get('property_type')
if q:
properties = properties.filter(
models.Q(name__icontains=q) |
models.Q(address__icontains=q) |
models.Q(city__icontains=q) |
models.Q(state__icontains=q) |
models.Q(zip_code__icontains=q) |
models.Q(description__icontains=q)
)
if status:
properties = properties.filter(status=status)
if property_type:
properties = properties.filter(property_type=property_type)
context = {
'properties': properties,
'statuses': statuses,
'property_types': property_types,
}
return render(request, 'core/property_list.html', context)
@login_required
def appraisal_list(request):
appraisals = Appraisal.objects.all()
property_types = Property.PROPERTY_TYPE_CHOICES
appraisers = User.objects.filter(groups__name='Internal')
q = request.GET.get('q')
property_type = request.GET.get('property_type')
appraiser_id = request.GET.get('appraiser')
start_date = request.GET.get('start_date')
end_date = request.GET.get('end_date')
if q:
appraisals = appraisals.filter(
models.Q(property__name__icontains=q) |
models.Q(appraiser__username__icontains=q) |
models.Q(notes__icontains=q)
)
if property_type:
appraisals = appraisals.filter(property__property_type=property_type)
if appraiser_id:
appraisals = appraisals.filter(appraiser__id=appraiser_id)
if start_date:
appraisals = appraisals.filter(appraisal_date__gte=start_date)
if end_date:
appraisals = appraisals.filter(appraisal_date__lte=end_date)
context = {
'appraisals': appraisals,
'property_types': property_types,
'appraisers': appraisers
}
return render(request, 'core/appraisal_list.html', context)
@login_required
def user_list(request):
users = User.objects.all()
roles = User.ROLE_CHOICES
q = request.GET.get('q')
role = request.GET.get('role')
if q:
users = users.filter(
models.Q(username__icontains=q) |
models.Q(first_name__icontains=q) |
models.Q(last_name__icontains=q) |
models.Q(email__icontains=q)
)
if role:
users = users.filter(role=role)
context = {
'users': users,
'roles': roles,
}
return render(request, 'core/user_list.html', context)
@login_required
def project_list(request):
projects = Project.objects.all()
q = request.GET.get('q')
start_date = request.GET.get('start_date')
end_date = request.GET.get('end_date')
if q:
projects = projects.filter(
models.Q(name__icontains=q) | models.Q(description__icontains=q)
)
if start_date:
projects = projects.filter(start_date__gte=start_date)
if end_date:
projects = projects.filter(end_date__lte=end_date)
context = {
'projects': projects,
}
return render(request, 'core/project_list.html', context)
@login_required
def invoice_list(request):
invoices = Invoice.objects.all()
statuses = Invoice.STATUS_CHOICES
q = request.GET.get('q')
status = request.GET.get('status')
start_date = request.GET.get('start_date')
end_date = request.GET.get('end_date')
if q:
invoices = invoices.filter(
models.Q(invoice_number__icontains=q) |
models.Q(project__name__icontains=q)
)
if status:
invoices = invoices.filter(status=status)
if start_date:
invoices = invoices.filter(due_date__gte=start_date)
if end_date:
invoices = invoices.filter(due_date__lte=end_date)
context = {
'invoices': invoices,
'statuses': statuses,
}
return render(request, 'core/invoice_list.html', context)