#26 Annual conservation report
* adds first try for excel file downloading (WIP)
This commit is contained in:
parent
6b152616dd
commit
8872155e61
@ -3,10 +3,28 @@
|
|||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-12 col-md-12 col-lg-12">
|
<div class="col-sm-12 col-md-12 col-lg-6">
|
||||||
<h3>{% trans 'Evaluation report' %} {{office.long_name}}</h3>
|
<h3>{% trans 'Evaluation report' %} {{office.long_name}}</h3>
|
||||||
<h5>{% trans 'From' %} {{report.date_from.date}} {% trans 'to' %} {{report.date_to.date}}</h5>
|
<h5>{% trans 'From' %} {{report.date_from.date}} {% trans 'to' %} {{report.date_to.date}}</h5>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-sm-12 col-md-12 col-lg-6">
|
||||||
|
<div class="d-flex justify-content-end">
|
||||||
|
<div class=" menu-elem dropdown">
|
||||||
|
<div class="btn btn" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<button class="btn btn-default" title="{% trans 'Download' %}">
|
||||||
|
{% fa5_icon 'download' %}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
<a href="{{request.url}}?format=excel&{{request.GET.urlencode}}">
|
||||||
|
<button class="dropdown-item" title="Excel">
|
||||||
|
{% fa5_icon 'file-excel' %} Excel
|
||||||
|
</button>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="col-sm-12 col-md-12 col-lg-12">
|
<div class="col-sm-12 col-md-12 col-lg-12">
|
||||||
|
@ -5,10 +5,13 @@ Contact: michel.peltriaux@sgdnord.rlp.de
|
|||||||
Created on: 18.10.21
|
Created on: 18.10.21
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
from tempfile import NamedTemporaryFile
|
||||||
|
|
||||||
from django.contrib.gis.db.models import MultiPolygonField
|
from django.contrib.gis.db.models import MultiPolygonField
|
||||||
from django.contrib.gis.db.models.functions import NumGeometries
|
from django.contrib.gis.db.models.functions import NumGeometries
|
||||||
from django.db.models import Count, Sum, Q
|
from django.db.models import Count, Sum, Q
|
||||||
from django.db.models.functions import Cast
|
from django.db.models.functions import Cast
|
||||||
|
from openpyxl import Workbook
|
||||||
|
|
||||||
from analysis.settings import LKOMPVZVO_PUBLISH_DATE
|
from analysis.settings import LKOMPVZVO_PUBLISH_DATE
|
||||||
from codelist.models import KonovaCode
|
from codelist.models import KonovaCode
|
||||||
@ -16,6 +19,7 @@ from codelist.settings import CODELIST_LAW_ID
|
|||||||
from compensation.models import Compensation, Payment, EcoAccountDeduction, EcoAccount
|
from compensation.models import Compensation, Payment, EcoAccountDeduction, EcoAccount
|
||||||
from intervention.models import Intervention
|
from intervention.models import Intervention
|
||||||
from konova.models import Geometry
|
from konova.models import Geometry
|
||||||
|
from konova.utils.generators import generate_random_string
|
||||||
|
|
||||||
|
|
||||||
class TimespanReport:
|
class TimespanReport:
|
||||||
@ -363,3 +367,12 @@ class TimespanReport:
|
|||||||
self.compensation_report = self.CompensationReport(self.office_id, date_from, date_to)
|
self.compensation_report = self.CompensationReport(self.office_id, date_from, date_to)
|
||||||
self.eco_account_report = self.EcoAccountReport(self.office_id, date_from, date_to)
|
self.eco_account_report = self.EcoAccountReport(self.office_id, date_from, date_to)
|
||||||
self.old_intervention_report = self.OldInterventionReport(self.office_id, date_from, date_to)
|
self.old_intervention_report = self.OldInterventionReport(self.office_id, date_from, date_to)
|
||||||
|
|
||||||
|
def to_excel_file(self):
|
||||||
|
workbook = Workbook()
|
||||||
|
tmp_file = NamedTemporaryFile()
|
||||||
|
ws = workbook.active
|
||||||
|
ws["A1"] = "TEST"
|
||||||
|
workbook.save(tmp_file.name)
|
||||||
|
tmp_file.seek(0)
|
||||||
|
return tmp_file
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.http import HttpRequest, FileResponse
|
||||||
from django.http import HttpRequest
|
from django.shortcuts import render, redirect, get_object_or_404
|
||||||
from django.shortcuts import render, redirect
|
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
from analysis.forms import TimespanReportForm
|
from analysis.forms import TimespanReportForm
|
||||||
@ -55,18 +54,17 @@ def detail_report_view(request: HttpRequest, id: str):
|
|||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
# Try to resolve the requested office id
|
||||||
|
cons_office = get_object_or_404(
|
||||||
|
KonovaCode,
|
||||||
|
id=id
|
||||||
|
)
|
||||||
|
# Try to resolve the date parameters into Date objects -> redirect if this fails
|
||||||
try:
|
try:
|
||||||
cons_office = KonovaCode.objects.get(id=id)
|
df = request.GET.get("df", None)
|
||||||
except (ObjectDoesNotExist, ValueError) as e:
|
dt = request.GET.get("dt", None)
|
||||||
messages.error(
|
date_from = timezone.make_aware(timezone.datetime.fromisoformat(df))
|
||||||
request,
|
date_to = timezone.make_aware(timezone.datetime.fromisoformat(dt))
|
||||||
PARAMS_INVALID,
|
|
||||||
extra_tags="danger",
|
|
||||||
)
|
|
||||||
return redirect("analysis:reports")
|
|
||||||
try:
|
|
||||||
date_from = timezone.make_aware(timezone.datetime.fromisoformat(request.GET.get("df", None)))
|
|
||||||
date_to = timezone.make_aware(timezone.datetime.fromisoformat(request.GET.get("dt", None)))
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
messages.error(
|
messages.error(
|
||||||
request,
|
request,
|
||||||
@ -75,11 +73,24 @@ def detail_report_view(request: HttpRequest, id: str):
|
|||||||
)
|
)
|
||||||
return redirect("analysis:reports")
|
return redirect("analysis:reports")
|
||||||
|
|
||||||
|
# Check whether the html default rendering is requested or an alternative
|
||||||
|
format_param = request.GET.get("format", "html")
|
||||||
report = TimespanReport(id, date_from, date_to)
|
report = TimespanReport(id, date_from, date_to)
|
||||||
template = "analysis/reports/detail.html"
|
|
||||||
context = {
|
if format_param == "html":
|
||||||
"office": cons_office,
|
template = "analysis/reports/detail.html"
|
||||||
"report": report,
|
context = {
|
||||||
}
|
"office": cons_office,
|
||||||
context = BaseContext(request, context).context
|
"report": report,
|
||||||
return render(request, template, context)
|
}
|
||||||
|
context = BaseContext(request, context).context
|
||||||
|
return render(request, template, context)
|
||||||
|
elif format_param == "excel":
|
||||||
|
stream = report.to_excel_file()
|
||||||
|
response = FileResponse(
|
||||||
|
filename=stream.name,
|
||||||
|
)
|
||||||
|
response['Content-Disposition'] = f'attachement;"'
|
||||||
|
return response
|
||||||
|
else:
|
||||||
|
raise NotImplementedError
|
||||||
|
@ -11,11 +11,14 @@ django-filter==2.4.0
|
|||||||
django-fontawesome-5==1.0.18
|
django-fontawesome-5==1.0.18
|
||||||
django-simple-sso==1.1.0
|
django-simple-sso==1.1.0
|
||||||
django-tables2==2.3.4
|
django-tables2==2.3.4
|
||||||
|
et-xmlfile==1.1.0
|
||||||
idna==2.10
|
idna==2.10
|
||||||
importlib-metadata==2.1.1
|
importlib-metadata==2.1.1
|
||||||
itsdangerous
|
itsdangerous==0.24
|
||||||
psycopg2-binary
|
openpyxl==3.0.9
|
||||||
|
psycopg2-binary==2.9.1
|
||||||
pytz==2020.4
|
pytz==2020.4
|
||||||
|
qrcode==7.3.1
|
||||||
requests==2.25.0
|
requests==2.25.0
|
||||||
six==1.15.0
|
six==1.15.0
|
||||||
soupsieve==2.2.1
|
soupsieve==2.2.1
|
||||||
|
Loading…
Reference in New Issue
Block a user