44
55import logging
66from datetime import datetime
7- from typing import Iterable , Optional
7+ from typing import Optional , Iterator
88
99from django .contrib .auth import get_user_model
1010from django .core .exceptions import ObjectDoesNotExist
1111from opaque_keys .edx .keys import CourseKey
1212
13- from .data import LTIPIISignatureData , LTIToolsReceivingPIIData , UserAgreementRecordData
14- from .models import IntegritySignature , LTIPIISignature , LTIPIITool , UserAgreementRecord
13+ from openedx .core .djangoapps .agreements .data import (
14+ LTIPIISignatureData ,
15+ LTIToolsReceivingPIIData ,
16+ UserAgreementRecordData
17+ )
18+ from openedx .core .djangoapps .agreements .models import (
19+ IntegritySignature ,
20+ LTIPIISignature ,
21+ LTIPIITool ,
22+ UserAgreementRecord , UserAgreement
23+ )
1524
1625log = logging .getLogger (__name__ )
1726User = get_user_model ()
@@ -240,11 +249,11 @@ def _user_signature_out_of_date(username, course_id):
240249 return user_lti_pii_signature_hash != course_lti_pii_tools_hash
241250
242251
243- def get_user_agreement_records (user : User ) -> Iterable [UserAgreementRecordData ]:
252+ def get_user_agreement_records (user : User ) -> Iterator [UserAgreementRecordData ]:
244253 """
245254 Retrieves all the agreements that the specified user has acknowledged.
246255 """
247- for agreement_record in UserAgreementRecord .objects .filter (user = user ).select_related ("agreement" ):
256+ for agreement_record in UserAgreementRecord .objects .filter (user = user ).select_related ("agreement" , "user" ):
248257 yield UserAgreementRecordData .from_model (agreement_record )
249258
250259
@@ -258,25 +267,26 @@ def get_latest_user_agreement_record(
258267 An agreement update timestamp can be provided to return a record only if it
259268 was signed after that timestamp.
260269 """
261- try :
262- record_query = UserAgreementRecord .objects .filter (
263- user = user ,
264- agreement__type = agreement_type ,
265- )
266- record = record_query .latest ("timestamp" )
267- return UserAgreementRecordData .from_model (record )
268- except UserAgreementRecord .DoesNotExist :
269- return None
270+ record_query = UserAgreementRecord .objects .filter (
271+ user = user ,
272+ agreement__type = agreement_type ,
273+ )
274+ if record_query .exists ():
275+ return UserAgreementRecordData .from_model (record_query .latest ("timestamp" ))
276+ return UserAgreementRecordData (
277+ username = user .get_username (),
278+ agreement_type = agreement_type ,
279+ )
270280
271281
272282def create_user_agreement_record (user : User , agreement_type : str ) -> UserAgreementRecordData :
273283 """
274- Creates a user agreement record if one doesn't already exist, or updates existing
275- record to current timestamp.
284+ Creates a user agreement record with current timestamp.
276285 """
286+ agreement = UserAgreement .objects .get (type = agreement_type )
277287 record = UserAgreementRecord .objects .create (
278288 user = user ,
279- agreement__type = agreement_type ,
289+ agreement = agreement ,
280290 timestamp = datetime .now (),
281291 )
282292 return UserAgreementRecordData .from_model (record )
0 commit comments