Skip to content

Commit f5c1db4

Browse files
authored
Merge pull request #135 from ilyarolf/feature/physical-items
Feature/physical items
2 parents 30df9af + 47ba75f commit f5c1db4

47 files changed

Lines changed: 1797 additions & 378 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

callbacks.py

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,23 @@
33
from enums.add_type import AddType
44
from enums.announcement_type import AnnouncementType
55
from enums.bot_entity import BotEntity
6+
from enums.buy_status import BuyStatus
67
from enums.cart_action import CartAction
78
from enums.coupon_type import CouponType
89
from enums.cryptocurrency import Cryptocurrency
910
from enums.entity_type import EntityType
11+
from enums.item_type import ItemType
1012
from enums.keyboard_button import KeyboardButton
1113
from enums.language import Language
14+
from enums.shipping_management_action import ShippingManagementAction
15+
from enums.shipping_type_property import ShippingOptionProperty
1216
from enums.sort_order import SortOrder
1317
from enums.sort_property import SortProperty
1418
from enums.statistics_entity import StatisticsEntity
1519
from enums.statistics_timedelta import StatisticsTimeDelta
1620
from enums.user_management_operation import UserManagementOperation
1721
from enums.coupon_number_of_uses import CouponNumberOfUses
22+
from enums.user_role import UserRole
1823
from utils.utils import get_text
1924

2025

@@ -39,6 +44,7 @@ class SortingCallback(CallbackData, prefix="sorting"):
3944

4045

