sergiopaniego HF Staff commited on
Commit
e15fe43
·
1 Parent(s): 0640418

Add to profile LinkedIn button

Browse files
Files changed (1) hide show
  1. app.py +92 -3
app.py CHANGED
@@ -2,6 +2,11 @@ import gradio as gr
2
  from datasets import load_dataset, Dataset
3
  from datetime import datetime
4
  from datetime import date
 
 
 
 
 
5
  import io
6
  import os
7
  from PIL import Image, ImageDraw, ImageFont
@@ -13,6 +18,8 @@ login(token=os.environ["HUGGINGFACE_TOKEN"])
13
  SCORES_DATASET = "agents-course/unit4-students-scores"
14
  CERTIFICATES_DATASET = "agents-course/course-certificates-of-excellence"
15
  THRESHOLD_SCORE = 30
 
 
16
 
17
  # Function to check user score
18
  def check_user_score(username):
@@ -68,8 +75,77 @@ def generate_certificate(name, score):
68
 
69
  return im, "certificate.pdf"
70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  # Main function to handle certificate generation
72
- def handle_certificate(name, profile: gr.OAuthProfile):
73
  if profile is None:
74
  return "You must be logged in with your Hugging Face account.", None
75
 
@@ -86,7 +162,18 @@ def handle_certificate(name, profile: gr.OAuthProfile):
86
 
87
  certificate_image, certificate_pdf = generate_certificate(name, score)
88
  add_certificate_entry(username, name, score)
89
- return "Congratulations! Here's your certificate:", certificate_image, certificate_pdf
 
 
 
 
 
 
 
 
 
 
 
90
 
91
  # Gradio interface
92
  with gr.Blocks() as demo:
@@ -109,13 +196,15 @@ with gr.Blocks() as demo:
109
  name_input = gr.Text(label="Enter your name (this will appear on the certificate)")
110
  generate_btn = gr.Button("Get my certificate")
111
  output_text = gr.Textbox(label="Result")
 
 
112
  cert_image = gr.Image(label="Your Certificate")
113
  cert_file = gr.File(label="Download Certificate (PDF)", file_types=[".pdf"])
114
 
115
  generate_btn.click(
116
  fn=handle_certificate,
117
  inputs=[name_input],
118
- outputs=[output_text, cert_image, cert_file]
119
  )
120
 
121
  demo.launch()
 
2
  from datasets import load_dataset, Dataset
3
  from datetime import datetime
4
  from datetime import date
5
+ import requests
6
+ import tempfile
7
+ import asyncio
8
+ from huggingface_hub import upload_file
9
+ from functools import partial
10
  import io
11
  import os
12
  from PIL import Image, ImageDraw, ImageFont
 
18
  SCORES_DATASET = "agents-course/unit4-students-scores"
19
  CERTIFICATES_DATASET = "agents-course/course-certificates-of-excellence"
20
  THRESHOLD_SCORE = 30
21
+ CERTIFYING_ORG_LINKEDIN_ID = os.getenv("CERTIFYING_ORG_LINKEDIN_ID", "000000")
22
+ COURSE_TITLE = os.getenv("COURSE_TITLE", "Hugging Face Agents Course")
23
 
24
  # Function to check user score
25
  def check_user_score(username):
 
75
 
76
  return im, "certificate.pdf"
77
 
78
+ async def upload_certificate_to_hub(username: str, certificate_img) -> str:
79
+ """Upload certificate to the dataset hub and return the URL asynchronously."""
80
+ # Save image to temporary file
81
+ with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp:
82
+ certificate_img.save(tmp.name)
83
+
84
+ try:
85
+ # Run upload in a thread pool since upload_file is blocking
86
+ loop = asyncio.get_event_loop()
87
+ upload_func = partial(
88
+ upload_file,
89
+ path_or_fileobj=tmp.name,
90
+ path_in_repo=f"certificates/{username}/{date.today()}.png",
91
+ repo_id="agents-course/final-certificates",
92
+ repo_type="dataset",
93
+ token=os.getenv("HF_TOKEN"),
94
+ )
95
+ await loop.run_in_executor(None, upload_func)
96
+
97
+ # Construct the URL to the image
98
+ cert_url = (
99
+ f"https://huggingface.co/datasets/agents-course/final-certificates/"
100
+ f"resolve/main/certificates/{username}/{date.today()}.png"
101
+ )
102
+
103
+ # Clean up temp file
104
+ os.unlink(tmp.name)
105
+ return cert_url
106
+
107
+ except Exception as e:
108
+ print(f"Error uploading certificate: {e}")
109
+ os.unlink(tmp.name)
110
+ return None
111
+
112
+ def create_linkedin_button(username: str, cert_url: str | None) -> str:
113
+ """Create LinkedIn 'Add to Profile' button HTML."""
114
+ current_year = date.today().year
115
+ current_month = date.today().month
116
+
117
+ # Use the dataset certificate URL if available, otherwise fallback to default
118
+ certificate_url = cert_url or "https://huggingface.co/agents-course-finishers"
119
+
120
+ linkedin_params = {
121
+ "startTask": "CERTIFICATION_NAME",
122
+ "name": COURSE_TITLE,
123
+ "organizationName": "Hugging Face",
124
+ "organizationId": CERTIFYING_ORG_LINKEDIN_ID,
125
+ "issueYear": str(current_year),
126
+ "issueMonth": str(current_month),
127
+ "certUrl": certificate_url,
128
+ "certId": username, # Using username as cert ID
129
+ }
130
+
131
+ # Build the LinkedIn button URL
132
+ base_url = "https://www.linkedin.com/profile/add?"
133
+ params = "&".join(
134
+ f"{k}={requests.utils.quote(v)}" for k, v in linkedin_params.items()
135
+ )
136
+ button_url = base_url + params
137
+
138
+ message = f"""
139
+ <a href="{button_url}" target="_blank" style="display: block; margin: 0 auto; width: fit-content;">
140
+ <img src="https://download.linkedin.com/desktop/add2profile/buttons/en_US.png"
141
+ alt="LinkedIn Add to Profile button"
142
+ style="height: 40px; width: auto; display: block;" />
143
+ </a>
144
+ """
145
+ return message
146
+
147
  # Main function to handle certificate generation
148
+ async def handle_certificate(name, profile: gr.OAuthProfile):
149
  if profile is None:
150
  return "You must be logged in with your Hugging Face account.", None
151
 
 
162
 
163
  certificate_image, certificate_pdf = generate_certificate(name, score)
164
  add_certificate_entry(username, name, score)
165
+
166
+ # Start certificate upload asynchronously
167
+ gr.Info("Uploading your certificate...")
168
+ cert_url = await upload_certificate_to_hub(username, certificate_image)
169
+
170
+ if cert_url is None:
171
+ gr.Warning("Certificate upload failed, but you still passed!")
172
+ cert_url = "https://huggingface.co/agents-course"
173
+
174
+ linkedin_button = create_linkedin_button(username, cert_url)
175
+ return "Congratulations! Here's your certificate:", certificate_image, gr.update(value=linkedin_button, visible=True), certificate_pdf
176
+
177
 
178
  # Gradio interface
179
  with gr.Blocks() as demo:
 
196
  name_input = gr.Text(label="Enter your name (this will appear on the certificate)")
197
  generate_btn = gr.Button("Get my certificate")
198
  output_text = gr.Textbox(label="Result")
199
+ linkedin_btn = gr.HTML(visible=False)
200
+
201
  cert_image = gr.Image(label="Your Certificate")
202
  cert_file = gr.File(label="Download Certificate (PDF)", file_types=[".pdf"])
203
 
204
  generate_btn.click(
205
  fn=handle_certificate,
206
  inputs=[name_input],
207
+ outputs=[output_text, cert_image, linkedin_btn, cert_file]
208
  )
209
 
210
  demo.launch()