281 lines
5.5 KiB
Python
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)
|
|
|
|
|
|
|
|
|
|
|