Auto-commit before push to git.mycloud24.ru
This commit is contained in:
@@ -5,17 +5,27 @@ from app import db
|
||||
from app.models import Guest
|
||||
|
||||
|
||||
REQUIRED_COLUMNS = ["Отдел", "ФИО", "Должность", "e-mail", "название фото"]
|
||||
REQUIRED_COLUMNS = ["Отдел", "Фамилия", "Имя", "Отчество", "Должность", "Почта", "Телефон", "Название фото"]
|
||||
|
||||
|
||||
def _build_full_name(last_name, first_name, middle_name):
|
||||
parts = [p for p in [last_name, first_name, middle_name] if p]
|
||||
return " ".join(parts)
|
||||
|
||||
|
||||
def read_guests_from_excel(file_path):
|
||||
"""Читает список гостей из Excel-файла."""
|
||||
file_path = Path(file_path)
|
||||
"""Читает список гостей из Excel-файла (путь или файловый объект)."""
|
||||
if not hasattr(file_path, "read"):
|
||||
file_path = Path(file_path)
|
||||
wb = load_workbook(file_path, data_only=True)
|
||||
ws = wb.active
|
||||
try:
|
||||
ws = wb.active
|
||||
|
||||
# Определяем заголовки
|
||||
headers = [str(cell.value).strip() if cell.value else "" for cell in ws[1]]
|
||||
# Определяем заголовки и сразу считываем все строки
|
||||
headers = [str(cell.value).strip() if cell.value else "" for cell in ws[1]]
|
||||
rows = list(ws.iter_rows(min_row=2, values_only=True))
|
||||
finally:
|
||||
wb.close()
|
||||
|
||||
missing = [col for col in REQUIRED_COLUMNS if col not in headers]
|
||||
if missing:
|
||||
@@ -24,41 +34,70 @@ def read_guests_from_excel(file_path):
|
||||
col_indices = {col: headers.index(col) for col in REQUIRED_COLUMNS}
|
||||
guests_data = []
|
||||
|
||||
for row in ws.iter_rows(min_row=2, values_only=True):
|
||||
full_name = str(row[col_indices["ФИО"]]).strip() if row[col_indices["ФИО"]] else ""
|
||||
email = str(row[col_indices["e-mail"]]).strip() if row[col_indices["e-mail"]] else ""
|
||||
for row in rows:
|
||||
last_name = str(row[col_indices["Фамилия"]]).strip() if row[col_indices["Фамилия"]] else ""
|
||||
first_name = str(row[col_indices["Имя"]]).strip() if row[col_indices["Имя"]] else ""
|
||||
middle_name = str(row[col_indices["Отчество"]]).strip() if row[col_indices["Отчество"]] else ""
|
||||
email = str(row[col_indices["Почта"]]).strip() if row[col_indices["Почта"]] else ""
|
||||
|
||||
if not full_name or not email:
|
||||
if not email:
|
||||
continue
|
||||
|
||||
full_name = _build_full_name(last_name, first_name, middle_name)
|
||||
if not full_name:
|
||||
# Если ФИО не заполнено, но есть email — пропускаем строку
|
||||
continue
|
||||
|
||||
guests_data.append({
|
||||
"department": str(row[col_indices["Отдел"]]).strip() if row[col_indices["Отдел"]] else "",
|
||||
"last_name": last_name,
|
||||
"first_name": first_name,
|
||||
"middle_name": middle_name,
|
||||
"full_name": full_name,
|
||||
"position": str(row[col_indices["Должность"]]).strip() if row[col_indices["Должность"]] else "",
|
||||
"email": email,
|
||||
"photo_filename": str(row[col_indices["название фото"]]).strip() if row[col_indices["название фото"]] else "",
|
||||
"phone": str(row[col_indices["Телефон"]]).strip() if row[col_indices["Телефон"]] else "",
|
||||
"photo_filename": str(row[col_indices["Название фото"]]).strip() if row[col_indices["Название фото"]] else "",
|
||||
})
|
||||
|
||||
return guests_data
|
||||
|
||||
|
||||
def import_guests_from_excel(file_path):
|
||||
"""Импортирует гостей из Excel в базу данных."""
|
||||
def import_guests_from_excel(file_path, event_id):
|
||||
"""Импортирует гостей из Excel в базу данных в рамках указанного мероприятия."""
|
||||
if not event_id:
|
||||
raise ValueError("Не выбрано мероприятие для импорта")
|
||||
|
||||
guests_data = read_guests_from_excel(file_path)
|
||||
imported = 0
|
||||
updated = 0
|
||||
|
||||
for data in guests_data:
|
||||
guest = Guest.query.filter_by(email=data["email"]).first()
|
||||
guest = Guest.query.filter_by(event_id=event_id, email=data["email"]).first()
|
||||
if guest:
|
||||
guest.department = data["department"]
|
||||
guest.last_name = data["last_name"]
|
||||
guest.first_name = data["first_name"]
|
||||
guest.middle_name = data["middle_name"]
|
||||
guest.full_name = data["full_name"]
|
||||
guest.position = data["position"]
|
||||
guest.phone = data["phone"]
|
||||
guest.photo_filename = data["photo_filename"]
|
||||
guest.is_active = True
|
||||
updated += 1
|
||||
else:
|
||||
guest = Guest(**data)
|
||||
guest = Guest(
|
||||
event_id=event_id,
|
||||
department=data["department"],
|
||||
last_name=data["last_name"],
|
||||
first_name=data["first_name"],
|
||||
middle_name=data["middle_name"],
|
||||
full_name=data["full_name"],
|
||||
position=data["position"],
|
||||
email=data["email"],
|
||||
phone=data["phone"],
|
||||
photo_filename=data["photo_filename"],
|
||||
)
|
||||
db.session.add(guest)
|
||||
imported += 1
|
||||
|
||||
@@ -66,15 +105,21 @@ def import_guests_from_excel(file_path):
|
||||
return {"imported": imported, "updated": updated, "total": len(guests_data)}
|
||||
|
||||
|
||||
def export_report_to_excel(output_path, event_name="Корпоратив"):
|
||||
"""Выгружает отчёт о посещаемости в Excel."""
|
||||
guests = Guest.query.order_by(Guest.department, Guest.full_name).all()
|
||||
def export_report_to_excel(output_path, event_id, event_name=None):
|
||||
"""Выгружает отчёт о посещаемости для мероприятия в Excel."""
|
||||
if not event_id:
|
||||
raise ValueError("Не выбрано мероприятие для отчёта")
|
||||
|
||||
guests = Guest.query.filter_by(event_id=event_id).order_by(Guest.department, Guest.full_name).all()
|
||||
|
||||
wb = Workbook()
|
||||
ws = wb.active
|
||||
ws.title = "Отчёт"
|
||||
|
||||
headers = ["Отдел", "ФИО", "Должность", "Email", "Название фото", "Статус", "Время входа"]
|
||||
headers = [
|
||||
"Мероприятие", "Отдел", "Фамилия", "Имя", "Отчество",
|
||||
"Должность", "Email", "Телефон", "Название фото", "Статус", "Время входа"
|
||||
]
|
||||
ws.append(headers)
|
||||
|
||||
# Стили заголовков
|
||||
@@ -87,10 +132,14 @@ def export_report_to_excel(output_path, event_name="Корпоратив"):
|
||||
status = "Пришёл" if guest.is_checked_in else "Не пришёл"
|
||||
check_in_time = guest.last_check_in.strftime("%d.%m.%Y %H:%M:%S") if guest.last_check_in else ""
|
||||
ws.append([
|
||||
event_name or "",
|
||||
guest.department,
|
||||
guest.full_name,
|
||||
guest.last_name or "",
|
||||
guest.first_name or "",
|
||||
guest.middle_name or "",
|
||||
guest.position or "",
|
||||
guest.email,
|
||||
guest.phone or "",
|
||||
guest.photo_filename or "",
|
||||
status,
|
||||
check_in_time,
|
||||
|
||||
Reference in New Issue
Block a user