4146
class AllCategoriesCallback(BaseCallback, SortingCallback, prefix="all_categories"):
47+
item_type: ItemType | None
4248
category_id: int | None
4349
subcategory_id: int | None
4450
quantity: int | None
@@ -47,6 +53,7 @@ class AllCategoriesCallback(BaseCallback, SortingCallback, prefix="all_categorie
4753

4854
@staticmethod
4955
def create(level: int,
56+
item_type: ItemType | None = None,
5057
category_id: int | None = None,
5158
subcategory_id: int | None = None,
5259
quantity: int | None = None,
@@ -56,6 +63,7 @@ def create(level: int,
5663
confirmation: bool = False,
5764
page: int = 0) -> 'AllCategoriesCallback':
5865
return AllCategoriesCallback(level=level,
66+
item_type=item_type,
5967
category_id=category_id, subcategory_id=subcategory_id,
6068
sort_order=sort_order, sort_property=sort_property,
6169
quantity=quantity, is_filter_enabled=is_filter_enabled,
@@ -67,6 +75,7 @@ class MyProfileCallback(BaseCallback, SortingCallback, prefix="my_profile"):
6775
buyItem_id: int | None = None
6876
cryptocurrency: Cryptocurrency | None = None
6977
language: Language | None = None
78+
user_role: UserRole = UserRole.USER
7079
confirmation: bool = False
7180
page: int
7281

@@ -79,13 +88,15 @@ def create(level: int,
7988
is_filter_enabled: bool = False,
8089
cryptocurrency: Cryptocurrency | None = None,
8190
language: Language | None = None,
91+
user_role: UserRole = UserRole.USER,
8292
confirmation: bool = False,
8393
page=0) -> 'MyProfileCallback':
8494
return MyProfileCallback(level=level, buy_id=buy_id, buyItem_id=buyItem_id,
8595
sort_order=sort_order, sort_property=sort_property,
8696
is_filter_enabled=is_filter_enabled,
8797
cryptocurrency=cryptocurrency,
8898
language=language,
99+
user_role=user_role,
89100
confirmation=confirmation,
90101
page=page)
91102

@@ -95,21 +106,24 @@ class CartCallback(BaseCallback, prefix="cart"):
95106
cart_id: int
96107
cart_item_id: int
97108
cart_action: CartAction | None
109+
shipping_option_id: int | None
98110
confirmation: bool
99111

100112
@staticmethod
101113
def create(level: int = 0,
102114
cart_id: int = -1,
103115
cart_item_id: int = -1,
104116
cart_action: CartAction | None = None,
117+
shipping_option_id: int | None = None,
105118
confirmation=False,
106119
page: int = 0):
107120
return CartCallback(level=level,
108121
cart_id=cart_id,
109122
cart_item_id=cart_item_id,
110123
cart_action=cart_action,
111-
page=page,
112-
confirmation=confirmation)
124+
shipping_option_id=shipping_option_id,
125+
confirmation=confirmation,
126+
page=page)
113127

114128

115129
class AdminMenuCallback(BaseCallback, prefix="admin_menu"):
@@ -241,3 +255,42 @@ def create(level: int, coupon_id: int | None = None, coupon_type: CouponType | N
241255
number_of_uses=number_of_uses,
242256
confirmation=confirmation,
243257
page=page)
258+
259+
260+
class ShippingManagementCallback(BaseCallback, prefix="shipping_management"):
261+
shipping_management_action: ShippingManagementAction | None = None
262+
shipping_type_property: ShippingOptionProperty | None = None
263+
shipping_id: int | None = None
264+
page: int
265+
confirmation: bool
266+
267+
@staticmethod
268+
def create(level: int, shipping_management_action: ShippingManagementAction | None = None,
269+
shipping_type_property: ShippingOptionProperty | None = None,
270+
shipping_id: int | None = None, confirmation: bool = False, page: int = 0):
271+
return ShippingManagementCallback(level=level,
272+
shipping_management_action=shipping_management_action,
273+
shipping_type_property=shipping_type_property,
274+
shipping_id=shipping_id,
275+
confirmation=confirmation,
276+
page=page)
277+
278+
279+
class BuysManagementCallback(BaseCallback, prefix="buys"):
280+
buy_id: int | None = None
281+
item_type: ItemType | None = None
282+
buy_status: BuyStatus | None = None
283+
page: int
284+
confirmation: bool = False
285+
286+
@staticmethod
287+
def create(level: int,
288+
buy_id: int | None = None,
289+
item_type: ItemType | None = None,
290+
buy_status: BuyStatus | None = None,
291+
confirmation: bool = False,
292+
page: int = 0):
293+
return BuysManagementCallback(level=level, buy_id=buy_id,
294+
item_type=item_type,
295+
buy_status=buy_status, confirmation=confirmation,
296+
page=page)

enums/buy_status.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from enum import Enum
2+
3+
4+
class BuyStatus(Enum):
5+
PAID = "PAID"
6+
SHIPPED = "SHIPPED"
7+
DELIVERED = "DELIVERED"
8+
COMPLETED = "COMPLETED"
9+
REFUNDED = "REFUNDED"

enums/item_type.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from enum import Enum
2+
3+
from enums.bot_entity import BotEntity
4+
from enums.language import Language
5+
from utils.utils import get_text
6+
7+
8+
class ItemType(Enum):
9+
DIGITAL = "DIGITAL"
10+
PHYSICAL = "PHYSICAL"
11+
12+
def get_localized(self, language: Language):
13+
return get_text(language, BotEntity.COMMON, self.value.lower())
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from enum import IntEnum
2+
3+
4+
class ShippingManagementAction(IntEnum):
5+
CREATE = 1
6+
DISABLE = 2
7+
EDIT = 3

enums/shipping_type_property.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from enum import IntEnum
2+
3+
4+
class ShippingOptionProperty(IntEnum):
5+
NAME = 1
6+
PRICE = 2

enums/user_role.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from enum import IntEnum
2+
3+
4+
class UserRole(IntEnum):
5+
USER = 1
6+
ADMIN = 2

handlers/admin/admin.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@
33
from aiogram.types import Message, CallbackQuery
44
from aiogram.utils.keyboard import InlineKeyboardBuilder
55
from callbacks import AdminMenuCallback, AnnouncementCallback, InventoryManagementCallback, \
6-
UserManagementCallback, StatisticsCallback, WalletCallback, MediaManagementCallback, CouponManagementCallback
6+
UserManagementCallback, StatisticsCallback, WalletCallback, MediaManagementCallback, CouponManagementCallback, \
7+
ShippingManagementCallback, MyProfileCallback
78
from enums.bot_entity import BotEntity
89
from enums.keyboard_button import KeyboardButton as KB
910
from enums.language import Language
11+
from enums.user_role import UserRole
1012
from handlers.admin.announcement import announcement_router
13+
from handlers.admin.buys_management import buys_management_router
1114
from handlers.admin.coupon_management import coupons_management
1215
from handlers.admin.inventory_management import inventory_management
1316
from handlers.admin.media_management import media_management
17+
from handlers.admin.shipping_management import shipping_management
1418
from handlers.admin.statistics import statistics
1519
from handlers.admin.user_management import user_management
1620
from handlers.admin.wallet import wallet
@@ -24,7 +28,9 @@
2428
statistics,
2529
wallet,
2630
media_management,
27-
coupons_management)
31+
coupons_management,
32+
shipping_management,
33+
buys_management_router)
2834

2935

