email services updated

This commit is contained in:
2025-03-24 12:48:31 +03:00
parent 558de2399f
commit 713730420c
18 changed files with 310 additions and 49 deletions

View File

@@ -0,0 +1 @@
3.12

View File

@@ -0,0 +1,40 @@
FROM python:3.12-slim
WORKDIR /
# Install system dependencies and Poetry
RUN apt-get update && apt-get install -y --no-install-recommends gcc \
&& rm -rf /var/lib/apt/lists/* && pip install --no-cache-dir poetry
# Copy Poetry configuration
COPY /BankServices/RoutineEmailService/pyproject.toml ./pyproject.toml
# Configure Poetry and install dependencies with optimizations
RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi --no-root --only main \
&& pip cache purge && rm -rf ~/.cache/pypoetry
# Install cron for scheduling tasks
RUN apt-get update && apt-get install -y cron
# 11:00 Istanbul Time (UTC+3) system time is 08:00 UTC
RUN echo "0 8 * * * /usr/local/bin/python /app.py >> /var/log/cron.log 2>&1" > /tmp/crontab_list && crontab /tmp/crontab_list
# Copy application code
ADD /BankServices/RoutineEmailService /
ADD /Configs /Configs
ADD /Schemas /Schemas
ADD /Commons /Commons
ADD /Services/MongoService /Services/MongoService
ADD /Services/PostgresService /Services/PostgresService
ADD /Services/EmailService /Services/EmailService
# Set Python path to include app directory
ENV PYTHONPATH=/ PYTHONUNBUFFERED=1 PYTHONDONTWRITEBYTECODE=1
# Create log file to grab cron logs
RUN touch /var/log/cron.log
# Run cron setup and tail the log file for user to monitor logs
CMD cron && tail -f /var/log/cron.log

View File

@@ -0,0 +1,57 @@
import os
import arrow
from Schemas import AccountRecords
from jinja2 import Environment, FileSystemLoader
from Services.EmailService.provider import send_email
def render_email_template(headers: list, rows: list):
template_dir = os.path.join(os.path.dirname(__file__), "templates")
env = Environment(loader=FileSystemLoader(template_dir)) # Load templates from the directory
template = env.get_template("template_accounts.html") # Load the specific template file
return template.render(headers=headers, rows=rows) # Render template with variables
def send_email_to_given_address(send_to: str, html_template: str):
today = arrow.now()
subject = f"{str(today.date())} Gunes Apt. Cari Durum Bilgilendirme Raporu"
try:
send_email(subject=subject, receivers=[send_to], html=html_template)
print(f"Email is sent to : {send_to}. BB")
return
except Exception as e:
print(f"Error: {e}")
print("Email is not sent")
return
def set_account_records_to_send_email():
account_records = (
AccountRecords.query.filter()
.order_by(
AccountRecords.bank_date.desc(), AccountRecords.bank_reference_code.desc()
)
.limit(3)
.all()
)
first_record, second_record, balance_error = account_records[0], account_records[1], False
second_balance = first_record.bank_balance - first_record.currency_value
if second_balance != second_record.bank_balance:
balance_error = True
rows = [{
"date": record.bank_date, "comment": record.bank_comment, "currency": record.currency_value,
} for record in account_records]
send_to = "karatay@mehmetkaratay.com.tr"
html_template = render_email_template(
headers=["Ulaştığı Tarih", "Banka Transaksiyonu Ek Bilgi", "Aktarım Değeri"],
rows=rows,
)
exit()
if __name__ == "__main__":
set_account_records_to_send_email()

View File

@@ -0,0 +1,15 @@
[project]
name = "routineemailservice"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"arrow>=1.3.0",
"fastapi>=0.115.11",
"jinja2>=3.1.6",
"psycopg2-binary>=2.9.10",
"redbox>=0.2.1",
"redmail>=0.6.0",
"sqlalchemy-mixins>=2.0.5",
]

View File

@@ -16,6 +16,14 @@ RUN poetry config virtualenvs.create false && poetry install --no-interaction --
# Copy application code
ADD /BankServices/SenderService /
ADD /Configs /Configs
ADD /Schemas /Schemas
ADD /Commons /Commons
ADD /Services/MongoService /Services/MongoService
ADD /Services/PostgresService /Services/PostgresService
ADD /Services/EmailService /Services/EmailService
# Set Python path to include app directory
ENV PYTHONPATH=/ PYTHONUNBUFFERED=1 PYTHONDONTWRITEBYTECODE=1

View File

@@ -1,11 +1,21 @@
import time
from jinja2 import Template
# todo Check if postgres is_email_send === False then send email
# todo Trigger @mongo email_send = False then send email
def app():
print("Hello from sender service!")
def check_any_written_stage_in_mongo_database(mongo_provider) -> bool:
return mongo_provider.find_one(filter_query={"stage": "written", "send": None})
if __name__ == "__main__":
while True:
app()
time.sleep(5)

View File

@@ -5,7 +5,12 @@ description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"arrow>=1.3.0",
"fastapi>=0.115.11",
"jinja2>=3.1.6",
"psycopg2-binary>=2.9.10",
"pymongo>=4.11.3",
"redbox>=0.2.1",
"redmail>=0.6.0",
"sqlalchemy-mixins>=2.0.5",
]

View File

@@ -0,0 +1,50 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Gelen Banka Kayıtları</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
table {
width: 100%;
border-collapse: collapse;
}
table, th, td {
border: 1px solid black;
}
th, td {
padding: 10px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
</style>
</head>
<body>
<h1>Günaydın, Admin</h1>
<br>
<table border="1">
<thead>
<tr>
{% for header in headers %}
<th>{{ header }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for row in rows %}
<tr>
{% for cell in row %}
<td>{{ cell }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>

View File

@@ -13,6 +13,8 @@ COPY /BankServices/WriterService/pyproject.toml ./pyproject.toml
RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi --no-root --only main \
&& pip cache purge && rm -rf ~/.cache/pypoetry
# Copy application code
ADD /BankServices/WriterService /
ADD /Configs /Configs

View File

@@ -48,8 +48,7 @@ def write_parsed_data_to_account_records(
new_account_record.is_confirmed = True
new_account_record.save(db=db_session)
mongo_provider.update_one(
filter_query={"filename": file},
update_data={"$set": {"stage": "written"}},
filter_query={"filename": file}, update_data={"$set": {"stage": "written"}},
)