Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
7c5bff0
done, waiting for Amiel's fix
flexus445 Jun 20, 2023
3b5a505
ban works
flexus445 Jun 20, 2023
08d5d6a
admin can now ban and unban
flexus445 Jun 20, 2023
c81746c
added shahaf's config and load files
flexus445 Jun 20, 2023
3a047c7
Merge branch 'main' into 463-add-permissions-modifications
flexus445 Jun 20, 2023
07ebf49
Merge pull request #470 from yoavital98/463-add-permissions-modificat…
flexus445 Jun 20, 2023
87237be
fixed removeAccess in UI
flexus445 Jun 20, 2023
6791f57
Merge pull request #472 from yoavital98/104-fix-use-cases
yoavital98 Jun 20, 2023
d93e021
Merge pull request #473 from yoavital98/471-test-ui-features
flexus445 Jun 20, 2023
c4ef453
savegame
flexus445 Jun 20, 2023
a6ed658
implemented 404
flexus445 Jun 20, 2023
e5794f0
added entrance id and bid id counter #291
amielsaa Jun 20, 2023
a6b211b
added small fix
amielsaa Jun 20, 2023
334910c
Merge pull request #475 from yoavital98/291-add-entrance-id-persistance
amielsaa Jun 20, 2023
eae3fe1
ping is on
flexus445 Jun 20, 2023
0be6390
Merge pull request #476 from yoavital98/471-test-ui-features
flexus445 Jun 20, 2023
5561189
added small fix
amielsaa Jun 20, 2023
b807ab9
update
flexus445 Jun 20, 2023
afa8c01
Merge pull request #479 from yoavital98/291-add-entrance-id-persistance
amielsaa Jun 20, 2023
c9240d2
Merge pull request #478 from yoavital98/477-final-testing
flexus445 Jun 20, 2023
4e5c210
update
flexus445 Jun 20, 2023
da90f75
Merge pull request #481 from yoavital98/480-test-12387
flexus445 Jun 20, 2023
dd787e6
added small fix
amielsaa Jun 21, 2023
9a263c7
Merge pull request #482 from yoavital98/291-add-entrance-id-persistance
amielsaa Jun 21, 2023
e86f7bc
added usecases
yoavital98 Jun 21, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions ProjectCode/DAL/DiscountModel.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from peewee import *
from playhouse.mysql_ext import *
# from playhouse.postgres_ext import *
# from playhouse.mysql_ext import *
from playhouse.postgres_ext import *

from ProjectCode.DAL.StoreModel import StoreModel
from ProjectCode.DAL.database_conf import DatabaseConf
Expand Down
8 changes: 4 additions & 4 deletions ProjectCode/DAL/MessageModel.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ class Meta:
db_table = 'message'

message_id = AutoField()
sender_id = CharField(max_length=100)
receiver_id = CharField(max_length=100)
subject = CharField(max_length=100)
content = CharField(max_length=100)
sender_id = CharField(max_length=1000)
receiver_id = CharField(max_length=1000)
subject = CharField(max_length=1000)
content = CharField(max_length=1000)
date = DateTimeField()
read = BooleanField(default=False)

8 changes: 4 additions & 4 deletions ProjectCode/DAL/NotificationModel.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ class Meta:
db_table = 'notification'

notification_id = AutoField()
sender_id = CharField(max_length=100)
receiver_id = CharField(max_length=100)
subject = CharField(max_length=100)
content = CharField(max_length=100)
sender_id = CharField(max_length=1000)
receiver_id = CharField(max_length=1000)
subject = CharField(max_length=1000)
content = CharField(max_length=1000)
date = DateTimeField()
read = BooleanField(default=False)
4 changes: 2 additions & 2 deletions ProjectCode/DAL/PurchasePolicyModel.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from peewee import *
from playhouse.mysql_ext import *
# from playhouse.postgres_ext import *
# from playhouse.mysql_ext import *
from playhouse.postgres_ext import *
from ProjectCode.DAL.StoreModel import StoreModel
from ProjectCode.DAL.database_conf import DatabaseConf

Expand Down
2 changes: 1 addition & 1 deletion ProjectCode/DAL/StoreTransactionModel.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class Meta:
db_table = 'store_transaction'


