Students can't see certificates in Palm

Wow! That was incredibly awesome of you to go the extra mile like that!

Unfortunately I can’t see anything I’m missing, and it’s still not working.

(I do think I found one issue with Google Analytics 4 that I mentioned here, where I couldn’t generate the preview certificate, but I removed GA4 and could get back to generating the preview.)

I made a new test class, and I also enabled the “certificates can be downloaded before the end” that @sbernesto recommended, but that still didn’t yield automatic certificate generation. On the test class, it works better than my existing imported classes, in the sense that it shows the “Request certificate” as shown below, but that’s not the “View Certificate” what was shown in the video, and which I’m going for. (However, if it doesn’t work for my classes that existed before the upgrade, that would be a problem for upgrading my production server.)

Just in case there was a typo or something, I also deleted and re-added the certificates.auto_certificate_generation, copying and pasting it from the page like you did. However, it seems like it’s this configuration which isn’t taking effect for whatever reason.

Any ideas on logs I could check? Because right now I’m not seeing any errors in tutor local logs --tail=1 -f. This is what I see when the student refreshes the Progress page:

mfe-1                | {"level":"info","ts":1712838944.203131,"logger":"http.log.access.log0","msg":"handled request","request":{"remote_ip":"172.123.123.123","remote_port":"49270","proto":"HTTP/1.1","method":"GET","host":"apps.mysite.com","uri":"/learning/course/course-v1:deleteme_test2+deleteme_test2+deleteme_test2/progress"},"user_id":"","duration":0.000199803,"size":0,"status":304}
caddy-1              | {"level":"info","ts":1712838944.203569,"logger":"http.log.access.log2","msg":"handled request","request":{"remote_ip":"123.123.123.123","remote_port":"53542","proto":"HTTP/2.0","method":"GET","host":"apps.mysite.com","uri":"/learning/course/course-v1:deleteme_test2+deleteme_test2+deleteme_test2/progress","tls":{"resumed":true,"version":772,"cipher_suite":4865,"proto":"h2","server_name":"apps.mysite.com"}},"user_id":"","duration":0.000940413,"size":0,"status":304}
mysql-1              | 2024-04-11T12:35:45.441525Z 527 [Warning] [MY-013360] [Server] Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
lms-1                | 2024-04-11 12:35:45,444 INFO 13 [tracking] [user 5] [ip 172.123.123.123] logger.py:41 - {"name": "/api/mfe_config/v1", "context": {"user_id": 5, "path": "/api/mfe_config/v1", "course_id": "", "org_id": "", "enterprise_uuid": ""}, "username": "student", "session": "4e31ea20c7e4bbac3065620d54c77b80", "ip": "172.123.123.123", "agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0", "host": "mysite.com", "referer": "https://apps.mysite.com/learning/course/course-v1:deleteme_test2+deleteme_test2+deleteme_test2/progress", "accept_language": "en-US,en;q=0.5", "event": "{\"GET\": {\"mfe\": [\"learning\"]}, \"POST\": {}}", "time": "2024-04-11T12:35:45.444000+00:00", "event_type": "/api/mfe_config/v1", "event_source": "server", "page": null}
mfe-1                | {"level":"info","ts":1712838945.4628763,"logger":"http.log.access.log0","msg":"handled request","request":{"remote_ip":"172.123.123.123","remote_port":"49270","proto":"HTTP/1.1","method":"GET","host":"apps.mysite.com","uri":"/api/mfe_config/v1?mfe=learning"},"user_id":"","duration":0.030732109,"size":1323,"status":200}
lms-1                | [pid: 13|app: 0|req: 174/421] 172.18.0.12 () {52 vars in 3120 bytes} [Thu Apr 11 12:35:45 2024] GET /api/mfe_config/v1?mfe=learning => generated 1323 bytes in 30 msecs (HTTP/1.1 200) 9 headers in 401 bytes (1 switches on core 0)
caddy-1              | {"level":"info","ts":1712838945.4640172,"logger":"http.log.access.log2","msg":"handled request","request":{"remote_ip":"123.123.123.123","remote_port":"53542","proto":"HTTP/2.0","method":"GET","host":"apps.mysite.com","uri":"/api/mfe_config/v1?mfe=learning","tls":{"resumed":true,"version":772,"cipher_suite":4865,"proto":"h2","server_name":"apps.mysite.com"}},"user_id":"","duration":0.032224128,"size":565,"status":200}
mysql-1              | 2024-04-11T12:35:45.583682Z 528 [Warning] [MY-013360] [Server] Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
lms-1                | 2024-04-11 12:35:45,586 INFO 7 [tracking] [user 5] [ip 123.123.123.123] logger.py:41 - {"name": "/theming/asset/images/logo.png", "context": {"user_id": 5, "path": "/theming/asset/images/logo.png", "course_id": "", "org_id": "", "enterprise_uuid": ""}, "username": "student", "session": "4e31ea20c7e4bbac3065620d54c77b80", "ip": "123.123.123.123", "agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0", "host": "mysite.com", "referer": "https://apps.mysite.com/", "accept_language": "en-US,en;q=0.5", "event": "{\"GET\": {}, \"POST\": {}}", "time": "2024-04-11T12:35:45.586052+00:00", "event_type": "/theming/asset/images/logo.png", "event_source": "server", "page": null}
caddy-1              | {"level":"info","ts":1712838945.6057394,"logger":"http.log.access.log0","msg":"handled request","request":{"remote_ip":"123.123.123.123","remote_port":"53552","proto":"HTTP/2.0","method":"GET","host":"mysite.com","uri":"/theming/asset/images/logo.png","tls":{"resumed":true,"version":772,"cipher_suite":4865,"proto":"h2","server_name":"mysite.com"}},"user_id":"","duration":0.031178515,"size":0,"status":302}
lms-1                | [pid: 7|app: 0|req: 170/422] 172.123.123.123 () {52 vars in 3112 bytes} [Thu Apr 11 12:35:45 2024] GET /theming/asset/images/logo.png => generated 0 bytes in 30 msecs (HTTP/1.1 302) 7 headers in 390 bytes (1 switches on core 0)
mysql-1              | 2024-04-11T12:35:45.610796Z 529 [Warning] [MY-013360] [Server] Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
lms-1                | 2024-04-11 12:35:45,613 INFO 13 [tracking] [user 5] [ip 123.123.123.123] logger.py:41 - {"name": "/api/course_home/course_metadata/course-v1:deleteme_test2+deleteme_test2+deleteme_test2", "context": {"user_id": 5, "path": "/api/course_home/course_metadata/course-v1:deleteme_test2+deleteme_test2+deleteme_test2", "course_id": "", "org_id": "", "enterprise_uuid": ""}, "username": "student", "session": "4e31ea20c7e4bbac3065620d54c77b80", "ip": "123.123.123.123", "agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0", "host": "mysite.com", "referer": "https://apps.mysite.com/", "accept_language": "en-US,en;q=0.5", "event": "{\"GET\": {\"browser_timezone\": [\"America/Chicago\"]}, \"POST\": {}}", "time": "2024-04-11T12:35:45.612985+00:00", "event_type": "/api/course_home/course_metadata/course-v1:deleteme_test2+deleteme_test2+deleteme_test2", "event_source": "server", "page": null}
lms-1                | [pid: 13|app: 0|req: 175/423] 172.123.123.123 () {56 vars in 3370 bytes} [Thu Apr 11 12:35:45 2024] GET /api/course_home/course_metadata/course-v1:deleteme_test2+deleteme_test2+deleteme_test2?browser_timezone=America%2FChicago => generated 1136 bytes in 118 msecs (HTTP/1.1 200) 9 headers in 441 bytes (1 switches on core 0)
caddy-1              | {"level":"info","ts":1712838945.718403,"logger":"http.log.access.log0","msg":"handled request","request":{"remote_ip":"123.123.123.123","remote_port":"53552","proto":"HTTP/2.0","method":"GET","host":"mysite.com","uri":"/api/course_home/course_metadata/course-v1:deleteme_test2+deleteme_test2+deleteme_test2?browser_timezone=America%2FChicago","tls":{"resumed":true,"version":772,"cipher_suite":4865,"proto":"h2","server_name":"mysite.com"}},"user_id":"","duration":0.120131899,"size":451,"status":200}
mysql-1              | 2024-04-11T12:35:45.796082Z 530 [Warning] [MY-013360] [Server] Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
lms-1                | 2024-04-11 12:35:45,798 INFO 7 [tracking] [user 5] [ip 123.123.123.123] logger.py:41 - {"name": "/api/course_home/progress/course-v1:deleteme_test2+deleteme_test2+deleteme_test2", "context": {"user_id": 5, "path": "/api/course_home/progress/course-v1:deleteme_test2+deleteme_test2+deleteme_test2", "course_id": "", "org_id": "", "enterprise_uuid": ""}, "username": "student", "session": "4e31ea20c7e4bbac3065620d54c77b80", "ip": "123.123.123.123", "agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0", "host": "mysite.com", "referer": "https://apps.mysite.com/", "accept_language": "en-US,en;q=0.5", "event": "{\"GET\": {}, \"POST\": {}}", "time": "2024-04-11T12:35:45.798392+00:00", "event_type": "/api/course_home/progress/course-v1:deleteme_test2+deleteme_test2+deleteme_test2", "event_source": "server", "page": null}
lms-1                | 2024-04-11 12:35:45,880 INFO 7 [edx.certificate] [user 5] [ip 123.123.123.123] api.py:378 - Checking if student 5 has an invalidated certificate in course course-v1:deleteme_test2+deleteme_test2+deleteme_test2.
lms-1                | 2024-04-11 12:35:45,886 INFO 7 [edx.certificate] [user 5] [ip 123.123.123.123] api.py:703 - Checking if student 5 is on the allowlist in course course-v1:deleteme_test2+deleteme_test2+deleteme_test2
caddy-1              | {"level":"info","ts":1712838945.9270692,"logger":"http.log.access.log0","msg":"handled request","request":{"remote_ip":"123.123.123.123","remote_port":"53552","proto":"HTTP/2.0","method":"GET","host":"mysite.com","uri":"/api/course_home/progress/course-v1:deleteme_test2+deleteme_test2+deleteme_test2","tls":{"resumed":true,"version":772,"cipher_suite":4865,"proto":"h2","server_name":"mysite.com"}},"user_id":"","duration":0.140258966,"size":673,"status":200}
lms-1                | [pid: 7|app: 0|req: 171/424] 172.123.123.123 () {56 vars in 3285 bytes} [Thu Apr 11 12:35:45 2024] GET /api/course_home/progress/course-v1:deleteme_test2+deleteme_test2+deleteme_test2 => generated 1544 bytes in 139 msecs (HTTP/1.1 200) 9 headers in 441 bytes (1 switches on core 0)
mysql-1              | 2024-04-11T12:35:46.079118Z 531 [Warning] [MY-013360] [Server] Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
lms-1                | 2024-04-11 12:35:46,081 INFO 13 [tracking] [user 5] [ip 123.123.123.123] logger.py:41 - {"name": "/api/edx_proctoring/v1/proctored_exam/attempt/course_id/course-v1:deleteme_test2+deleteme_test2+deleteme_test2", "context": {"user_id": 5, "path": "/api/edx_proctoring/v1/proctored_exam/attempt/course_id/course-v1:deleteme_test2+deleteme_test2+deleteme_test2", "course_id": "", "org_id": "", "enterprise_uuid": ""}, "username": "student", "session": "4e31ea20c7e4bbac3065620d54c77b80", "ip": "123.123.123.123", "agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0", "host": "mysite.com", "referer": "https://apps.mysite.com/", "accept_language": "en-US,en;q=0.5", "event": "{\"GET\": {\"is_learning_mfe\": [\"true\"]}, \"POST\": {}}", "time": "2024-04-11T12:35:46.081620+00:00", "event_type": "/api/edx_proctoring/v1/proctored_exam/attempt/course_id/course-v1:deleteme_test2+deleteme_test2+deleteme_test2", "event_source": "server", "page": null}
caddy-1              | {"level":"info","ts":1712838946.1013808,"logger":"http.log.access.log0","msg":"handled request","request":{"remote_ip":"123.123.123.123","remote_port":"53552","proto":"HTTP/2.0","method":"GET","host":"mysite.com","uri":"/api/edx_proctoring/v1/proctored_exam/attempt/course_id/course-v1:deleteme_test2+deleteme_test2+deleteme_test2?is_learning_mfe=true","tls":{"resumed":true,"version":772,"cipher_suite":4865,"proto":"h2","server_name":"mysite.com"}},"user_id":"","duration":0.031953425,"size":31,"status":200}
lms-1                | [pid: 13|app: 0|req: 176/425] 172.123.123.123 () {56 vars in 3386 bytes} [Thu Apr 11 12:35:46 2024] GET /api/edx_proctoring/v1/proctored_exam/attempt/course_id/course-v1:deleteme_test2+deleteme_test2+deleteme_test2?is_learning_mfe=true => generated 31 bytes in 31 msecs (HTTP/1.1 200) 9 headers in 439 bytes (1 switches on core 0)

The only thing I’m wondering about is if maybe that “proctored_exam” stuff isn’t supposed to be there?