You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
5.9 KiB
194 lines
5.9 KiB
from rest_framework import serializers
|
|
from drf_spectacular.utils import extend_schema_field
|
|
from apps.events.models import Event, EventRegistration, RegistrationStatus, EventCategory, LocationType
|
|
from apps.profiles.models import Institution, InstitutionMember
|
|
from apps.account.models import User
|
|
|
|
|
|
class EventOrganizerMinimalSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Institution
|
|
fields = ['id', 'name', 'slug', 'type', 'city', 'country', 'avatar', 'verification_status']
|
|
|
|
|
|
class EventListSerializer(serializers.ModelSerializer):
|
|
organizer = EventOrganizerMinimalSerializer(read_only=True)
|
|
|
|
class Meta:
|
|
model = Event
|
|
fields = [
|
|
'id',
|
|
'title',
|
|
'slug',
|
|
'category',
|
|
'event_date',
|
|
'start_time',
|
|
'end_time',
|
|
'speaker_name',
|
|
'speaker_title',
|
|
'speaker_avatar',
|
|
'location_type',
|
|
'venue_address',
|
|
'cover_image',
|
|
'capacity',
|
|
'registration_count',
|
|
'is_active',
|
|
'is_featured',
|
|
'language',
|
|
'tags',
|
|
'organizer',
|
|
'created_at',
|
|
]
|
|
|
|
|
|
class EventDetailSerializer(serializers.ModelSerializer):
|
|
organizer = EventOrganizerMinimalSerializer(read_only=True)
|
|
is_registered = serializers.SerializerMethodField()
|
|
my_registration = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Event
|
|
fields = [
|
|
'id',
|
|
'title',
|
|
'slug',
|
|
'description',
|
|
'category',
|
|
'event_date',
|
|
'start_time',
|
|
'end_time',
|
|
'speaker_name',
|
|
'speaker_title',
|
|
'speaker_avatar',
|
|
'location_type',
|
|
'venue_address',
|
|
'online_meeting_url',
|
|
'cover_image',
|
|
'capacity',
|
|
'registration_count',
|
|
'is_active',
|
|
'is_featured',
|
|
'language',
|
|
'tags',
|
|
'organizer',
|
|
'is_registered',
|
|
'my_registration',
|
|
'created_at',
|
|
'updated_at',
|
|
]
|
|
|
|
@extend_schema_field(serializers.BooleanField())
|
|
def get_is_registered(self, obj) -> bool:
|
|
request = self.context.get('request')
|
|
if not request or not request.user or not request.user.is_authenticated:
|
|
return False
|
|
return obj.registrations.filter(user=request.user, status=RegistrationStatus.REGISTERED).exists()
|
|
|
|
@extend_schema_field(serializers.DictField(allow_null=True))
|
|
def get_my_registration(self, obj):
|
|
request = self.context.get('request')
|
|
if not request or not request.user or not request.user.is_authenticated:
|
|
return None
|
|
reg = obj.registrations.filter(user=request.user).first()
|
|
if not reg:
|
|
return None
|
|
return {
|
|
'id': reg.id,
|
|
'status': reg.status,
|
|
'registered_at': reg.registered_at,
|
|
'notes': reg.notes,
|
|
}
|
|
|
|
|
|
class EventCreateUpdateSerializer(serializers.ModelSerializer):
|
|
organizer_id = serializers.PrimaryKeyRelatedField(
|
|
queryset=Institution.objects.all(),
|
|
source='organizer',
|
|
write_only=True
|
|
)
|
|
|
|
class Meta:
|
|
model = Event
|
|
fields = [
|
|
'id',
|
|
'title',
|
|
'description',
|
|
'organizer_id',
|
|
'category',
|
|
'event_date',
|
|
'start_time',
|
|
'end_time',
|
|
'speaker_name',
|
|
'speaker_title',
|
|
'speaker_avatar',
|
|
'location_type',
|
|
'venue_address',
|
|
'online_meeting_url',
|
|
'cover_image',
|
|
'capacity',
|
|
'is_active',
|
|
'is_featured',
|
|
'language',
|
|
'tags',
|
|
]
|
|
|
|
def validate(self, attrs):
|
|
request = self.context.get('request')
|
|
user = request.user if request else None
|
|
organizer = attrs.get('organizer') or (self.instance.organizer if self.instance else None)
|
|
|
|
if user and not (user.is_superuser or getattr(user, 'user_type', None) in ['super_admin', 'regional_admin']):
|
|
if organizer:
|
|
is_member = InstitutionMember.objects.filter(
|
|
institution=organizer,
|
|
user=user,
|
|
role__in=['admin', 'editor']
|
|
).exists()
|
|
if not is_member:
|
|
raise serializers.ValidationError({"organizer_id": "You are not authorized to manage events for this institution."})
|
|
|
|
return attrs
|
|
|
|
def create(self, validated_data):
|
|
request = self.context.get('request')
|
|
if request and request.user.is_authenticated:
|
|
validated_data['created_by'] = request.user
|
|
return super().create(validated_data)
|
|
|
|
|
|
class EventParticipantUserSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = User
|
|
fields = ['id', 'email', 'fullname', 'avatar']
|
|
|
|
|
|
class EventRegistrationSerializer(serializers.ModelSerializer):
|
|
user = EventParticipantUserSerializer(read_only=True)
|
|
|
|
class Meta:
|
|
model = EventRegistration
|
|
fields = ['id', 'event', 'user', 'status', 'notes', 'registered_at']
|
|
read_only_fields = ['id', 'event', 'user', 'registered_at']
|
|
|
|
|
|
class EventRegisterInputSerializer(serializers.Serializer):
|
|
notes = serializers.CharField(required=False, allow_blank=True, default="")
|
|
|
|
|
|
class EventCalendarItemSerializer(serializers.ModelSerializer):
|
|
organizer_name = serializers.CharField(source='organizer.name', read_only=True)
|
|
|
|
class Meta:
|
|
model = Event
|
|
fields = [
|
|
'id',
|
|
'title',
|
|
'slug',
|
|
'category',
|
|
'event_date',
|
|
'start_time',
|
|
'end_time',
|
|
'location_type',
|
|
'organizer_name',
|
|
'is_featured',
|
|
]
|