Skip to content

Commit 1806428

Browse files
committed
fixup!: apply review fixes
1 parent 8d6d690 commit 1806428

File tree

7 files changed

+25
-25
lines changed

7 files changed

+25
-25
lines changed

openedx/core/djangoapps/agreements/api.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -248,10 +248,10 @@ def get_user_agreements(user: User) -> Iterable[UserAgreementRecordData]:
248248
yield UserAgreementRecordData.from_model(agreement_record)
249249

250250

251-
def get_user_agreement_record(
251+
def get_latest_user_agreement_record(
252252
user: User,
253253
agreement_type: str,
254-
agreement_update_timestamp: datetime = None,
254+
agreed_after: datetime = None,
255255
) -> Optional[UserAgreementRecordData]:
256256
"""
257257
Retrieve the user agreement record for the specified user and agreement type.
@@ -264,9 +264,9 @@ def get_user_agreement_record(
264264
user=user,
265265
agreement_type=agreement_type,
266266
)
267-
if agreement_update_timestamp:
268-
record_query = record_query.filter(timestamp__gte=agreement_update_timestamp)
269-
record = record_query.get()
267+
if agreed_after:
268+
record_query = record_query.filter(timestamp__gte=agreed_after)
269+
record = record_query.latest("timestamp")
270270
return UserAgreementRecordData.from_model(record)
271271
except UserAgreementRecord.DoesNotExist:
272272
return None
@@ -277,11 +277,9 @@ def create_user_agreement_record(user: User, agreement_type: str) -> UserAgreeme
277277
Creates a user agreement record if one doesn't already exist, or updates existing
278278
record to current timestamp.
279279
"""
280-
record, _ = UserAgreementRecord.objects.update_or_create(
280+
record = UserAgreementRecord.objects.create(
281281
user=user,
282282
agreement_type=agreement_type,
283-
defaults={
284-
"timestamp": datetime.now(),
285-
},
283+
timestamp=datetime.now(),
286284
)
287285
return UserAgreementRecordData.from_model(record)

openedx/core/djangoapps/agreements/migrations/0006_useragreementrecord.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 4.2.16 on 2024-11-14 11:47
1+
# Generated by Django 4.2.16 on 2024-12-06 11:34
22

33
from django.conf import settings
44
from django.db import migrations, models
@@ -21,8 +21,5 @@ class Migration(migrations.Migration):
2121
('timestamp', models.DateTimeField(auto_now_add=True)),
2222
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
2323
],
24-
options={
25-
'unique_together': {('user', 'agreement_type')},
26-
},
2724
),
2825
]

openedx/core/djangoapps/agreements/models.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class UserAgreementRecord(models.Model):
7777
This model stores the agreements a user has accepted or acknowledged.
7878
7979
Each record here represents a user agreeing to the agreement type represented
80-
by `agreement_type`.
80+
by `agreement_type` at a particular time.
8181
8282
.. no_pii:
8383
"""
@@ -87,5 +87,3 @@ class UserAgreementRecord(models.Model):
8787

8888
class Meta:
8989
app_label = 'agreements'
90-
# A user can only have a single record for a single agreement type.
91-
unique_together = [['user', 'agreement_type']]

openedx/core/djangoapps/agreements/serializers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,6 @@ class UserAgreementsSerializer(serializers.Serializer):
3838
"""
3939
Serializer for UserAgreementRecord model
4040
"""
41-
accepted_at = serializers.DateTimeField()
42-
agreement_type = serializers.CharField(read_only=True)
4341
username = serializers.CharField(read_only=True)
42+
agreement_type = serializers.CharField(read_only=True)
43+
accepted_at = serializers.DateTimeField()

openedx/core/djangoapps/agreements/tests/test_api.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
get_integrity_signatures_for_course,
2222
get_lti_pii_signature,
2323
get_pii_receiving_lti_tools,
24-
get_user_agreement_record,
24+
get_latest_user_agreement_record,
2525
get_user_agreements
2626
)
2727
from ..models import LTIPIITool
@@ -214,11 +214,11 @@ def test_get_user_agreements(self, ):
214214

215215
def test_get_user_agreement_record(self):
216216
record = create_user_agreement_record(self.user, 'test_type')
217-
result = get_user_agreement_record(self.user, 'test_type')
217+
result = get_latest_user_agreement_record(self.user, 'test_type')
218218

219219
assert result == record
220220

221-
result = get_user_agreement_record(self.user, 'test_type', datetime.now() + timedelta(days=1))
221+
result = get_latest_user_agreement_record(self.user, 'test_type', datetime.now() + timedelta(days=1))
222222

223223
assert result is None
224224

openedx/core/djangoapps/agreements/tests/test_views.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,11 @@ class UserAgreementsViewTests(APITestCase):
301301

302302
def setUp(self):
303303
self.user = UserFactory(username="testuser", password="password")
304-
self.client.login(username="testuser", password="password")
305304
self.url = reverse('user_agreements', kwargs={'agreement_type': 'sample_agreement'})
305+
self.login()
306+
307+
def login(self):
308+
self.client.login(username="testuser", password="password")
306309

307310
def test_get_user_agreement_record_no_data(self):
308311
response = self.client.get(self.url)
@@ -326,6 +329,8 @@ def test_post_user_agreement(self):
326329
response = self.client.post(self.url)
327330
assert response.status_code == status.HTTP_201_CREATED
328331

332+
self.login()
333+
329334
response = self.client.get(self.url)
330335
assert response.status_code == status.HTTP_200_OK
331336

openedx/core/djangoapps/agreements/views.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@
2020
create_lti_pii_signature,
2121
create_user_agreement_record,
2222
get_integrity_signature,
23-
get_user_agreement_record
23+
get_latest_user_agreement_record
2424
)
2525
from .serializers import IntegritySignatureSerializer, LTIPIISignatureSerializer, UserAgreementsSerializer
26+
from ...lib.api.view_utils import view_auth_classes
2627

2728

2829
def is_user_course_or_global_staff(user, course_id):
@@ -167,7 +168,8 @@ def post(self, request, course_id):
167168
return Response(data=serializer.data, status=statusStr)
168169

169170

170-
class UserAgreementsView(AuthenticatedAPIView):
171+
@view_auth_classes(is_authenticated=True)
172+
class UserAgreementsView(APIView):
171173
"""
172174
Endpoint for the user agreements API.
173175
"""
@@ -207,7 +209,7 @@ def get(self, request, agreement_type):
207209
params = UserAgreementsView.QueryFilterForm(request.query_params)
208210
if not params.is_valid():
209211
return Response(status=status.HTTP_400_BAD_REQUEST)
210-
record = get_user_agreement_record(request.user, agreement_type, params.cleaned_data.get('after'))
212+
record = get_latest_user_agreement_record(request.user, agreement_type, params.cleaned_data.get('after'))
211213
if record is None:
212214
return Response(status=status.HTTP_404_NOT_FOUND)
213215
serializer = UserAgreementsSerializer(record)

0 commit comments

Comments
 (0)