transaction_id = IntegerField(primary_key=True)
transaction_id = IntegerField()
supply_id = IntegerField()
store_name = CharField()
user_name = CharField(max_length=100)
Expand Down
2 changes: 1 addition & 1 deletion ProjectCode/DAL/UserTransactionModel.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class Meta:
database = DatabaseConf.database
db_table = 'user_transaction'

transaction_id = IntegerField(primary_key=True)
transaction_id = IntegerField()
supply_id = IntegerField()
username = CharField(max_length=100)
overall_price = DoubleField()
Expand Down
6 changes: 3 additions & 3 deletions ProjectCode/DAL/database_conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@

class DatabaseConf:

database = SqliteDatabase('database.db')
# database = PostgresqlDatabase('postgres', user='postgres', password='lilythecat',
# host='database-1.ckwkbfc5249a.eu-north-1.rds.amazonaws.com', port=5432)
# database = SqliteDatabase('database.db')
database = PostgresqlDatabase('postgres', user='postgres', password='lilythecat',
host='database-1.ckwkbfc5249a.eu-north-1.rds.amazonaws.com', port=5432)
1 change: 1 addition & 0 deletions ProjectCode/Domain/MarketObjects/Bid.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ def approve_by_one(self):
self._left_to_approval -= 1

def increment_left_to_approve(self):
print("ok1")
self._left_to_approval += 1

