from datetime import timedelta
import pytz
from django.conf import settings
from django.db import models
from django.urls import reverse
from django.utils.safestring import mark_safe
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from model_utils.models import TimeStampedModel
from poradnia.events.utils import render_event_icon
from poradnia.records.models import AbstractRecord, AbstractRecordQuerySet
from poradnia.users.models import Profile
from poradnia.utils.utils import get_numeric_param
[dokumentacja]
class Reminder(TimeStampedModel):
event = models.ForeignKey(to="Event", on_delete=models.CASCADE)
user = models.ForeignKey(
to=settings.AUTH_USER_MODEL, help_text=_("Recipient"), on_delete=models.CASCADE
)
active = models.BooleanField(default=True, help_text=_("Active status"))
class Meta:
verbose_name = _("Reminder")
verbose_name_plural = _("Reminders")
[dokumentacja]
class EventQuerySet(AbstractRecordQuerySet):
def old(self):
return self.filter(time__lte=now())
def fresh(self):
max_days = max(day for day, _ in Profile.EVENT_REMINDER_CHOICE)
return self.filter(time__gte=now() - timedelta(days=max_days))
def ajax_boolean_filter(self, request, prefix, field):
filter_values = []
for choice in [("yes", True), ("no", False)]:
filter_name = prefix + choice[0]
if get_numeric_param(request, filter_name):
filter_values.append(choice[1])
if filter_values:
return self.filter(**{field + "__in": filter_values})
else:
return self.filter(**{field + "__isnull": True})
def courtsession_filter(self, request):
filter_values = []
for choice in ["yes", "no"]:
filter_name = "courtsession_" + choice
if get_numeric_param(request, filter_name):
filter_values.append(choice)
qs = self.none()
if "yes" in filter_values:
qs = qs | self.filter(courtsession__isnull=False)
if "no" in filter_values:
qs = qs | self.filter(courtsession__isnull=True)
return qs
[dokumentacja]
class Event(AbstractRecord):
deadline = models.BooleanField(
default=True,
verbose_name=_("Dead-line"),
help_text=_(
"A significant event, especially highlighted, "
"for example, in the list of cases."
),
)
completed = models.BooleanField(
default=False,
verbose_name=_("Completed"),
help_text=_("Event has been completed, no more reminders."),
)
public = models.BooleanField(
default=False,
verbose_name=_("Public"),
help_text=_("Event is visible to customers (ext)."),
)
time = models.DateTimeField(verbose_name=_("Time"))
text = models.TextField(verbose_name=_("Subject"))
created_by = models.ForeignKey(
to=settings.AUTH_USER_MODEL,
related_name="event_created_by",
verbose_name=_("Created by"),
on_delete=models.CASCADE,
)
created_on = models.DateTimeField(auto_now_add=True, verbose_name=_("Created on"))
modified_by = models.ForeignKey(
to=settings.AUTH_USER_MODEL,
verbose_name=_("Modified by"),
null=True,
on_delete=models.CASCADE,
related_name="event_modified_by",
)
modified_on = models.DateTimeField(
auto_now=True, null=True, blank=True, verbose_name=_("Modified on")
)
objects = EventQuerySet.as_manager()
@property
def subject(self):
if len(self.text) > 100:
return "{} ...".format(self.text[:100])
return self.text
def get_absolute_url(self):
case_url = self.record.case_get_absolute_url()
return "{}#event-{}".format(case_url, self.pk)
def get_edit_url(self):
return reverse("events:edit", kwargs={"pk": self.pk})
def get_calendar_url(self):
return reverse(
"events:calendar", kwargs={"month": self.time.month, "year": self.time.year}
)
@property
def render_event_link(self):
url = self.get_absolute_url()
label = self.text.replace("\n", "<br>")
bold_start = "" if self.deadline else "<b>"
bold_end = "" if self.deadline else "</b>"
return f'{bold_start}<a href="{url}">{label}</a>{bold_end}'
@property
def render_deadline(self):
if self.deadline:
return render_event_icon(
"fa-hourglass", "black", "Wydarzenie jest terminem"
)
return render_event_icon("fa-hourglass", "gray", "Wydarzenie nie jest terminem")
@property
def render_completed(self):
if self.completed:
return render_event_icon(
"fa-check", "black", "Ukończono (nie ma więcej przypomnień)"
)
return render_event_icon("fa-check", "gray", "Nie ukończono (są przypomnienia)")
@property
def render_public(self):
if self.public:
return render_event_icon("fa-globe", "black", "Wydarzenie jest publiczne")
return render_event_icon("fa-globe", "gray", "Wydarzenie nie jest publiczne")
@property
def render_court_session(self):
if hasattr(self, "courtsession") and self.courtsession:
return render_event_icon(
"fa-balance-scale", # "fa-gavel",
"black; font-weight: bold; font-size: 17px;",
"Wydarzenie jest rozprawą sądową",
)
return ""
@property
def render_property_icons(self):
return mark_safe(
self.render_deadline
+ self.render_completed
+ self.render_public
+ self.render_court_session
)
@property
def render_court_case(self):
if hasattr(self, "courtsession") and self.courtsession:
return mark_safe(
self.courtsession.courtcase.signature
+ "<br>"
+ self.courtsession.courtcase.render_court_order_search_link
)
return ""
@property
def render_time(self):
default_tz = pytz.timezone(settings.TIME_ZONE)
return self.time.astimezone(default_tz).strftime("%Y-%m-%d %H:%M")
@property
def render_calendar_item(self):
title = self.text
text = (
self.render_court_session
+ self.render_deadline
+ self.render_completed
+ self.render_public
+ "<br> "
+ str(self.case)
)
url = self.get_absolute_url()
return mark_safe(
f'<li class_attr=""><a href="{url}" title="{title}">{text}</a></li>'
)
class Meta:
verbose_name = _("Event")
verbose_name_plural = _("Events")