3036
@admin_router.message(F.text.in_(KB.get_localized_set(KB.ADMIN_MENU)), AdminIdFilter())
@@ -52,6 +58,11 @@ async def admin(**kwargs):
5258
callback_data=MediaManagementCallback.create(level=0))
5359
kb_builder.button(text=get_text(language, BotEntity.ADMIN, "coupons_management"),
5460
callback_data=CouponManagementCallback.create(level=0))
61+
kb_builder.button(text=get_text(language, BotEntity.ADMIN, "shipping_management"),
62+
callback_data=ShippingManagementCallback.create(level=0))
63+
kb_builder.button(text=get_text(language, BotEntity.ADMIN, "buys_management"),
64+
callback_data=MyProfileCallback.create(level=3,
65+
user_role=UserRole.ADMIN))
5566
kb_builder.adjust(2)
5667
msg_text = get_text(language, BotEntity.ADMIN, "menu")
5768
if isinstance(message, Message):

handlers/admin/buys_management.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
from aiogram import Router, F
2+
from aiogram.filters import StateFilter
3+
from aiogram.fsm.context import FSMContext
4+
from aiogram.types import CallbackQuery, Message
5+
from sqlalchemy.ext.asyncio import AsyncSession
6+
from callbacks import BuysManagementCallback
7+
from enums.language import Language
8+
from handlers.admin.constants import BuysManagementStates
9+
from services.buys_management import BuysManagementService
10+
from utils.custom_filters import AdminIdFilter
11+
12+
buys_management_router = Router()
13+
14+
15+
async def set_track_number(**kwargs):
16+
callback: CallbackQuery = kwargs.get("callback")
17+
callback_data: BuysManagementCallback = kwargs.get("callback_data")
18+
state: FSMContext = kwargs.get("state")
19+
session: AsyncSession = kwargs.get("session")
20+
language: Language = kwargs.get("language")
21+
if callback_data.confirmation:
22+
msg, kb_builder = await BuysManagementService.update_track_number(session, state, language)
23+
else:
24+
msg, kb_builder = await BuysManagementService.set_update_track_number_state(callback_data, state, language)
25+
message = await callback.message.edit_text(text=msg, reply_markup=kb_builder.as_markup())
26+
await state.update_data(chat_id=message.chat.id, msg_id=message.message_id)
27+
28+
29+
@buys_management_router.message(AdminIdFilter(), F.text, StateFilter(BuysManagementStates.update_track_number))
30+
async def receive_track_number(message: Message,
31+
state: FSMContext,
32+
session: AsyncSession,
33+
language: Language):
34+
msg, kb_builder = await BuysManagementService.update_track_number_confirmation(message, state, session, language)
35+
await message.answer(text=msg, reply_markup=kb_builder.as_markup())
36+
37+
38+
@buys_management_router.callback_query(AdminIdFilter(), BuysManagementCallback.filter())
39+
async def announcement_navigation(callback: CallbackQuery,
40+
state: FSMContext,
41+
callback_data: BuysManagementCallback,
42+
session: AsyncSession,
43+
language: Language):
44+
current_level = callback_data.level
45+
46+
levels = {
47+
1: set_track_number
48+
}
49+
50+
current_level_function = levels[current_level]
51+
52+
kwargs = {
53+
"callback": callback,
54+
"callback_data": callback_data,
55+
"state": state,
56+
"session": session,
57+
"language": language
58+
}
59+
60+
await current_level_function(**kwargs)

handlers/admin/constants.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def get_confirmation_builder(announcement_type: AnnouncementType, language: Lang
2828

2929

3030
class InventoryManagementStates(StatesGroup):
31+
item_type = State()
3132
document = State()
3233
category = State()
3334
subcategory = State()
@@ -59,3 +60,13 @@ class MediaManagementStates(StatesGroup):
5960
class CouponsManagementStates(StatesGroup):
6061
coupon_name = State()
6162
coupon_value = State()
63+
64+
65+
class ShippingManagementStates(StatesGroup):
66+
shipping_name = State()
67+
shipping_price = State()
68+
edit_property = State()
69+
70+
71+
class BuysManagementStates(StatesGroup):
72+
update_track_number = State()

handlers/admin/inventory_management.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ async def add_items_document(message: Message, state: FSMContext, session: Async
8787
await state.clear()
8888

8989

90-
@inventory_management.message(AdminIdFilter(), F.text, StateFilter(InventoryManagementStates.category,
90+
@inventory_management.message(AdminIdFilter(), F.text, StateFilter(InventoryManagementStates.item_type,
91+
InventoryManagementStates.category,
9192
InventoryManagementStates.subcategory,
9293
InventoryManagementStates.price,
9394
InventoryManagementStates.description,

0 commit comments

Comments
 (0)