53 lines
1.9 KiB
Python
53 lines
1.9 KiB
Python
from datetime import date
|
|
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.core.exceptions import PermissionDenied
|
|
from django.http import HttpResponse
|
|
from django.shortcuts import get_object_or_404, render
|
|
|
|
from apps.accounts.models import User
|
|
from apps.companies.models import Company
|
|
|
|
from .services import build_monthly_report
|
|
from .pdf import render_company_pdf
|
|
|
|
|
|
def selected_user(request):
|
|
if not request.user.is_app_admin:
|
|
return request.user
|
|
user_id = request.GET.get("user")
|
|
return get_object_or_404(User, pk=user_id) if user_id else request.user
|
|
|
|
|
|
def selected_period(request):
|
|
today = date.today()
|
|
return int(request.GET.get("year", today.year)), int(request.GET.get("month", today.month))
|
|
|
|
|
|
@login_required
|
|
def monthly_report(request):
|
|
user = selected_user(request)
|
|
year, month = selected_period(request)
|
|
report = build_monthly_report(user, year, month)
|
|
context = {
|
|
"report": report,
|
|
"users": User.objects.filter(is_active=True).order_by("last_name", "first_name", "username") if request.user.is_app_admin else (),
|
|
"companies": Company.objects.filter(projects__tasks__assignee=user, projects__tasks__work_date__year=year, projects__tasks__work_date__month=month).distinct(),
|
|
}
|
|
return render(request, "reports/monthly.html", context)
|
|
|
|
|
|
@login_required
|
|
def company_pdf(request, company_id):
|
|
user = selected_user(request)
|
|
if not request.user.is_app_admin and user.pk != request.user.pk:
|
|
raise PermissionDenied
|
|
year, month = selected_period(request)
|
|
company = get_object_or_404(Company, pk=company_id)
|
|
report = build_monthly_report(user, year, month, company=company)
|
|
pdf = render_company_pdf(report, company)
|
|
filename = f"report-{company.pk}-{user.username}-{year}-{month:02d}.pdf"
|
|
response = HttpResponse(pdf, content_type="application/pdf")
|
|
response["Content-Disposition"] = f'attachment; filename="{filename}"'
|
|
return response
|