mpeltriaux
aa338e5519
* improves the way parcel-geometry relations are stored on the DB * instead of a numerical sequence we switched to UUID, so no sequence will run out at anytime (new model: ParcelIntersection) * instead of dropping all M2M relations between parcel and geometry on each calculation, we keep the ones that still exist, drop the ones that do not exist and add new ones (if new ones exist)
192 lines
5.5 KiB
Python
192 lines
5.5 KiB
Python
"""
|
|
Author: Michel Peltriaux
|
|
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
|
|
Contact: michel.peltriaux@sgdnord.rlp.de
|
|
Created on: 01.12.20
|
|
|
|
"""
|
|
from django.http import HttpRequest
|
|
from django.template.loader import render_to_string
|
|
from django.urls import reverse
|
|
from django.utils.html import format_html
|
|
from django.utils.timezone import localtime
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from intervention.filters import InterventionTableFilter
|
|
from intervention.models import Intervention
|
|
from konova.sub_settings.django_settings import DEFAULT_DATE_TIME_FORMAT, DEFAULT_DATE_FORMAT
|
|
from konova.utils.tables import BaseTable, TableRenderMixin
|
|
import django_tables2 as tables
|
|
|
|
|
|
class InterventionTable(BaseTable, TableRenderMixin):
|
|
id = tables.Column(
|
|
verbose_name=_("Identifier"),
|
|
orderable=True,
|
|
accessor="identifier",
|
|
)
|
|
t = tables.Column(
|
|
verbose_name=_("Title"),
|
|
orderable=True,
|
|
accessor="title",
|
|
)
|
|
d = tables.Column(
|
|
verbose_name=_("Parcel gmrkng"),
|
|
orderable=True,
|
|
accessor="geometry",
|
|
)
|
|
c = tables.Column(
|
|
verbose_name=_("Checked"),
|
|
orderable=True,
|
|
empty_values=[],
|
|
accessor="checked",
|
|
)
|
|
r = tables.Column(
|
|
verbose_name=_("Recorded"),
|
|
orderable=True,
|
|
empty_values=[],
|
|
accessor="recorded",
|
|
)
|
|
e = tables.Column(
|
|
verbose_name=_("Editable"),
|
|
orderable=True,
|
|
empty_values=[],
|
|
accessor="users",
|
|
)
|
|
lm = tables.Column(
|
|
verbose_name=_("Last edit"),
|
|
orderable=True,
|
|
accessor="modified__timestamp",
|
|
)
|
|
|
|
class Meta(BaseTable.Meta):
|
|
template_name = "django_tables2/bootstrap4.html"
|
|
|
|
def __init__(self, request: HttpRequest, *args, **kwargs):
|
|
self.title = _("Interventions")
|
|
self.add_new_url = reverse("intervention:new")
|
|
qs = kwargs.get("queryset", None)
|
|
self.filter = InterventionTableFilter(
|
|
user=request.user,
|
|
data=request.GET,
|
|
queryset=qs,
|
|
)
|
|
kwargs["queryset"] = self.filter.qs
|
|
super().__init__(request, *args, **kwargs)
|
|
|
|
def render_id(self, value, record: Intervention):
|
|
""" Renders the id column for an intervention
|
|
|
|
Args:
|
|
value (str): The identifier value
|
|
record (Intervention): The intervention record
|
|
|
|
Returns:
|
|
|
|
"""
|
|
context = {
|
|
"tooltip": _("Open {}").format(_("Intervention")),
|
|
"content": value,
|
|
"url": reverse("intervention:detail", args=(record.id,)),
|
|
"has_revocations": record.legal.revocations.exists()
|
|
}
|
|
html = render_to_string(
|
|
"table/revocation_warning_col.html",
|
|
context
|
|
)
|
|
return html
|
|
|
|
def render_c(self, value, record: Intervention):
|
|
""" Renders the checked column for an intervention
|
|
|
|
Args:
|
|
value (str): The identifier value
|
|
record (Intervention): The intervention record
|
|
|
|
Returns:
|
|
|
|
"""
|
|
html = ""
|
|
checked = value is not None
|
|
tooltip = _("Not checked yet")
|
|
if checked:
|
|
value = value.timestamp
|
|
value = localtime(value)
|
|
checked_on = value.strftime(DEFAULT_DATE_TIME_FORMAT)
|
|
tooltip = _("Checked on {} by {}").format(checked_on, record.checked.user)
|
|
html += self.render_checked_star(
|
|
tooltip=tooltip,
|
|
icn_filled=checked,
|
|
)
|
|
return format_html(html)
|
|
|
|
def render_d(self, value, record: Intervention):
|
|
""" Renders the parcel district column for an intervention
|
|
|
|
Args:
|
|
value (str): The intervention geometry
|
|
record (Intervention): The intervention record
|
|
|
|
Returns:
|
|
|
|
"""
|
|
parcels = value.parcels.filter(
|
|
parcelintersection__calculated_on__isnull=False,
|
|
).values_list(
|
|
"gmrkng",
|
|
flat=True
|
|
).distinct()
|
|
html = render_to_string(
|
|
"table/gmrkng_col.html",
|
|
{
|
|
"entries": parcels
|
|
}
|
|
)
|
|
return html
|
|
|
|
def render_r(self, value, record: Intervention):
|
|
""" Renders the recorded column for an intervention
|
|
|
|
Args:
|
|
value (str): The identifier value
|
|
record (Intervention): The intervention record
|
|
|
|
Returns:
|
|
|
|
"""
|
|
html = ""
|
|
checked = value is not None
|
|
tooltip = _("Not recorded yet")
|
|
if checked:
|
|
value = value.timestamp
|
|
value = localtime(value)
|
|
on = value.strftime(DEFAULT_DATE_TIME_FORMAT)
|
|
tooltip = _("Recorded on {} by {}").format(on, record.recorded.user)
|
|
html += self.render_bookmark(
|
|
tooltip=tooltip,
|
|
icn_filled=checked,
|
|
)
|
|
return format_html(html)
|
|
|
|
def render_e(self, value, record: Intervention):
|
|
""" Renders the editable column for an intervention
|
|
|
|
Args:
|
|
value (str): The identifier value
|
|
record (Intervention): The intervention record
|
|
|
|
Returns:
|
|
|
|
"""
|
|
html = ""
|
|
has_access = value.filter(
|
|
id=self.user.id
|
|
).exists()
|
|
|
|
html += self.render_icn(
|
|
tooltip=_("Full access granted") if has_access else _("Access not granted"),
|
|
icn_class="fas fa-edit rlp-r-inv" if has_access else "far fa-edit",
|
|
)
|
|
return format_html(html)
|
|
|