Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 3 additions & 104 deletions api/dashboard/learningcircle/learningcircle_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ class LearningCircleDetailSerializer(serializers.ModelSerializer):
ig = serializers.CharField(source="ig.name", read_only=True)
org = serializers.CharField(source="org.title", read_only=True, allow_null=True)
created_by = serializers.SerializerMethodField()
total_members = serializers.IntegerField(read_only=True)

class Meta:
model = LearningCircle
Expand All @@ -119,14 +120,14 @@ class Meta:
"description",
"org",
"created_by",
"total_members",
]

def to_representation(self, instance):
# Override to add calculated fields that don't exist on the model
data = super().to_representation(instance)
data['rank'] = self.get_rank(instance)
data['total_karma'] = self.get_total_karma(instance)
data['total_members'] = self.get_total_members(instance)
data['next_meetup'] = self.get_next_meetup(instance)
return data

Expand All @@ -140,13 +141,6 @@ def get_created_by(self, obj):
"muid": obj.created_by.muid,
}

def get_total_members(self, obj):
"""Calculate total number of accepted members in this circle"""
return UserCircleLink.objects.filter(
circle=obj.id,
accepted=True,
).count()

@property
def _all_circle_rankings_data(self):
"""
Expand Down Expand Up @@ -296,40 +290,6 @@ def get_is_creator(self, obj):
return False
return obj.created_by_id == user_id

# def get_attendees(self, obj):
# query = (
# obj.circle_meeting_log_circle_id.prefetch_related(
# "circle_meeting_attendance_meet_id"
# )
# .all()
# .only("circle_meeting_attendance_meet_id__user_id")
# )
# data = []
# user_id = self.context.get("user_id")
# cur_user_org = None
# if user_id:
# try:
# cur_user = (
# User.objects.prefetch_related("user_organization_link_user")
# .only("user_organization_link_user__org_id")
# .get(id=user_id)
# )
# cur_user_org = cur_user.user_organization_link_user__org_id
# except:
# pass
# for attendee in query.:
# data.append(
# {
# "full_name": attendee.user_id.full_name,
# "is_same_org": cur_user_org
# in attendee.user_id.user_organization_link_user.all().values_list(
# "org_id", flat=True
# ),
# }
# )
# return data
# return []


class CircleMeetingLogCreateEditSerializer(serializers.ModelSerializer):
ONLINE_PLATFORM_CHOICES = ("Zoom", "Google Meet", "Microsoft Teams","Discord", "Other")
Expand Down Expand Up @@ -390,7 +350,7 @@ def create(self, validated_data):
validated_data.pop("platform", None) # platform is not a DB field; used only in validate()
meet = CircleMeetingLog.objects.create(**validated_data)
CircleMeetingAttendees.objects.create(
meet_id=meet, user_id_id=user_id, is_joined=True, joined_at=datetime.now()
meet_id=meet, user_id_id=user_id, is_joined=True, joined_at=DateTimeUtils.get_current_utc_time()
)
return meet

Expand Down Expand Up @@ -481,15 +441,6 @@ def validate(self, attrs):

return super().validate(attrs)

# def validate_circle_id(self, value):
# if CircleMeetingLog.objects.filter(
# circle_id=value, is_report_submitted=False
# ).exists():
# raise serializers.ValidationError(
# "There is already an ongoing meeting for this learning circle"
# )
# return value

class Meta:
model = CircleMeetingLog
fields = [
Expand Down Expand Up @@ -723,7 +674,6 @@ class CircleMeetupMinSerializer(serializers.ModelSerializer):
coord_y = serializers.FloatField(read_only=True)
meet_place = serializers.CharField(read_only=True)
meet_time = serializers.DateTimeField(read_only=True)
# meet_code = serializers.CharField(read_only=True)
circle_id = serializers.CharField(read_only=True, source="circle_id.id")
is_started = serializers.SerializerMethodField()
is_ended = serializers.SerializerMethodField()
Expand Down Expand Up @@ -775,7 +725,6 @@ class Meta:
"recurrence",
"meet_place",
"is_rsvp",
# "meet_code",
"circle_id",
"coord_x",
"coord_y",
Expand All @@ -789,56 +738,6 @@ class Meta:
"created_by_id",
]


# # class LearningCircleKarmaSerializer(serializers.ModelSerializer):
# total_karma = serializers.SerializerMethodField()
# rank = serializers.SerializerMethodField()
# member_count = serializers.SerializerMethodField()

# class Meta:
# model = LearningCircle
# fields = ['id', 'title', 'ig', 'total_karma', 'rank', 'member_count']

# def get_total_karma(self, obj):
# # Get all members (attendees) of this circle's meetings
# members = CircleMeetingAttendees.objects.filter(
# meet_id__circle_id=obj,
# is_joined=True
# ).values_list('user_id', flat=True).distinct()

# # Sum karma points for these members related to this circle's interest group
# total_karma = 0
# for member_id in members:
# # Filter KarmaActivityLog for the member and tasks related to the specific IG
# user_karma = KarmaActivityLog.objects.filter(
# user_id=member_id, # Filter by user
# task__ig=obj.ig, # Filter by the IG related to the task
# ).aggregate(total=models.Sum('karma'))['total'] or 0
# total_karma += user_karma

# return total_karma

# def get_rank(self, obj):
# # Get all circles and sort by karma
# all_circles = LearningCircle.objects.all()
# ranked_circles = sorted(
# all_circles,
# key=lambda circle: self.get_total_karma(circle),
# reverse=True
# )

# # Find position of current circle
# for index, circle in enumerate(ranked_circles):
# if circle.id == obj.id:
# return index + 1 # 1-based ranking
# return None

# def get_member_count(self, obj):
# return CircleMeetingAttendees.objects.filter(
# meet_id__circle_id=obj,
# is_joined=True
# ).values('user_id').distinct().count()

# --- New Serializers ---


Expand Down
24 changes: 3 additions & 21 deletions api/dashboard/learningcircle/learningcircle_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,10 @@ class LearningCircleView(APIView):
def get(self, request, circle_id: str = None):
user_id = JWTUtils.fetch_user_id(request)
if circle_id:
learning_circle = LearningCircle.objects.get(id=circle_id)
# circle_meetings = CircleMeetingLog.objects.filter(
# circle_id=learning_circle, is_report_submitted=True
# )
learning_circle = LearningCircle.objects.select_related("ig", "org", "created_by").annotate(
total_members=Count('user_circle_link_circle', filter=Q(user_circle_link_circle__accepted=True))
).get(id=circle_id)
serializer = LearningCircleDetailSerializer(learning_circle)
# meetings_serializer = CircleMeetingLogListSerializer(
# circle_meetings, many=True
# )
return CustomResponse(
general_message="Learning Circle fetched successfully",
response={**serializer.data},
Expand Down Expand Up @@ -896,9 +892,6 @@ def get(self, request):
participated = request_data.get("participated", "0")
saved = str(saved).lower() in ("true", "1")
participated = str(participated).lower() in ("true", "1")
# no_location = request_data.get("no_location")
lat = request_data.get("lat")
lon = request_data.get("lon")
user_id = None
if JWTUtils.is_jwt_authenticated(request):
user_id = JWTUtils.fetch_user_id(request)
Expand All @@ -920,14 +913,6 @@ def get(self, request):

if category != "all" and isinstance(category, str):
category = [category]
# if not no_location and not lat and not lon:
# user_ip = request.META.get("REMOTE_ADDR")
# ipinfo_api_url = f"http://ip-api.com/json/{user_ip}?fields=status,lat,lon"
# response = requests.get(ipinfo_api_url)
# location_data = response.json()
# if location_data.get("status") == "success":
# lat = location_data.get("lat")
# lon = location_data.get("lon")
if saved:
filter = Q(user_id=user_id, is_joined=False)
elif participated:
Expand All @@ -945,9 +930,6 @@ def get(self, request):
filter = Q(id__in=user_meetups)
else:
filter = Q()
# filter = Q(
# meet_time__gte=DateTimeUtils.get_current_utc_time() - timedelta(hours=2)
# ) | Q(id__in=user_meetups)
meetings = CircleMeetingLog.objects.filter(filter).order_by("meet_time")
if category and category != "all" and isinstance(category, list):
meetings = meetings.select_related("circle_id__ig").filter(
Expand Down
26 changes: 7 additions & 19 deletions api/dashboard/mentor/mentor_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,8 @@ def patch(self, request):
response_serializer = serializers.MentorDetailSerializer(mentor)
response_data = response_serializer.data
socials = Socials.objects.filter(user_id=user_id).first()
response_data['linkedin'] = socials.linkedin if socials else None
# If a new URL is pending verification, omit the stale value but keep the key present so the response shape stays consistent.
response_data['linkedin'] = None if linkedin_url else (socials.linkedin if socials else None)

return CustomResponse(
general_message=general_message,
Expand Down Expand Up @@ -456,27 +457,14 @@ def post(self, request):
if UserMentor.objects.filter(user_id=user_id, org=new_company_org, status=UserMentor.Status.APPROVED).exists():
return CustomResponse(general_message="You are already an approved mentor for this company.").get_failure_response()


# Prioritize the most recently updated approved profile as the source for user's data.
existing_mentor_profile = UserMentor.objects.filter(
user_id=user_id,
status=UserMentor.Status.APPROVED,
mentor_tier=UserMentor.MentorTier.MENTOR
).first()

if not existing_mentor_profile:

tier_order = Case(
When(mentor_tier=UserMentor.MentorTier.COMPANY_MENTOR, then=0),
When(mentor_tier=UserMentor.MentorTier.CAMPUS_MENTOR, then=1),
When(mentor_tier=UserMentor.MentorTier.IG_MENTOR, then=2),
default=3
)
existing_mentor_profile = UserMentor.objects.filter(
user_id=user_id, status=UserMentor.Status.APPROVED
).order_by(tier_order, '-updated_at').first()

status=UserMentor.Status.APPROVED
).order_by('-updated_at').first()

if not existing_mentor_profile:
# Fallback if no approved profile exists (e.g., only rejected/pending)
# Fallback to any profile if no approved one exists (e.g., only rejected/pending applications).
existing_mentor_profile = UserMentor.objects.filter(user_id=user_id).order_by('-updated_at').first()

new_mentor_app = UserMentor.objects.create(
Expand Down