Skip to content

Commit 9ddfaf7

Browse files
committed
fixup!: Adds documentation for the code
1 parent 78861a4 commit 9ddfaf7

4 files changed

Lines changed: 68 additions & 3 deletions

File tree

openedx/core/djangoapps/agreements/api.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,9 @@ def _user_signature_out_of_date(username, course_id):
244244

245245

246246
def get_user_agreements(user: User) -> Iterable[UserAgreementRecordData]:
247+
"""
248+
Retrieves all the agreements that the specified user has acknowledged.
249+
"""
247250
for agreement_record in UserAgreementRecord.objects.filter(user=user):
248251
yield UserAgreementRecordData.from_model(agreement_record)
249252

@@ -253,6 +256,12 @@ def get_user_agreement_record(
253256
agreement_type: str,
254257
agreement_update_timestamp: datetime = None,
255258
) -> Optional[UserAgreementRecordData]:
259+
"""
260+
Retrieve the user agreement record for the specified user and agreement type.
261+
262+
An agreement update timestamp can be provided to return a record only if it
263+
was signed after that timestamp.
264+
"""
256265
try:
257266
record_query = UserAgreementRecord.objects.filter(
258267
user=user,
@@ -267,6 +276,10 @@ def get_user_agreement_record(
267276

268277

269278
def create_user_agreement_record(user: User, agreement_type: str) -> UserAgreementRecordData:
279+
"""
280+
Creates a user agreement record if one doesn't already exist, or updates existing
281+
record to current timestamp.
282+
"""
270283
record, _ = UserAgreementRecord.objects.update_or_create(
271284
user=user,
272285
agreement_type=agreement_type,
@@ -275,4 +288,3 @@ def create_user_agreement_record(user: User, agreement_type: str) -> UserAgreeme
275288
},
276289
)
277290
return UserAgreementRecordData.from_model(record)
278-

openedx/core/djangoapps/agreements/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,5 @@ class UserAgreementRecord(models.Model):
8686

8787
class Meta:
8888
app_label = 'agreements'
89+
# A user can only have a single record for a single agreement type.
8990
unique_together = [['user', 'agreement_type']]

openedx/core/djangoapps/agreements/serializers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""
44
from rest_framework import serializers
55

6-
from openedx.core.djangoapps.agreements.models import IntegritySignature, LTIPIISignature, UserAgreementRecord
6+
from openedx.core.djangoapps.agreements.models import IntegritySignature, LTIPIISignature
77
from openedx.core.lib.api.serializers import CourseKeyField
88

99

@@ -33,4 +33,7 @@ class Meta:
3333
fields = ('username', 'course_id', 'lti_tools', 'created_at')
3434

3535
class UserAgreementsSerializer(serializers.Serializer):
36+
"""
37+
Serializer for UserAgreementRecord model
38+
"""
3639
accepted_at = serializers.DateTimeField()

openedx/core/djangoapps/agreements/views.py

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
"""
22
Views served by the Agreements app
33
"""
4-
from os import times
54

5+
import edx_api_doc_tools as apidocs
66
from django.conf import settings
77
from django import forms
8+
from drf_yasg import openapi
89
from rest_framework import status
910
from rest_framework.views import APIView
1011
from rest_framework.response import Response
1112
from rest_framework.permissions import IsAuthenticated
1213
from opaque_keys.edx.keys import CourseKey
1314

15+
1416
from common.djangoapps.student import auth
1517
from common.djangoapps.student.roles import CourseStaffRole
1618
from openedx.core.djangoapps.agreements.api import (
@@ -165,11 +167,42 @@ def post(self, request, course_id):
165167

166168

167169
class UserAgreementsView(AuthenticatedAPIView):
170+
"""
171+
Endpoint for the user agreements API.
172+
"""
168173

169174
class QueryFilterForm(forms.Form):
175+
"""
176+
Query parameters for the GET method.
177+
"""
170178
after = forms.DateTimeField(required=False)
171179

180+
@apidocs.schema(
181+
parameters=[
182+
apidocs.string_parameter(
183+
'agreement_type',
184+
apidocs.ParameterLocation.PATH,
185+
description="Agreement ID/Type",
186+
),
187+
openapi.Parameter(
188+
'after',
189+
apidocs.ParameterLocation.QUERY,
190+
required=False,
191+
type=openapi.TYPE_STRING,
192+
format=openapi.FORMAT_DATETIME,
193+
description="Return records after this date/time",
194+
),
195+
],
196+
responses={
197+
200: UserAgreementsSerializer,
198+
400: "Bad Request",
199+
404: "Not Found",
200+
},
201+
)
172202
def get(self, request, agreement_type):
203+
"""
204+
Get a user's acknowledgement record for this agreement type.
205+
"""
173206
params = UserAgreementsView.QueryFilterForm(request.query_params)
174207
if not params.is_valid():
175208
return Response(status=status.HTTP_400_BAD_REQUEST)
@@ -179,7 +212,23 @@ def get(self, request, agreement_type):
179212
serializer = UserAgreementsSerializer(record)
180213
return Response(serializer.data)
181214

215+
@apidocs.schema(
216+
parameters=[
217+
apidocs.string_parameter(
218+
'agreement_type',
219+
apidocs.ParameterLocation.PATH,
220+
description="Agreement ID/Type",
221+
),
222+
],
223+
responses={
224+
200: UserAgreementsSerializer,
225+
400: "Bad Request",
226+
},
227+
)
182228
def post(self, request, agreement_type):
229+
"""
230+
Marks a user's acknowledgement of this agreement type.
231+
"""
183232
record = create_user_agreement_record(request.user, agreement_type)
184233
serializer = UserAgreementsSerializer(record)
185234
return Response(serializer.data, status=status.HTTP_201_CREATED)

0 commit comments

Comments
 (0)