From c1dabdb88a6e040984810f4c8052affb60f369bf Mon Sep 17 00:00:00 2001 From: Yariv Menachem Date: Sun, 5 Jan 2025 16:15:50 +0200 Subject: [PATCH] changed db folder name added codac to position enum --- src/{db => model}/User.py | 2 +- src/{db => model}/__init__.py | 0 src/model/codec/__init__.py | 0 src/model/codec/position_codec.py | 17 +++++++++++++ src/{db => model}/job_repository.py | 2 +- src/{db => model}/user_repository.py | 9 +++++-- .../button_callback_context.py | 2 +- .../button_callback/button_fire_strategy.py | 2 +- .../telegram_default_handler.py | 2 +- .../telegram_start_handler.py | 25 +++++++++++-------- tests/test_db.py | 2 +- 11 files changed, 44 insertions(+), 19 deletions(-) rename src/{db => model}/User.py (86%) rename src/{db => model}/__init__.py (100%) create mode 100644 src/model/codec/__init__.py create mode 100644 src/model/codec/position_codec.py rename src/{db => model}/job_repository.py (98%) rename src/{db => model}/user_repository.py (90%) diff --git a/src/db/User.py b/src/model/User.py similarity index 86% rename from src/db/User.py rename to src/model/User.py index daad0c0..a437dbe 100644 --- a/src/db/User.py +++ b/src/model/User.py @@ -2,7 +2,7 @@ from typing import Optional, Union from pydantic import BaseModel, Field -from db.Position import Position +from model.Position import Position class User(BaseModel): diff --git a/src/db/__init__.py b/src/model/__init__.py similarity index 100% rename from src/db/__init__.py rename to src/model/__init__.py diff --git a/src/model/codec/__init__.py b/src/model/codec/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/model/codec/position_codec.py b/src/model/codec/position_codec.py new file mode 100644 index 0000000..e23360c --- /dev/null +++ b/src/model/codec/position_codec.py @@ -0,0 +1,17 @@ +from bson.codec_options import TypeCodec + +from model.Position import Position + + +class PositionCodec(TypeCodec): + python_type = Position + bson_type = str + + def transform_python(self, value): + return value.value + + def transform_bson(self, value): + return Position(value) + + +position_codec = PositionCodec() diff --git a/src/db/job_repository.py b/src/model/job_repository.py similarity index 98% rename from src/db/job_repository.py rename to src/model/job_repository.py index 53607fd..85ff0ca 100644 --- a/src/db/job_repository.py +++ b/src/model/job_repository.py @@ -21,7 +21,7 @@ class JobRepository: self = super().__new__(cls) cls._instance = self self.logger = create_logger("JobRepository") - self.collection = mongo_client.db["jobs"] + self.collection = mongo_client._db["jobs"] return cls._instance def find_by_id(self, job_id: str) -> Optional[JobPost]: diff --git a/src/db/user_repository.py b/src/model/user_repository.py similarity index 90% rename from src/db/user_repository.py rename to src/model/user_repository.py index 6ce4a9b..6a5d060 100644 --- a/src/db/user_repository.py +++ b/src/model/user_repository.py @@ -1,10 +1,12 @@ from typing import Optional +from bson.codec_options import TypeRegistry, CodecOptions from dotenv import load_dotenv from pymongo import UpdateOne from jobspy import create_logger from .User import User +from .codec.position_codec import position_codec from .monogo_db import mongo_client load_dotenv() @@ -21,7 +23,9 @@ class UserRepository: self = super().__new__(cls) cls._instance = self self.logger = create_logger("UserRepository") - self.collection = mongo_client.db["user"] + type_registry = TypeRegistry([position_codec]) + codec_options = CodecOptions(type_registry=type_registry) + self.collection = mongo_client.get_collection('user', codec_options=codec_options) self.collection.create_index('username', unique=True) return cls._instance @@ -99,4 +103,5 @@ class UserRepository: return old_users, new_users -user_repository = UserRepository() \ No newline at end of file + +user_repository = UserRepository() diff --git a/src/telegram_handler/button_callback/button_callback_context.py b/src/telegram_handler/button_callback/button_callback_context.py index 111c88d..0a8f09a 100644 --- a/src/telegram_handler/button_callback/button_callback_context.py +++ b/src/telegram_handler/button_callback/button_callback_context.py @@ -3,7 +3,7 @@ from __future__ import annotations from telegram import MaybeInaccessibleMessage from telegram.constants import ReactionEmoji -from db.job_repository import JobRepository +from model.job_repository import JobRepository from jobspy import create_logger from telegram_handler.button_callback.button_fire_strategy import FireStrategy from telegram_handler.button_callback.button_job_title_strategy import JobTitleStrategy diff --git a/src/telegram_handler/button_callback/button_fire_strategy.py b/src/telegram_handler/button_callback/button_fire_strategy.py index 70a4f76..7930549 100644 --- a/src/telegram_handler/button_callback/button_fire_strategy.py +++ b/src/telegram_handler/button_callback/button_fire_strategy.py @@ -1,7 +1,7 @@ from telegram import MaybeInaccessibleMessage from telegram.constants import ReactionEmoji -from db.job_repository import JobRepository +from model.job_repository import JobRepository from jobspy import create_logger from telegram_bot import TelegramBot from telegram_handler.button_callback.button_strategy import ButtonStrategy diff --git a/src/telegram_handler/telegram_default_handler.py b/src/telegram_handler/telegram_default_handler.py index c0d5208..5b1487e 100644 --- a/src/telegram_handler/telegram_default_handler.py +++ b/src/telegram_handler/telegram_default_handler.py @@ -4,7 +4,7 @@ from telegram.ext import ( ContextTypes, ) -from db.job_repository import JobRepository +from model.job_repository import JobRepository from jobspy import Site, scrape_jobs, JobPost from jobspy.scrapers.utils import create_logger from telegram_bot import TelegramBot diff --git a/src/telegram_handler/telegram_start_handler.py b/src/telegram_handler/telegram_start_handler.py index 6e24e9f..8da8bd3 100644 --- a/src/telegram_handler/telegram_start_handler.py +++ b/src/telegram_handler/telegram_start_handler.py @@ -5,9 +5,9 @@ from telegram.ext import ( ContextTypes, ConversationHandler, CommandHandler, MessageHandler, filters, ) -from db.Position import Position -from db.User import User -from db.user_repository import UserRepository, user_repository +from model.Position import Position +from model.User import User +from model.user_repository import UserRepository, user_repository from jobspy.scrapers.utils import create_logger from telegram_bot import TelegramBot from telegram_handler.start_handler_constats import START_MESSAGE, POSITION_MESSAGE, POSITION_NOT_FOUND, \ @@ -38,26 +38,27 @@ class TelegramStartHandler(TelegramHandler): """Starts the conversation and asks the user about their position.""" chat: Chat = update.message.chat user = User(full_name=chat.full_name, username=chat.username, chat_id=chat.id) - user_repository.insert_user(user) + # user_repository.insert_user(user) + await update.message.reply_text(START_MESSAGE) buttons = [[KeyboardButton(position.value)] for position in Position] reply_markup = ReplyKeyboardMarkup(buttons, one_time_keyboard=True, input_field_placeholder=Flow.POSITION.name) await update.message.reply_text( - START_MESSAGE + POSITION_MESSAGE, + POSITION_MESSAGE, reply_markup=reply_markup, ) return Flow.POSITION.value async def position(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: - """Stores the selected position and asks for a photo.""" + """Stores the selected position and asks for a locations.""" user = update.message.from_user self.logger.info("Position of %s: %s", user.first_name, update.message.text) - position = next((p for p in self.positions if p.name == update.message.text), None) + position = next((p for p in Position if p.name == update.message.text), None) if not position: await update.message.reply_text(POSITION_NOT_FOUND) - buttons = [[KeyboardButton(position.name)] for position in self.positions] + buttons = [[KeyboardButton(position.name)] for position in Position] reply_markup = ReplyKeyboardMarkup(buttons, one_time_keyboard=True, input_field_placeholder=Flow.POSITION.name) await update.message.reply_text( @@ -71,7 +72,7 @@ class TelegramStartHandler(TelegramHandler): return Flow.ADDRESS.value async def address(self, update: Update) -> int: - """Stores the photo and asks for a location.""" + """Asks for a location.""" user = update.message.from_user self.cities = update.message.text.split(",") reply_markup = ReplyKeyboardMarkup([[KeyboardButton("Yes"), KeyboardButton("No")]], one_time_keyboard=True, @@ -81,6 +82,7 @@ class TelegramStartHandler(TelegramHandler): return Flow.VERIFY_ADDRESS.value async def verify_address(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: + """Verify for a Address.""" if update.message.text == "No": await update.message.reply_text(LOCATION_MESSAGE) return Flow.ADDRESS.value @@ -94,7 +96,7 @@ class TelegramStartHandler(TelegramHandler): return Flow.EXPERIENCE.value async def experience(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: - """Stores the info about the user and ends the conversation.""" + """Asks for a experience.""" user = update.message.from_user self.logger.info("Experience of %s: %s", user.first_name, update.message.text) @@ -103,7 +105,7 @@ class TelegramStartHandler(TelegramHandler): return Flow.FILTERS.value async def filters_flow(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: - """Stores the location and asks for some info about the user.""" + """Asks for a filters_flow.""" self.filters = update.message.text.split(",") reply_markup = ReplyKeyboardMarkup([[KeyboardButton("Yes"), KeyboardButton("No")]], one_time_keyboard=True, input_field_placeholder=Flow.VERIFY_FILTERS.name) @@ -112,6 +114,7 @@ class TelegramStartHandler(TelegramHandler): return Flow.VERIFY_FILTERS.value async def verify_filter(self, update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: + """Verify for a filters_flow.""" if update.message.text == "No": await update.message.reply_text(FILTER_TILE_MESSAGE) return Flow.FILTERS.value diff --git a/tests/test_db.py b/tests/test_db.py index bbe0e02..e136074 100644 --- a/tests/test_db.py +++ b/tests/test_db.py @@ -1,6 +1,6 @@ from dotenv import load_dotenv -from db.job_repository import JobRepository +from model.job_repository import JobRepository from tests.test_util import createMockJob load_dotenv()