* feat: add IssueListDetailSerializer for detailed issue representation - Introduced IssueListDetailSerializer to enhance issue data representation with expanded fields. - Updated issue detail endpoint to utilize the new serializer for improved data handling. - Added methods for retrieving related module, label, and assignee IDs, along with support for expanded relations. * feat: add ViewIssueListSerializer and enhance issue ordering - Introduced ViewIssueListSerializer for improved issue representation, including assignee, label, and module IDs. - Updated WorkspaceViewIssuesViewSet to utilize the new serializer and optimized queryset with prefetching. - Enhanced order_issue_queryset to maintain consistent ordering by created_at alongside other fields. - Modified pagination logic to support total count retrieval for better performance. * fix: optimize issue filtering and pagination logic - Updated WorkspaceViewIssuesViewSet to apply filters more efficiently in the issue query. - Refined pagination logic in OffsetPaginator to ensure consistent behavior using limit instead of cursor.value, improving overall pagination accuracy. * fix: improve pagination logic in OffsetPaginator - Updated the next_cursor calculation to use the length of results instead of cursor.value, ensuring accurate pagination behavior. - Added a comment to clarify the purpose of checking for additional results after the current page. * Move the common permission filters into a separate method * fix: handle deleted related issues in serializers - Updated IssueListDetailSerializer to skip null related issues when building relations. - Enhanced ViewIssueListSerializer to safely access state.group, returning None if state is not present. - Removed unused User import in base.py for cleaner code. --------- Co-authored-by: Dheeraj Kumar Ketireddy <dheeru0198@gmail.com>
72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
from django.db.models import Case, CharField, Min, Value, When
|
|
|
|
# Custom ordering for priority and state
|
|
PRIORITY_ORDER = ["urgent", "high", "medium", "low", "none"]
|
|
STATE_ORDER = ["backlog", "unstarted", "started", "completed", "cancelled"]
|
|
|
|
|
|
def order_issue_queryset(issue_queryset, order_by_param="-created_at"):
|
|
# Priority Ordering
|
|
if order_by_param == "priority" or order_by_param == "-priority":
|
|
issue_queryset = issue_queryset.annotate(
|
|
priority_order=Case(
|
|
*[
|
|
When(priority=p, then=Value(i))
|
|
for i, p in enumerate(PRIORITY_ORDER)
|
|
],
|
|
output_field=CharField(),
|
|
)
|
|
).order_by("priority_order", "-created_at")
|
|
order_by_param = (
|
|
"priority_order" if order_by_param.startswith("-") else "-priority_order"
|
|
)
|
|
# State Ordering
|
|
elif order_by_param in ["state__group", "-state__group"]:
|
|
state_order = (
|
|
STATE_ORDER
|
|
if order_by_param in ["state__name", "state__group"]
|
|
else STATE_ORDER[::-1]
|
|
)
|
|
issue_queryset = issue_queryset.annotate(
|
|
state_order=Case(
|
|
*[
|
|
When(state__group=state_group, then=Value(i))
|
|
for i, state_group in enumerate(state_order)
|
|
],
|
|
default=Value(len(state_order)),
|
|
output_field=CharField(),
|
|
)
|
|
).order_by("state_order", "-created_at")
|
|
order_by_param = (
|
|
"-state_order" if order_by_param.startswith("-") else "state_order"
|
|
)
|
|
# assignee and label ordering
|
|
elif order_by_param in [
|
|
"labels__name",
|
|
"assignees__first_name",
|
|
"issue_module__module__name",
|
|
"-labels__name",
|
|
"-assignees__first_name",
|
|
"-issue_module__module__name",
|
|
]:
|
|
issue_queryset = issue_queryset.annotate(
|
|
min_values=Min(
|
|
order_by_param[1::]
|
|
if order_by_param.startswith("-")
|
|
else order_by_param
|
|
)
|
|
).order_by(
|
|
"-min_values" if order_by_param.startswith("-") else "min_values",
|
|
"-created_at",
|
|
)
|
|
order_by_param = (
|
|
"-min_values" if order_by_param.startswith("-") else "min_values"
|
|
)
|
|
else:
|
|
# If the order_by_param is created_at, then don't add the -created_at
|
|
if "created_at" in order_by_param:
|
|
issue_queryset = issue_queryset.order_by(order_by_param)
|
|
else:
|
|
issue_queryset = issue_queryset.order_by(order_by_param, "-created_at")
|
|
order_by_param = order_by_param
|
|
return issue_queryset, order_by_param
|