web-dev/labs/lab-6/app/tools.py
2026-03-13 13:14:58 +03:00

53 lines
1.6 KiB
Python

import hashlib
import uuid
import os
from werkzeug.utils import secure_filename
from flask import current_app
from models import db, Course, Image
class CoursesFilter:
def __init__(self, name, category_ids):
self.name = name
self.category_ids = category_ids
self.query = db.select(Course)
def perform(self):
self.__filter_by_name()
self.__filter_by_category_ids()
return self.query.order_by(Course.created_at.desc())
def __filter_by_name(self):
if self.name:
self.query = self.query.filter(
Course.name.ilike('%' + self.name + '%'))
def __filter_by_category_ids(self):
if self.category_ids:
self.query = self.query.filter(
Course.category_id.in_(self.category_ids))
class ImageSaver:
def __init__(self, file):
self.file = file
def save(self):
self.img = self.__find_by_md5_hash()
if self.img is not None:
return self.img
file_name = secure_filename(self.file.filename)
self.img = Image(
id=str(uuid.uuid4()),
file_name=file_name,
mime_type=self.file.mimetype,
md5_hash=self.md5_hash)
self.file.save(
os.path.join(current_app.config['UPLOAD_FOLDER'],
self.img.storage_filename))
db.session.add(self.img)
db.session.commit()
return self.img
def __find_by_md5_hash(self):
self.md5_hash = hashlib.md5(self.file.read()).hexdigest()
self.file.seek(0)
return db.session.execute(db.select(Image).filter(Image.md5_hash == self.md5_hash)).scalar()