Students can't see certificates in Palm

Hello, I just set up a new Palm Tutor 16.1.8 instance and then copied my data in. For some reason when a student gets to a passing grade, or they’re assigned a completion certificate manually, they still can’t see their completion certificate.

I currently have “certificates.auto_certificate_generation” set under Django admin Waffle Switches (per section 4.9.8 here)

I also confirmed the certificate is enabled, and “honor” mode,

and the student account is enrolled as honor mode (from the class grade report:)

I have also created an honor mode entry under Django admin “course modes”.

When the student hasn’t completed the grade requirement they see the following (note the mention of the certificate status):

But after, when normally I would expect the self-initiated “create certificate” to appear, they instead just see the following (note that the cert status has gone away, but the “view your cert” hasn’t appeared.)

What other things should I be checking for why the user can’t create their own certificate?

In studio in schedule and details check if certificate setting is set to award the cert immediately upon passing (early_no_info) or it’s set to be awarded after course end date ?

Hi @ABC

In my case I have enabled Certificate html view under “https://url.lms/admin/certificates/certificatehtmlviewconfiguration/”. I also enabled Certificate generation configurations.

Some other things you can do:

Restart the platform and reboot server.

Under Schedule and Details check “Certificate publishing options” and “Available date of certificates” (I recommend you to change the pace of the course at your own pace).

Make sure you configure grading correctly. Please take a look at this video: https://www.youtube.com/watch?v=IJvMjou8e64

good luck,
rax

@chintan @rax I don’t see anything having to do with certificates under Schedule. Is that maybe something that was added after Palm, or only applicable to an Instructor-Paced rather than Self-paced class?

@rax FWIW I have a certificate HTML view as shown here:

Did you also set the CERTIFICATES_HTML_VIEW = true under FEATURES? If so, how did you do that with tutor? As usual the documentation doesn’t say how to do that, despite tutor being the officially recommended install method :-/.

Also, I watched that video, and the only thing I saw that was different from mine was that I didn’t see an “enable student-generated certificates” option under Instructor → Certificates. But that video is from 6 years ago so I assume things have changed?

If you change the course pace to Instructor-Paced you should be able to see the options we are talking about. But in my opinion Self-Paced is the best option for your course.

It’s not necessary to set CERTIFICATES_HTML_VIEW under FEATURES, by default it comes ENABLED in lms.env.yaml

You don’t have to enable student-generated certificates if certificates.auto_certificate_generation switch is active. I think this option is deprecated from Olive. Just make sure your grading is set up correctly.

I see that you are not using the default settings for Certificate html view. Could you enable Certificate html view again with the default settings?

I’ll try to reproduce your environment to do some tests.

I’m not sure what you mean by this. It seems to be the defaults for Palm. I.e. if I go to add a new option it looks like this:

And when I then hit save it looks the same as the previous entry:

Or did you mean some other setting somewhere else?

Yes, these classes are required to be self-paced, not instructor-paced.

Default options for Certificate html view configuration (in Olive, Palm and Quince) should be something like this :


{“default”: {“accomplishment_class_append”: “accomplishment-certificate”, “platform_name”: “Your Platform Name Here”, “company_about_url”: “http://www.example.com/about-us”, “company_privacy_url”: “http://www.example.com/privacy-policy”, “company_tos_url”: “http://www.example.com/terms-service”, “company_verified_certificate_url”: “http://www.example.com/verified-certificate”, “logo_src”: “/static/certificates/images/logo.png”, “logo_url”: “http://www.example.com”}, “honor”: {“certificate_type”: “Honor Code”, “certificate_title”: “Certificate of Achievement”}, “verified”: {“certificate_type”: “Verified”, “certificate_title”: “Verified Certificate of Achievement”}}

OK, I set it back to that kind of default…

but I don’t see why any of those values would have anything to do with the fact that the student has clearly been assigned a cert but just can’t see the “view cert” UI element.

And they still can’t after that change was applied

Maybe the certificate is not being generated properly. Anyway, I have made a video with all the necessary steps in a clean installation of Open edX tutor Palm 16.1.8: https://youtu.be/Wq9TQQL0bQQ

Hope it helps.

good luck,
rax

Hello,

In advanced options, click on show deprecated options and look for the option with something like “certificates can be downloaded before the end” and change it to true

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?

Extra note: I re-launched tutor, and it seems to have generated the certificate for the test class…

but for the other existing real class where the student account already has a passing grade, there is no change in the status.

And I created a deleteme_test3 class, and it still has the behavior that it still only shows the request option for the cert, not the auto-generated cert: