Spaces:
Sleeping
Sleeping
File size: 3,461 Bytes
5979dfe |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
import aiohttp
import re
import asyncio
from io import BytesIO
from PIL import Image, ImageFont, ImageDraw
# Telefon raqam uchun regex
phone_regex = r'^\+998\d{9}$'
# Email uchun regex
email_regex = r'^[\w\.-]+@[\w\.-]+\.\w+$'
# Telefon raqam bilan email, fish qatorlari to'liq kiritilganligi tekshirilayabdi
def validate_input(fish, email, maqola, phone):
if fish == "" or email == "" or maqola == "":
return False, "Iltimos barcha maydonlar bo'sh bo'lmasligini ta'minlang!!"
elif not re.match(phone_regex, phone):
return False, "Telefon raqam noto'g'ri formatda kiritildi. Iltimos, +998xxxxxxxx formatida kiriting."
elif not re.match(email_regex, email):
return False, "Email manzil noto'g'ri formatda kiritildi. Iltimos, to'g'ri formatda kiriting."
else:
return True, None
# Global Variables
FONT_FILE_1 = ImageFont.truetype(r'Times New Roman Bold.ttf', 30)
FONT_FILE_2 = ImageFont.truetype(r'Times New Roman Bold.ttf', 14)
FONT_COLOR_1 = "#5E17EB"
FONT_COLOR_2 = "#0E477D"
TEMPLATE_IMAGE = Image.open(r'Sertifikat.png')
WIDTH, HEIGHT = TEMPLATE_IMAGE.size
MAX_WIDTH = WIDTH - 80 # Ikkinchi matn uchun maksimal eni
MAX_WORDS_PER_LINE = 8 # Har bir qatorda maksimal so'z soni
OUTPUT_DIR = "out"
# Rasmni linki hosil qilinmoqda
async def photo_link(photo_bytes):
form = aiohttp.FormData()
form.add_field(
name='file',
value=photo_bytes,
)
async with aiohttp.ClientSession() as session:
async with session.post('https://telegra.ph/upload', data=form) as response:
img_src = await response.json()
link = 'https://telegra.ph/' + img_src[0]["src"]
return link
# Sertifikat yasash qismi
async def make_certificates(name, second_text):
template = TEMPLATE_IMAGE.copy()
draw = ImageDraw.Draw(template)
# Birinchi matnning eni va balandligini topish
bbox_1 = FONT_FILE_1.getbbox(name)
text_width_1 = bbox_1[2] - bbox_1[0]
text_height_1 = bbox_1[3] - bbox_1[1]
# Birinchi matnni markazga joylashtirish
draw.text(((WIDTH - text_width_1) / 2 - 40, (HEIGHT - text_height_1) / 2 + 40), name, fill=FONT_COLOR_1, font=FONT_FILE_1)
# Ikkinchi matnni bir necha qatorga bo'lish
words = second_text.split()
lines = []
line = []
for word in words:
if len(line) < MAX_WORDS_PER_LINE:
line.append(word)
else:
lines.append(' '.join(line))
line = [word]
# Har bir qatordan keyin matnning o'lchamini tekshiramiz
bbox_2 = FONT_FILE_2.getbbox(' '.join(line))
text_width_2 = bbox_2[2] - bbox_2[0]
if text_width_2 > MAX_WIDTH:
line.pop() # Ohirgi so'zni olib tashlash
lines.append(' '.join(line))
line = [word]
if line:
lines.append(' '.join(line))
y = (HEIGHT - text_height_1) / 2 + 55 + text_height_1 + 10
for line in lines:
bbox_2 = FONT_FILE_2.getbbox(line)
text_width_2 = bbox_2[2] - bbox_2[0]
text_height_2 = bbox_2[3] - bbox_2[1]
draw.text(((WIDTH - text_width_2) / 2 - 40, y), line, fill=FONT_COLOR_2, font=FONT_FILE_2)
y += text_height_2 + 5 # Qatorlar orasidagi masofani oshirish
# Sertifikatni BytesIO obyektiga saqlash
image_bytes = BytesIO()
template.save(image_bytes, format='PNG')
image_bytes.seek(0)
certificate_link = await photo_link(image_bytes)
return certificate_link
|