Skip to content

Commit 3e90e9c

Browse files
committed
Create PDF certificates
1 parent 89fa4ae commit 3e90e9c

File tree

6 files changed

+43
-31
lines changed

6 files changed

+43
-31
lines changed

Dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
FROM pypy:3
22

3+
RUN apt update && apt install inkscape -y
4+
35
WORKDIR /usr/src/app
46

57
COPY requirements.txt .

Dockerfile.dev

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
FROM pypy:3
22

3+
RUN apt update && apt install inkscape -y
4+
RUN pip install watchdog[watchmedo] --no-cache-dir
5+
36
WORKDIR /usr/src/app
47

58
COPY requirements.txt .
69
RUN pip install -r requirements.txt --no-cache-dir
7-
RUN pip install watchdog[watchmedo] --no-cache-dir
810

911
CMD watchmedo auto-restart --patterns="*.py" --recursive --interval 5 -- pypy -u src/main.py

src/entities/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,5 @@
5050
"create-link-cancelled": "👌 Создание ссылки отменено",
5151
"create-cert-cancelled": "👌 Создание сертификата отменено",
5252
"check-cert-cancelled": "👌 Проверка сертификата отменена",
53+
"start-create-cert": "Генерирую сертификаты. Это может занять ⏱️ некоторое время. Пожалуйста, подождите...",
5354
}

src/entities/utils.py

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import subprocess
2-
31
from aiogram.types import ReplyKeyboardMarkup, Update
42
from aiogram.utils.keyboard import ReplyKeyboardBuilder
53

@@ -56,25 +54,3 @@ async def log_error(message: str):
5654
logger.error(message)
5755
for admin_chat_id in ADMINS:
5856
await bot.send_message(chat_id=admin_chat_id, text=message)
59-
60-
61-
def replaceInDocument(FIO: str, dateTill: str, pdfFileName: str) -> None:
62-
with open("src/static/certificate.svg", "r", encoding="utf-8") as file:
63-
svg_content = file.read()
64-
svg_content = svg_content.replace("fioHandler", FIO)
65-
svg_content = svg_content.replace("dateHandler", dateTill)
66-
67-
temp_svg_path = "temp_certificate.svg"
68-
with open(temp_svg_path, "w", encoding="utf-8") as f:
69-
f.write(svg_content)
70-
subprocess.run(
71-
[
72-
"inkscape",
73-
temp_svg_path,
74-
"--export-type=pdf",
75-
f"--export-filename={pdfFileName}",
76-
],
77-
check=True,
78-
)
79-
80-
logger.info(f"PDF успешно создан: {pdfFileName}")

src/models/cert.py

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import subprocess
2+
from datetime import datetime, timedelta
13
from random import randint
4+
from typing import cast
25

36
from peewee import BooleanField, TextField
47

@@ -9,16 +12,42 @@ def cert_code():
912
return "".join([str(randint(1, 9)) for _ in range(8)])
1013

1114

15+
async def replace_in_document(
16+
name: str, expires: str, result_filename: str, temp_filename: str
17+
) -> None:
18+
with open("src/static/certificate.svg", "r", encoding="utf-8") as file:
19+
svg_content = file.read()
20+
svg_content = svg_content.replace("fioHandler", name)
21+
svg_content = svg_content.replace("dateHandler", expires)
22+
23+
with open(temp_filename, "w", encoding="utf-8") as f:
24+
f.write(svg_content)
25+
subprocess.run(
26+
[
27+
"inkscape",
28+
temp_filename,
29+
"--export-type=pdf",
30+
f"--export-filename={result_filename}",
31+
],
32+
check=True,
33+
)
34+
35+
1236
class Cert(BaseModel):
1337
name = TextField()
1438
code = TextField(default=cert_code)
1539
used = BooleanField(default=False)
1640

17-
def generate_file(self):
18-
path = f"certs/{self.code}.txt"
19-
f = open(path, "w")
20-
print(self.name, self.code, file=f)
21-
f.close()
41+
async def generate_file(self):
42+
path = f"certs/{self.code}.pdf"
43+
temp_path = f"certs/{self.code}.svg"
44+
45+
expire = datetime.now() + timedelta(days=365)
46+
expire_str = f"{expire.year}/{expire.month}/{expire.day}"
47+
48+
await replace_in_document(
49+
cast(str, self.name), expire_str, path, temp_path
50+
)
2251
return path
2352

2453

src/routers/create_cert.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@ async def create_cert(message: Message, user: User, state: FSMContext):
4141

4242
await state.set_state(None)
4343

44+
await message.answer(TEXT["start-create-cert"])
45+
4446
for name in names:
4547
cert = await Cert.aio_create(name=name)
46-
path = cert.generate_file()
48+
path = await cert.generate_file()
4749
await message.answer_document(FSInputFile(path))
4850

4951
if user.chat_id not in ADMINS:

0 commit comments

Comments
 (0)