Skip to content

Commit

Permalink
Merge pull request #72 from swecc-uw/signup-dashboard
Browse files Browse the repository at this point in the history
added endpoint for signup event observability
  • Loading branch information
elimelt authored Dec 29, 2024
2 parents f2f6fdf + 2e0c361 commit 6dd8601
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 32 deletions.
18 changes: 18 additions & 0 deletions server/interview/migrations/0006_interviewpool_timestamp.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.2.17 on 2024-12-23 09:10

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('interview', '0005_rename_technical_question_interview_technical_questions'),
]

operations = [
migrations.AddField(
model_name='interviewpool',
name='timestamp',
field=models.DateTimeField(auto_now_add=True, null=True),
),
]
1 change: 1 addition & 0 deletions server/interview/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ class InterviewPool(models.Model):
on_delete=models.CASCADE,
primary_key=True
)
timestamp = models.DateTimeField(auto_now_add=True, null=True)

def __str__(self):
return f"Interview Pool: {self.member}"
Expand Down
5 changes: 5 additions & 0 deletions server/interview/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,5 +76,10 @@
"assign/<uuid:interview_id>/",
views.InterviewAssignQuestionRandomIndividual.as_view(),
name="assign-interview-question"
),
path(
"signups/",
views.GetSignupData.as_view(),
name="get-signup-data"
)
]
95 changes: 63 additions & 32 deletions server/interview/views.py
Original file line number Diff line number Diff line change
@@ -1,35 +1,36 @@
from ast import In
from datetime import datetime
from datetime import datetime
from datetime import datetime, timedelta
from django.utils import timezone
import random
from rest_framework import generics
from rest_framework import generics, status, permissions
from rest_framework.permissions import IsAuthenticated
from django.db.models import Max
from rest_framework.response import Response
from rest_framework.views import APIView
from django.db.models import Max, Q
from django.core.exceptions import ValidationError
from django.db import transaction
import logging

import server.settings as settings
from questions.models import TechnicalQuestion, BehavioralQuestion
from questions.models import (
TechnicalQuestion,
BehavioralQuestion,
TechnicalQuestionQueue,
)
from custom_auth.permissions import IsAdmin, IsVerified
from members.serializers import UserSerializer
from members.models import User
from questions.models import TechnicalQuestion, BehavioralQuestion, TechnicalQuestionQueue
from questions.serializers import BehavioralQuestionSerializer, TechnicalQuestionSerializer
from questions.serializers import (
BehavioralQuestionSerializer,
TechnicalQuestionSerializer,
)
from .algorithm import CommonAvailabilityStableMatching
from .notification import (
interview_paired_notification_html,
interview_unpaired_notification_html,
send_email,
)
from .models import Interview
from .models import Interview, InterviewAvailability, InterviewPool
from .serializers import InterviewSerializer
from .models import InterviewAvailability, InterviewPool, Interview
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from django.core.exceptions import ValidationError
from rest_framework import permissions
from django.db import transaction
from django.utils import timezone
from django.db.models import Q
import logging

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -63,6 +64,30 @@ def is_valid_availability(availability):
)


class GetSignupData(APIView):
permission_classes = [IsAdmin]

def get(self, request):
days = int(request.query_params.get("days", 14))
end_date = timezone.now()
start_date = end_date - timedelta(days=days)

signups = InterviewPool.objects.filter(
timestamp__isnull=False, timestamp__gte=start_date, timestamp__lte=end_date
).values("member__username", "member_id", "timestamp")

signup_data = [
{
"username": signup["member__username"],
"user_id": signup["member_id"],
"timestamp": int(signup["timestamp"].timestamp() * 1000),
}
for signup in signups
]

return Response(signup_data)


# Create your views here.
class AuthenticatedMemberSignupForInterview(APIView):
permission_classes = [IsAuthenticated, IsVerified]
Expand Down Expand Up @@ -119,16 +144,19 @@ def post(self, request):

# Check if user is already in InterviewPool
try:
InterviewPool.objects.get(member=request.user)

ent = InterviewPool.objects.get(member=request.user)
ent.timestamp = timezone.now()
ent.save()
interview_availability.save()
logger.info(
f"User {request.user.username} updated their interview availability"
"User %s signed up for an interview at %s",
request.user.username,
ent.timestamp.isoformat(),
)
return Response(
{
"detail": "You have successfully updated your interview availability."
},
status=status.HTTP_200_OK,
{"detail": "You have successfully signed up for an interview."},
status=status.HTTP_201_CREATED,
)

except InterviewPool.DoesNotExist:
Expand Down Expand Up @@ -305,7 +333,10 @@ def post(self, request):
InterviewPool.objects.filter(member__in=[p1, p2]).delete()

# update question positions in queue
new_position = TechnicalQuestionQueue.objects.aggregate(Max('position'))['position__max'] + 1
new_position = (
TechnicalQuestionQueue.objects.aggregate(Max("position"))["position__max"]
+ 1
)
for tq in question_queues:
tq.position = new_position
tq.save()
Expand Down Expand Up @@ -531,12 +562,10 @@ def get(self, request, interview_id):
{
"interview_id": interview.interview_id,
"technical_questions": [
question
for question in interview.technical_questions.all()
question for question in interview.technical_questions.all()
],
"behavioral_questions": [
question
for question in interview.behavioral_questions.all()
question for question in interview.behavioral_questions.all()
],
}
)
Expand Down Expand Up @@ -983,13 +1012,15 @@ def get(self, request):

# question visibility
is_interviewer = interview.interviewer == request.user
interview_has_passed = interview.date_effective + timezone.timedelta(days=7) < timezone.now()
interview_has_passed = (
interview.date_effective + timezone.timedelta(days=7)
< timezone.now()
)
is_completed = interview.status in [
"inactive_completed",
"inactive_incomplete",
]


if not (is_interviewer or is_completed or interview_has_passed):
interview_data.pop("technical_questions", None)
interview_data.pop("behavioral_questions", None)
Expand Down

0 comments on commit 6dd8601

Please sign in to comment.