Skip to content

Commit d09c620

Browse files
committed
feat: Add API endpoint for active users
- Add UsersActiveApi client class - Update users API client to include active endpoint - Implement AllActiveUsersAPIView for active users - Add URL path for active users endpoint
1 parent 51ce16b commit d09c620

4 files changed

Lines changed: 41 additions & 10 deletions

File tree

client/src/clients/api/users.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export class UsersApi extends ApiClientBase {
1111
readonly skills: UsersSkillsApi
1212
readonly team: UsersTeamApi
1313
readonly supervisors: UsersSupervisorsApi
14+
readonly active: UsersActiveApi
1415

1516
constructor(options: Api.ClientOptions) {
1617
super(options)
@@ -22,6 +23,7 @@ export class UsersApi extends ApiClientBase {
2223
this.skills = new UsersSkillsApi(options, this.path)
2324
this.team = new UsersTeamApi(options, this.path)
2425
this.supervisors = new UsersSupervisorsApi(options, this.path)
26+
this.active = new UsersActiveApi(options, this.path)
2527
}
2628

2729
list(query?: any) {
@@ -155,3 +157,11 @@ class UsersTeamSupervisorsApi extends ApiClientBase {
155157
)
156158
}
157159
}
160+
161+
class UsersActiveApi extends ApiClientBase {
162+
protected readonly path = '/active'
163+
164+
async list() {
165+
return this.unwrap(() => this.$http.get(this.getUrl()))
166+
}
167+
}

client/src/views/RequestsView.vue

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -210,11 +210,10 @@ export default defineComponent({
210210
const fetchUsers = async () => {
211211
isLoadingUsers.value = true;
212212
try {
213-
// Use general list endpoint which is accessible by all authenticated users
214-
const result = await $api.users.list({ page_size: 1000 });
215-
if (result) {
216-
users.value = result.results;
217-
}
213+
// Use the new accessible active users endpoint
214+
// This returns directly the array of users (data)
215+
const result: any = await $api.users.active.list();
216+
users.value = result;
218217
} catch (e) {
219218
console.error("Failed to fetch users", e)
220219
} finally {

server/cshr/routes/users.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@
1717
SupervisorsAPIView,
1818
PostUserSkillsAPIView,
1919
GetUsersBirthDatesAPIView,
20+
AllActiveUsersAPIView,
2021
)
2122

2223

2324
urlpatterns = [
2425
path("", BaseGeneralUserAPIView.as_view()),
26+
path("active/", AllActiveUsersAPIView.as_view()),
2527
path("set_inactive/", SetInActiveUserAPIView.as_view()),
2628
path("set_active/", SetActiveUserAPIView.as_view()),
2729
path("skills/", UserSkillsAPIView.as_view()),

server/cshr/views/users.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,6 @@ def get_queryset(self) -> Response:
6060
query_set = get_all_of_users(options)
6161
else:
6262
query_set = get_all_of_users()
63-
64-
full_name = self.request.query_params.get("full_name")
65-
if full_name:
66-
query_set = query_set.filter(first_name__icontains=full_name)
67-
6863
return query_set
6964

7065

@@ -425,3 +420,28 @@ def get(self, request: Request) -> Response:
425420
query_set = get_admins_and_supervisors()
426421
serializer = self.get_serializer(query_set, many=True)
427422
return CustomResponse.success(data=serializer.data)
423+
424+
425+
class AllActiveUsersAPIView(GenericAPIView):
426+
"""
427+
A view for retrieving a list of all active users without pagination.
428+
Accessible to all authenticated users.
429+
"""
430+
431+
serializer_class = GeneralUserSerializer
432+
permission_classes = [UserIsAuthenticated]
433+
434+
def get(self, request: Request) -> Response:
435+
# Get all users (which includes active filtering if we use the service usually or we filter explicitly)
436+
# get_all_of_users returns queryset ordered by name.
437+
# We need to ensure we only get active uses.
438+
439+
from cshr.services.users import get_all_of_users
440+
441+
# get_all_of_users() implementation:
442+
# queryset = User.objects.filter(is_active=True)
443+
# ... and handles options.
444+
445+
query_set = get_all_of_users()
446+
serializer = self.get_serializer(query_set, many=True)
447+
return CustomResponse.success(data=serializer.data)

0 commit comments

Comments
 (0)