Skip to content

Commit

Permalink
feat(changes): Improve daterange selection for changes (#11894)
Browse files Browse the repository at this point in the history
* Implemented DateRangeField in ChangesForm
* Enforce required on DateRangeField in the ReportsForm
* Added test for change with date range filter
  • Loading branch information
harriebird committed Jun 19, 2024
1 parent a39be46 commit e0cf8db
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 11 deletions.
2 changes: 1 addition & 1 deletion weblate/static/daterangepicker.css
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
top: -7px;
border-right: 7px solid transparent;
border-left: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-bottom: 7px solid rgb(59, 64, 67);
}

.daterangepicker:after {
Expand Down
11 changes: 11 additions & 0 deletions weblate/static/style-dark.css
Original file line number Diff line number Diff line change
Expand Up @@ -2673,7 +2673,18 @@ tbody.warning {
background-color: rgb(26, 29, 30);
}

.daterangepicker:after {
border-bottom: 6px solid rgb(26, 29, 30);
}

.daterangepicker td.in-range {
background-color: rgb(40, 43, 44);
color: rgb(217, 211, 204);
}

.daterangepicker td.active,
.daterangepicker td.active:hover {
background-color: rgb(18, 68, 55);
border-color: transparent;
color: #fff;
}
16 changes: 12 additions & 4 deletions weblate/trans/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,9 @@ def __init__(self, **kwargs) -> None:

def to_python(self, value):
"""Convert the string input into data range values."""
value = super().to_python(value)
if value in self.empty_values:
return None
try:
start, end = value.split(" - ")
start_date = datetime.strptime(start, "%m/%d/%Y").replace( # noqa: DTZ007
Expand All @@ -158,7 +161,10 @@ def to_python(self, value):

def validate(self, value):
"""Validate the date range values."""
if value["start_date"] > value["end_date"]:
if self.required:
super().validate(value)

if value not in self.empty_values and value["start_date"] > value["end_date"]:
raise ValidationError(
gettext("The starting date has to be before the ending date.")
)
Expand Down Expand Up @@ -1292,7 +1298,7 @@ class ReportsForm(forms.Form):
)
period = DateRangeField(
label=gettext_lazy("Report period"),
required=False,
required=True,
)
language = forms.ChoiceField(
label=gettext_lazy("Language"),
Expand Down Expand Up @@ -2699,8 +2705,10 @@ class ChangesForm(forms.Form):
user = UsernameField(
label=gettext_lazy("Author username"), required=False, help_text=None
)
start_date = WeblateDateField(label=gettext_lazy("Starting date"), required=False)
end_date = WeblateDateField(label=gettext_lazy("Ending date"), required=False)
period = DateRangeField(
label=gettext_lazy("Change period"),
required=False,
)

def clean_user(self):
username = self.cleaned_data.get("user")
Expand Down
10 changes: 10 additions & 0 deletions weblate/trans/tests/test_changes.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@

"""Tests for changes browsing."""

from datetime import timedelta

from django.urls import reverse
from django.utils import timezone

from weblate.trans.models import Unit
from weblate.trans.tests.test_views import ViewTestCase
Expand Down Expand Up @@ -57,3 +60,10 @@ def test_user(self) -> None:
response = self.client.get(reverse("changes"), {"user": self.user.username})
self.assertContains(response, "Translation added")
self.assertNotContains(response, "Invalid search string!")

def test_daterange(self) -> None:
end = timezone.now()
start = end - timedelta(days=1)
period = "{} - {}".format(start.strftime("%m/%d/%Y"), end.strftime("%m/%d/%Y"))
response = self.client.get(reverse("changes"), {"period": period})
self.assertContains(response, "Resource update")
8 changes: 6 additions & 2 deletions weblate/trans/tests/test_reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,9 @@ def test_credits_view_html(self) -> None:
def test_credits_blank_period(self):
period = ""
response = self.get_credits("json", period=period, follow=True)
self.assertContains(response, "Error in parameter period: Invalid date!")
self.assertContains(
response, "Error in parameter period: This field is required."
)

def test_credits_invalid_start(self):
end = timezone.now()
Expand Down Expand Up @@ -330,7 +332,9 @@ def test_counts_view_html(self) -> None:
def test_counts_blank_period(self):
period = ""
response = self.get_counts("json", period=period, follow=True)
self.assertContains(response, "Error in parameter period: Invalid date!")
self.assertContains(
response, "Error in parameter period: This field is required."
)

def test_counts_invalid_start(self):
end = timezone.now()
Expand Down
7 changes: 3 additions & 4 deletions weblate/trans/views/changes.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,10 +163,9 @@ def get_queryset(self):
if form.is_valid():
if action := form.cleaned_data.get("action"):
filters["action__in"] = action
if start_date := form.cleaned_data.get("start_date"):
filters["timestamp__date__gte"] = start_date
if end_date := form.cleaned_data.get("end_date"):
filters["timestamp__date__lte"] = end_date
if period := form.cleaned_data.get("period"):
filters["timestamp__date__gte"] = period["start_date"]
filters["timestamp__date__lte"] = period["end_date"]
if user := form.cleaned_data.get("user"):
filters["user"] = user

Expand Down

0 comments on commit e0cf8db

Please sign in to comment.