def get_left_to_approval(self):
Expand Down
10 changes: 7 additions & 3 deletions ProjectCode/Domain/MarketObjects/Cart.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,17 +234,21 @@ def purchaseConfirmedBid(self, bid_id, store_name, user_name, card_number, card_
basket: Basket = self.baskets.get(store_name)
store: Store = basket.get_Store()
product: Product = store.getProductById(bid.get_product_id(), "")
single_product_dict = {store_name: product}
prod_list = [product]
single_product_dict = {store_name: prod_list}
# set of tuples (product_id, product_name, quantity, price))
single_product_dict_for_store = [(product.get_product_id(), product.get_name(), bid.get_quantity(),product.get_price())]
single_product_dict = {store_name: single_product_dict_for_store}
transaction_id = payment_service.pay(card_number, exp_month, exp_year, card_user_full_name, ccv,
card_holder_id)
supply_id = supply_service.dispatch_supply(card_user_full_name, address, city, country, zipcode)
store.purchaseBid(bid_id)
message_header = "Bid Purchase Received. Transaction_ID: " + str(transaction_id) + " Supply_ID: " + str(
supply_id)
transaction_history.addNewUserTransaction(transaction_id, supply_id, user_name, single_product_dict, bid.get_offer())
transaction_history.addNewStoreTransaction(transaction_id, supply_id, user_name, store_name, single_product_dict, bid.get_offer())
transaction_history.addNewStoreTransaction(transaction_id, supply_id, user_name, store_name, single_product_dict_for_store, bid.get_offer())
message_controller.send_notification(user_name, message_header, single_product_dict,datetime.now())
for staff_member in store.getAllStaffMembersNames():
for staff_member in store.getAllStaffMembers():
message_controller.send_notification(staff_member, message_header, single_product_dict, datetime.now())
self.clearBidFromBasket(store_name, bid_id)
return {
Expand Down
20 changes: 11 additions & 9 deletions ProjectCode/Domain/MarketObjects/Store.py
Original file line number Diff line number Diff line change
Expand Up @@ -520,10 +520,9 @@ def requestBid(self, bid: Bid):
for access in self.__accesses.values():
if access.canManageBids():
username = access.get_user().get_username()
if self.__bids_requests.get(username) is None:
self.__bids_requests[username] = bid
bid.increment_left_to_approve()
self.__bids.increment_left_to_approve(bid.bid_id)
self.__bids_requests[username] = bid
bid.increment_left_to_approve()
self.__bids.increment_left_to_approve(bid.bid_id)


def approveBid(self, username, bid_id):
Expand All @@ -546,7 +545,7 @@ def approveBid(self, username, bid_id):
if cur_bid.get_left_to_approval() == 0:
cur_bid.set_status(1)
MessageController().send_notification(cur_bid.get_username(), "Bid request was approved", f"Bid ID: {bid_id}. From store: {self.get_store_name()}", datetime.datetime.now())
for staff_member in self.getAllStaffMembersNames(username):
for staff_member in self.getAllStaffMembers():
MessageController().send_notification(staff_member, "Bid request was approved", f"Bid ID: {bid_id}. For user: {cur_bid.get_username()}", datetime.datetime.now())
self.__bids.set_status(bid_id, 1)
return cur_bid
Expand All @@ -573,7 +572,7 @@ def rejectBid(self, username, bid_id):
cur_bid.set_status(2)
self.__bids.set_status(bid_id, 2)
MessageController().send_notification(cur_bid.get_username(), "Bid request was rejected",f"Bid ID: {bid_id}. From store: {self.get_store_name()}", datetime.datetime.now())
for staff_member in self.getAllStaffMembersNames(username):
for staff_member in self.getAllStaffMembers():
MessageController().send_notification(staff_member, "Bid request was rejected",f"Bid ID: {bid_id}. For user: {cur_bid.get_username()}. rejecting member: {username}",datetime.datetime.now())
return cur_bid
else:
Expand Down Expand Up @@ -605,7 +604,7 @@ def sendAlternativeBid(self, username, bid_id, alternate_offer):
self.__bids.set_status(bid_id, 3)
cur_bid.set_status(3)
MessageController().send_notification(cur_bid.get_username(), "Alternative offer was sent for your bid", f"Bid ID: {bid_id}. From store: {self.get_store_name()}", datetime.datetime.now())
for staff_member in self.getAllStaffMembersNames(username):
for staff_member in self.getAllStaffMembers():
MessageController().send_notification(staff_member, "Alternative offer was sent for a bid", f"Bid ID: {bid_id}. For user: {cur_bid.get_username()}. sending member: {username}", datetime.datetime.now())
return cur_bid
else:
Expand Down Expand Up @@ -704,12 +703,15 @@ def checkLotteryParticipationShare(self, lottery_id, share):
return cur_lottery

def getAllStaffMembersNames(self, username):
cur_access: Access = self.accesses[username]
cur_access: Access = self.__accesses[username]
if cur_access is None:
raise Exception("Member has no access for that store")
if not cur_access.canViewStaffInformation():
raise Exception("You have no permission to view staff information")
return [access.get_user().get_username() for access in self.accesses.values()]
return [access.get_user().get_username() for access in self.__accesses.values()]

def getAllStaffMembers(self):
return [access.get_user().get_username() for access in self.__accesses.values()]

def increment_product_id_counter(self):
store_entry = StoreModel.get_by_id(self.__store_name)
Expand Down
9 changes: 9 additions & 0 deletions ProjectCode/Domain/Repository/BidsRepository.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from peewee import fn

from ProjectCode.DAL.BidModel import BidModel
from ProjectCode.Domain.MarketObjects.Bid import Bid
from ProjectCode.Domain.Repository.Repository import Repository
Expand Down Expand Up @@ -127,3 +129,10 @@ def set_offer(self, bid_id, alternate_offer):
bid_model = self.model.get_by_id(bid_id)
bid_model.offer = alternate_offer
bid_model.save()

def get_highest_id(self):
highest_id = self.model.select(fn.Max(self.model.bid_id)).scalar()
if highest_id is None:
return 0
return int(highest_id)+1

6 changes: 6 additions & 0 deletions ProjectCode/Domain/Repository/GuestRepository.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,9 @@ def getCart(self, entrance_id):
def clear(self):
for entry in self.model.select():
entry.delete_instance()

def get_highest_id(self):
highest_id = self.model.select(fn.Max(self.model.entrance_id)).scalar()
if highest_id is None:
return 0
return int(highest_id)+1
51 changes: 34 additions & 17 deletions ProjectCode/Domain/StoreFacade.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import peewee
from peewee import SqliteDatabase, MySQLDatabase, PostgresqlDatabase
# import psycopg2
import psycopg2
from ProjectCode.DAL.AccessModel import AccessModel
from ProjectCode.DAL.AccessStateModel import AccessStateModel
from ProjectCode.DAL.AdminModel import AdminModel
Expand Down Expand Up @@ -47,6 +47,7 @@
import threading

from ProjectCode.Domain.Repository.AdminRepository import AdminRepository
from ProjectCode.Domain.Repository.BidsRepository import BidsRepository
from ProjectCode.Domain.Repository.GuestRepository import GuestRepository
from ProjectCode.Domain.Repository.MemberRepository import MemberRepository
from ProjectCode.Domain.Repository.StoreRepository import StoreRepository
Expand Down Expand Up @@ -94,17 +95,17 @@ def __init__(self, config, send_notification_call=None):
# for m in model_list:
# m.delete().execute()

self.db.drop_tables([SystemModel, ProductModel, StoreModel, AccessModel, AccessStateModel, MemberModel, BasketModel,
ProductBasketModel, DiscountModel, AdminModel, GuestModel, BidModel, BidsRequestModel,
PurchasePolicyModel,
UserTransactionModel, StoreOfUserTransactionModel, ProductUserTransactionModel,
StoreTransactionModel,
ProductStoreTransactionModel, MessageModel, NotificationModel, NominationAgreementModel])
self.db.create_tables(
[SystemModel, ProductModel, StoreModel, AccessModel, AccessStateModel, MemberModel, BasketModel,
ProductBasketModel, DiscountModel, AdminModel, GuestModel, BidModel, BidsRequestModel, PurchasePolicyModel, UserTransactionModel,
StoreOfUserTransactionModel, ProductUserTransactionModel, StoreTransactionModel,
ProductStoreTransactionModel, MessageModel, NotificationModel, NominationAgreementModel])
# self.db.drop_tables([SystemModel, ProductModel, StoreModel, AccessModel, AccessStateModel, MemberModel, BasketModel,
# ProductBasketModel, DiscountModel, AdminModel, GuestModel, BidModel, BidsRequestModel,
# PurchasePolicyModel,
# UserTransactionModel, StoreOfUserTransactionModel, ProductUserTransactionModel,
# StoreTransactionModel,
# ProductStoreTransactionModel, MessageModel, NotificationModel, NominationAgreementModel])
# self.db.create_tables(
# [SystemModel, ProductModel, StoreModel, AccessModel, AccessStateModel, MemberModel, BasketModel,
# ProductBasketModel, DiscountModel, AdminModel, GuestModel, BidModel, BidsRequestModel, PurchasePolicyModel, UserTransactionModel,
# StoreOfUserTransactionModel, ProductUserTransactionModel, StoreTransactionModel,
# ProductStoreTransactionModel, MessageModel, NotificationModel, NominationAgreementModel])

self.lock_for_adding_and_purchasing = threading.Lock() # lock for purchase
self.admins = AdminRepository() # dict of admins
Expand All @@ -117,8 +118,10 @@ def __init__(self, config, send_notification_call=None):
# Services
# Data
self.accesses = TypedDict(str, Access) # optional TODO check key type
self.nextEntranceID = 0 # guest ID counter
self.bid_id_counter = 0 # bid counter
self.nextEntranceID = self.onlineGuests.get_highest_id() # guest ID counter

temp_rep = BidsRepository()
self.bid_id_counter = temp_rep.get_highest_id() # bid counter


# Admin
Expand Down Expand Up @@ -249,6 +252,12 @@ def getUserOrMember(self, user_name): # TODO: change the if's because checking
else:
raise Exception("user is not guest nor a member")

def checkIfBanned(self, username):
if self.members.keys().__contains__(str(username)):
return self.members.isBanned(username)
else:
raise Exception("Member doesn't exists.")


# gets an online member.
def getOnlineMemberOnly(self, user_name):
Expand Down Expand Up @@ -418,17 +427,24 @@ def placeBid(self, username, store_name, offer, product_id, quantity):
store: Store = self.stores.get(store_name)
if store is None:
raise Exception("Store doesnt exists")
print("ok2")
with self.lock_for_adding_and_purchasing:
answer = store.checkProductAvailability(product_id, quantity)
if answer is not None:
print("ok3")
bid: Bid = Bid(self.bid_id_counter, username, store_name, offer, product_id, quantity)
self.bid_id_counter += 1
print("ok4")
existing_member.addBidToBasket(bid, store)
print("ok5")
store: Store = self.stores[store_name]
print("ok6")
store.requestBid(bid)
print("ok7")
self.message_controller.send_notification(username, "Bid request was placed", "", datetime.now())
for staff_member in store.getAllStaffMembersNames():
for staff_member in store.getAllStaffMembers():
self.message_controller.send_notification(staff_member, "Bid request was placed", "", datetime.now())
print("ok8")
return bid
# return DataBid(bid)

Expand Down Expand Up @@ -685,8 +701,8 @@ def getPermissions(self, store_name, requester_username, nominated_username):

def getPermissionsAsJson(self, store_name, requester_username):
cur_store: Store = self.stores[store_name]
if not self.checkIfUserIsLoggedIn(requester_username):
raise Exception("User is not logged in")
# if not self.checkIfUserIsLoggedIn(requester_username):
# raise Exception("User is not logged in")
if cur_store is None:
raise Exception("No such store exists")
permissions: dict = cur_store.getPermissionsAsJson(requester_username)
Expand Down Expand Up @@ -1008,6 +1024,7 @@ def getUserStores(self, username):
stores_list.append(cur_store)
return stores_list


# ================== Messages ==================#

def sendMessageUsers(self, requesterID, receiverID, subject, content, creation_date, file):
Expand Down
32 changes: 27 additions & 5 deletions ProjectCode/Service/Service.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
import os
import inspect
import pickle
from peewee import *

import peewee
from peewee import *

from ProjectCode.DAL.database_conf import DatabaseConf
from ProjectCode.Domain.Helpers.JsonSerialize import JsonSerialize
from ProjectCode.Service.Response import Response
from ProjectCode.Domain.StoreFacade import StoreFacade

from ProjectCode.DAL.database_conf import DatabaseConf

# ------------------------------------ loadFileInit ------------------------------------ #
@staticmethod
Expand Down Expand Up @@ -42,8 +44,8 @@ def loadConfigInit(load_file):
raise Exception("PaymentService doesn't exist in load config")
if 'SupplyService' not in config_data.keys() or config_data["SupplyService"] == "":
raise Exception("SupplyService doesn't exist in load config")
if 'Database' not in config_data.keys():
raise Exception("Database doesn't exist in load config")
# if 'Database' not in config_data.keys():
# raise Exception("Database doesn't exist in load config")
if 'Admins' not in config_data.keys() or config_data["Admins"] == "":
raise Exception("Admins doesn't exist in load config")
admins : dict = config_data["Admins"]
Expand All @@ -53,6 +55,7 @@ def loadConfigInit(load_file):

# ------------------------------------------------------------------------------------- #


class Service:
_instance = None

Expand Down Expand Up @@ -978,4 +981,23 @@ def getAllMembers(self):
return Response(json.dumps(members), True)
except Exception as e:
logging.error(f"getAllMembers Error: {str(e)}.")
return Response(e, False)
return Response(e, False)

def checkIfBanned(self, username):
try:
res = self.store_facade.checkIfBanned(username)
logging.debug(
f"checkIfBanned has been called successfully")
return Response(res, True)
except Exception as e:
logging.error(f"checkIfBanned Error: {str(e)}.")
return Response(e, False)

def ping(self):
try:
db = DatabaseConf.database
if db.is_closed():
db.connect()
return True
except peewee.OperationalError:
return False
1 change: 0 additions & 1 deletion ProjectCode/Tests/_trial_temp-1.lock/symlink

This file was deleted.

Empty file.
Binary file removed ProjectCode/Tests/_trial_temp-1/database.db
Binary file not shown.
1 change: 0 additions & 1 deletion ProjectCode/Tests/_trial_temp-2.lock/symlink

This file was deleted.

Empty file.
Binary file removed ProjectCode/Tests/_trial_temp-2/database.db
Binary file not shown.
1 change: 0 additions & 1 deletion ProjectCode/Tests/_trial_temp.lock/symlink

This file was deleted.

Empty file.
Binary file removed ProjectCode/Tests/_trial_temp/database.db
Binary file not shown.
Loading