Add UI and API for expressing interest in a course

This commit is contained in:
2022-05-04 01:27:50 +00:00
parent 12e0e7441b
commit 29980025fb
7 changed files with 166 additions and 70 deletions

View File

@@ -142,6 +142,13 @@ class Training(models.Model):
history = HistoricalRecords()
class Interest(models.Model):
user = models.ForeignKey(User, related_name='interests', null=True, on_delete=models.SET_NULL)
course = models.ForeignKey(Course, related_name='courses', null=True, on_delete=models.SET_NULL)
satisfied_by = models.ForeignKey(Session, related_name='satisfies', null=True, on_delete=models.SET_NULL)
class MetaInfo(models.Model):
backup_id = models.TextField()

View File

@@ -521,10 +521,18 @@ class UserTrainingSerializer(serializers.ModelSerializer):
exclude = ['user']
depth = 2
class InterestSerializer(serializers.ModelSerializer):
course = serializers.PrimaryKeyRelatedField(queryset=models.Course.objects.all())
class Meta:
model = models.Interest
fields = '__all__'
read_only_fields = ['user', 'satisfied_by']
class UserSerializer(serializers.ModelSerializer):
training = UserTrainingSerializer(many=True)
member = MemberSerializer()
transactions = serializers.SerializerMethodField()
interests = serializers.SerializerMethodField()
door_code = serializers.SerializerMethodField()
wifi_pass = serializers.SerializerMethodField()
app_version = serializers.SerializerMethodField()
@@ -543,6 +551,7 @@ class UserSerializer(serializers.ModelSerializer):
'wifi_pass',
'app_version',
#'usages',
'interests',
]
depth = 1
@@ -554,6 +563,13 @@ class UserSerializer(serializers.ModelSerializer):
serializer.is_valid()
return serializer.data
def get_interests(self, obj):
interests = models.Interest.objects.filter(
user=obj,
satisfied_by__isnull=True
)
return [x.course.id for x in interests]
def get_door_code(self, obj):
if not obj.member.paused_date and obj.cards.count():
return secrets.DOOR_CODE

View File

@@ -992,6 +992,24 @@ class UsageViewSet(Base):
return response
class InterestViewSet(Base, Retrieve, Create):
permission_classes = [AllowMetadata | IsAuthenticated]
queryset = models.Interest.objects.all()
serializer_class = serializers.InterestSerializer
def perform_create(self, serializer):
user = self.request.user
course = self.request.data['course']
interest = models.Interest.objects.filter(user=user, course=course, satisfied_by__isnull=True)
if interest.exists():
raise exceptions.ValidationError(dict(non_field_errors='Already interested'))
serializer.save(
user=user,
satisfied_by=None
)
class RegistrationView(RegisterView):
serializer_class = serializers.MyRegisterSerializer

View File

@@ -21,6 +21,7 @@ router.register(r'history', views.HistoryViewSet, basename='history')
router.register(r'vetting', views.VettingViewSet, basename='vetting')
router.register(r'sessions', views.SessionViewSet, basename='session')
router.register(r'training', views.TrainingViewSet, basename='training')
router.register(r'interest', views.InterestViewSet, basename='interest')
router.register(r'transactions', views.TransactionViewSet, basename='transaction')
router.register(r'charts/membercount', views.MemberCountViewSet, basename='membercount')
router.register(r'charts/signupcount', views.SignupCountViewSet, basename='signupcount')