in backend/code_review_backend/issues/api.py [0:0]
def get_queryset(self):
qs = Issue.objects.all().only("id", "hash").prefetch_related("revisions")
errors = defaultdict(list)
repo_slug = self.kwargs["repo_slug"]
filters = {}
try:
repo = Repository.objects.get(slug=repo_slug)
except Repository.DoesNotExist:
repo = None
errors["repo_slug"].append(
"invalid repo_slug path argument - No repository match this slug"
)
else:
filters["revisions__head_repository"] = repo
# Always filter by path when the parameter is set
if path := self.request.query_params.get("path"):
filters["path"] = path
date_revision = None
if date := self.request.query_params.get("date"):
try:
date = datetime.strptime(date, "%Y-%m-%d") + timedelta(days=1)
except ValueError:
errors["date"].append("invalid date - should be YYYY-MM-DD")
else:
# Look for a revision matching this date, going back to 2 days maximum
date_revision = (
Revision.objects.filter(
head_repository=repo,
created__gte=date - timedelta(2),
created__lt=date,
)
.order_by("created")
.last()
)
rev_changeset = self.request.query_params.get("revision_changeset")
if rev_changeset is not None and len(rev_changeset) != 40:
errors["revision_changeset"].append(
"invalid revision_changeset - should be the mercurial hash on the head repository"
)
if errors:
raise ValidationError(errors)
# Only use the revision filter in case some issues are found
if (
rev_changeset
and qs.filter(revisions__head_changeset=rev_changeset).exists()
):
filters["revisions__head_changeset"] = rev_changeset
elif rev_changeset and not date_revision:
qs = Issue.objects.none()
# Defaults to filtering by the revision closest to the given date
elif date_revision:
filters["revisions"] = date_revision
return qs.filter(**filters).order_by("created").distinct()