From 3fd7ae92c72aecf45c32af88c11b4e27daa4e3d3 Mon Sep 17 00:00:00 2001 From: Mateo Weiner Date: Wed, 27 Sep 2023 14:31:10 -0700 Subject: [PATCH] remove old code (#59) --- src/alert/controllers/api/__init__.py | 0 .../api/controllers/create_transaction.py | 42 ----- .../controllers/delete_all_transactions.py | 8 - src/alert/controllers/api/dfg/main.py | 45 ----- .../api/dfg/nodes/CornellDiningNow.py | 52 ------ .../controllers/api/dfg/nodes/DfgNode.py | 10 -- .../api/dfg/nodes/EateriesFromDB.py | 49 ------ .../controllers/api/dfg/nodes/EateryStubs.py | 10 -- .../controllers/api/dfg/nodes/__init__.py | 0 .../api/dfg/nodes/macros/EateryEvents.py | 38 ---- .../api/dfg/nodes/macros/LeftMergeEateries.py | 35 ---- .../api/dfg/nodes/macros/LeftMergeEvents.py | 29 --- .../nodes/macros/LeftMergeRegularEvents.py | 11 -- .../nodes/macros/LeftMergeRepeatedEvents.py | 12 -- .../api/dfg/nodes/system/ConvertFromJson.py | 28 --- .../api/dfg/nodes/system/ConvertToJson.py | 31 ---- .../dfg/nodes/system/DictResponseWrapper.py | 20 --- .../api/dfg/nodes/system/EateryGenerator.py | 30 ---- .../api/dfg/nodes/system/InMemoryCache.py | 77 -------- .../api/dfg/nodes/system/LeftMerge.py | 58 ------ .../api/dfg/nodes/system/Mapping.py | 21 --- .../dfg/nodes/wait_times/WaitTimeFilter.py | 39 ---- .../api/dfg/nodes/wait_times/WaitTimes.py | 135 -------------- .../management/commands/export_db_snapshot.py | 107 ----------- .../management/commands/ingest_db_snapshot.py | 63 ------- .../commands/ingest_log_transactions.py | 34 ---- .../commands/ingest_recent_transactions.py | 26 --- .../api/migrations/0001_initial.py | 166 ------------------ ...ventschedule_scheduleexception_and_more.py | 111 ------------ .../controllers/api/migrations/__init__.py | 0 .../api/models/TransactionModel.py | 15 -- src/alert/controllers/api/models/__init__.py | 9 - src/alert/controllers/api/serializers.py | 45 ----- src/alert/controllers/misc_code.py | 27 --- 34 files changed, 1383 deletions(-) delete mode 100644 src/alert/controllers/api/__init__.py delete mode 100644 src/alert/controllers/api/controllers/create_transaction.py delete mode 100644 src/alert/controllers/api/controllers/delete_all_transactions.py delete mode 100644 src/alert/controllers/api/dfg/main.py delete mode 100644 src/alert/controllers/api/dfg/nodes/CornellDiningNow.py delete mode 100644 src/alert/controllers/api/dfg/nodes/DfgNode.py delete mode 100644 src/alert/controllers/api/dfg/nodes/EateriesFromDB.py delete mode 100644 src/alert/controllers/api/dfg/nodes/EateryStubs.py delete mode 100644 src/alert/controllers/api/dfg/nodes/__init__.py delete mode 100644 src/alert/controllers/api/dfg/nodes/macros/EateryEvents.py delete mode 100644 src/alert/controllers/api/dfg/nodes/macros/LeftMergeEateries.py delete mode 100644 src/alert/controllers/api/dfg/nodes/macros/LeftMergeEvents.py delete mode 100644 src/alert/controllers/api/dfg/nodes/macros/LeftMergeRegularEvents.py delete mode 100644 src/alert/controllers/api/dfg/nodes/macros/LeftMergeRepeatedEvents.py delete mode 100644 src/alert/controllers/api/dfg/nodes/system/ConvertFromJson.py delete mode 100644 src/alert/controllers/api/dfg/nodes/system/ConvertToJson.py delete mode 100644 src/alert/controllers/api/dfg/nodes/system/DictResponseWrapper.py delete mode 100644 src/alert/controllers/api/dfg/nodes/system/EateryGenerator.py delete mode 100644 src/alert/controllers/api/dfg/nodes/system/InMemoryCache.py delete mode 100644 src/alert/controllers/api/dfg/nodes/system/LeftMerge.py delete mode 100644 src/alert/controllers/api/dfg/nodes/system/Mapping.py delete mode 100644 src/alert/controllers/api/dfg/nodes/wait_times/WaitTimeFilter.py delete mode 100644 src/alert/controllers/api/dfg/nodes/wait_times/WaitTimes.py delete mode 100644 src/alert/controllers/api/management/commands/export_db_snapshot.py delete mode 100644 src/alert/controllers/api/management/commands/ingest_db_snapshot.py delete mode 100644 src/alert/controllers/api/management/commands/ingest_log_transactions.py delete mode 100644 src/alert/controllers/api/management/commands/ingest_recent_transactions.py delete mode 100644 src/alert/controllers/api/migrations/0001_initial.py delete mode 100644 src/alert/controllers/api/migrations/0002_repeatingeventschedule_scheduleexception_and_more.py delete mode 100644 src/alert/controllers/api/migrations/__init__.py delete mode 100644 src/alert/controllers/api/models/TransactionModel.py delete mode 100644 src/alert/controllers/api/models/__init__.py delete mode 100644 src/alert/controllers/api/serializers.py delete mode 100644 src/alert/controllers/misc_code.py diff --git a/src/alert/controllers/api/__init__.py b/src/alert/controllers/api/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/alert/controllers/api/controllers/create_transaction.py b/src/alert/controllers/api/controllers/create_transaction.py deleted file mode 100644 index 86cba00..0000000 --- a/src/alert/controllers/api/controllers/create_transaction.py +++ /dev/null @@ -1,42 +0,0 @@ -from datetime import datetime, timedelta -import pytz - -from api.models import TransactionHistoryStore -from api.util.constants import vendor_name_to_internal_id - - -class CreateTransactionController: - - def __init__(self, data): - self._data = data - - def process(self): - if self._data["TIMESTAMP"] == "Invalid date": - return 0 - tz = pytz.timezone('America/New_York') - recent_datetime = tz.localize(datetime.strptime( - self._data["TIMESTAMP"], '%Y-%m-%d %I:%M:%S %p')) - canonical_date = recent_datetime.date() - block_end_time = recent_datetime.time() - if recent_datetime.hour < 4: - # between 12am and 4am associate this transaction with the previous day - canonical_date = canonical_date - timedelta(days=1) - num_inserted = 0 - ignored_names = set() - for place in self._data["UNITS"]: - internal_id = vendor_name_to_internal_id(place["UNIT_NAME"]).value - if internal_id == None: - ignored_names.add(place["UNIT_NAME"]) - else: - num_inserted += 1 - try: - TransactionHistoryStore.objects.create( - eatery_id=internal_id, - canonical_date=canonical_date, - block_end_time=block_end_time, - transaction_count=place["CROWD_COUNT"] - ) - except Exception as e: - # print(e) - num_inserted -= 1 - return num_inserted diff --git a/src/alert/controllers/api/controllers/delete_all_transactions.py b/src/alert/controllers/api/controllers/delete_all_transactions.py deleted file mode 100644 index 58b6035..0000000 --- a/src/alert/controllers/api/controllers/delete_all_transactions.py +++ /dev/null @@ -1,8 +0,0 @@ - -from api.models import TransactionHistoryStore - -class DeleteAllTransactionsController: - - def process(self): - return TransactionHistoryStore.objects.all().delete()[0] - \ No newline at end of file diff --git a/src/alert/controllers/api/dfg/main.py b/src/alert/controllers/api/dfg/main.py deleted file mode 100644 index c5be9f9..0000000 --- a/src/alert/controllers/api/dfg/main.py +++ /dev/null @@ -1,45 +0,0 @@ -from typing import Dict -from api.dfg.nodes.CornellDiningNow import CornellDiningNow -from api.dfg.nodes.EateriesFromDB import EateriesFromDB -from api.dfg.nodes.EateryStubs import EateryStubs -from api.dfg.nodes.macros.EateryEvents import EateryEvents -from api.dfg.nodes.macros.LeftMergeEateries import LeftMergeEateries -from api.dfg.nodes.system.ConvertToJson import ConvertToJson -from api.dfg.nodes.system.DictResponseWrapper import DictResponseWrapper -from api.dfg.nodes.system.EateryGenerator import EateryGenerator -from api.dfg.nodes.system.InMemoryCache import InMemoryCache -from api.dfg.nodes.system.Mapping import Mapping -from api.dfg.nodes.wait_times.WaitTimeFilter import WaitTimeFilter -from api.dfg.nodes.wait_times.WaitTimes import WaitTimes - -main_dfg = DictResponseWrapper( - ConvertToJson( - InMemoryCache( - WaitTimeFilter( - LeftMergeEateries( - Mapping( - child=EateryStubs(), - fn=lambda eatery, cache: EateryGenerator( - eatery_id=eatery.id, - wait_times_dfg=WaitTimes(eatery.id, cache), - ), - ), - LeftMergeEateries( - Mapping( - child=EateryStubs(), - fn=lambda eatery, cache: EateryGenerator( - eatery_id=eatery.id, - events_dfg=EateryEvents(eatery.id, cache), - ), - ), - LeftMergeEateries( - EateriesFromDB(), - LeftMergeEateries(CornellDiningNow(), EateryStubs()), - ), - ), - ) - ) - ) - ), - re_raise_exceptions=True, -) diff --git a/src/alert/controllers/api/dfg/nodes/CornellDiningNow.py b/src/alert/controllers/api/dfg/nodes/CornellDiningNow.py deleted file mode 100644 index 98693c7..0000000 --- a/src/alert/controllers/api/dfg/nodes/CornellDiningNow.py +++ /dev/null @@ -1,52 +0,0 @@ -import requests -from api.dfg.nodes.DfgNode import DfgNode -from api.util.constants import CORNELL_DINING_URL, dining_id_to_internal_id -from eatery.datatype.Eatery import Eatery - - -class CornellDiningNow(DfgNode): - def __call__(self, *args, **kwargs) -> list[Eatery]: - try: - response = requests.get(CORNELL_DINING_URL).json() - - except Exception as e: - raise e - - if response["status"] == "success": - json_eateries = response["data"]["eateries"] - eateries = [] - for json_eatery in json_eateries: - eateries.append(CornellDiningNow.parse_eatery(json_eatery)) - return eateries - - else: - raise Exception(response["message"]) - - @staticmethod - def parse_eatery(json_eatery: dict) -> Eatery: - # Events are parsed later - return Eatery( - id=dining_id_to_internal_id(json_eatery["id"]), - name=json_eatery["name"], - campus_area=json_eatery["campusArea"]["descrshort"], - latitude=json_eatery["latitude"], - longitude=json_eatery["longitude"], - payment_accepts_cash=True, - payment_accepts_brbs=any( - [ - method["descrshort"] == "Meal Plan - Debit" - for method in json_eatery["payMethods"] - ] - ), - payment_accepts_meal_swipes=any( - [ - method["descrshort"] == "Meal Plan - Swipe" - for method in json_eatery["payMethods"] - ] - ), - location=json_eatery["location"], - online_order_url=json_eatery["onlineOrderUrl"], - ) - - def description(self): - return "CornellDiningNow" diff --git a/src/alert/controllers/api/dfg/nodes/DfgNode.py b/src/alert/controllers/api/dfg/nodes/DfgNode.py deleted file mode 100644 index 57d5821..0000000 --- a/src/alert/controllers/api/dfg/nodes/DfgNode.py +++ /dev/null @@ -1,10 +0,0 @@ -class DfgNode: - - def __call__(self, *args, **kwargs): - raise Exception() - - def children(self): - return [] - - def description(self): - raise Exception() diff --git a/src/alert/controllers/api/dfg/nodes/EateriesFromDB.py b/src/alert/controllers/api/dfg/nodes/EateriesFromDB.py deleted file mode 100644 index 96069fb..0000000 --- a/src/alert/controllers/api/dfg/nodes/EateriesFromDB.py +++ /dev/null @@ -1,49 +0,0 @@ -from datetime import datetime - -from api.dfg.nodes.DfgNode import DfgNode -from eatery.datatype.Eatery import Eatery, EateryID -from eatery.models import EateryStore -from eatery.serializers import EateryStoreSerializer - -# eventually need to deprecate this for a custom DB backend storing all of the overrides - - -class EateriesFromDB(DfgNode): - def __call__(self, *args, **kwargs) -> list[Eatery]: - eateries = EateryStore.objects.all() - serialized_eateries = EateryStoreSerializer(data=eateries, many=True) - serialized_eateries.is_valid() - return list(serialized_eateries.data) - - - @staticmethod - def none_repr(str): - return None if str == None or len(str) == 0 else str - - @staticmethod - def eatery_from_serialized( - serialized_eatery: dict, serialized_alerts: list[dict] - ) -> Eatery: - return Eatery( - id=EateryID(serialized_eatery["id"]), - name=EateriesFromDB.none_repr(serialized_eatery["name"]), - image_url=EateriesFromDB.none_repr(serialized_eatery["image_url"]), - menu_summary=EateriesFromDB.none_repr(serialized_eatery["menu_summary"]), - campus_area=EateriesFromDB.none_repr(serialized_eatery["campus_area"]), - events=None, - latitude=serialized_eatery["latitude"], - longitude=serialized_eatery["longitude"], - payment_accepts_cash=serialized_eatery["payment_accepts_cash"], - payment_accepts_brbs=serialized_eatery["payment_accepts_brbs"], - payment_accepts_meal_swipes=serialized_eatery[ - "payment_accepts_meal_swipes" - ], - location=EateriesFromDB.none_repr(serialized_eatery["location"]), - online_order_url=EateriesFromDB.none_repr( - serialized_eatery["online_order_url"] - ), - - ) - - def description(self): - return "EateriesFromDB" diff --git a/src/alert/controllers/api/dfg/nodes/EateryStubs.py b/src/alert/controllers/api/dfg/nodes/EateryStubs.py deleted file mode 100644 index 780f15c..0000000 --- a/src/alert/controllers/api/dfg/nodes/EateryStubs.py +++ /dev/null @@ -1,10 +0,0 @@ -from api.dfg.nodes.DfgNode import DfgNode -from eatery.datatype.Eatery import Eatery, EateryID - - -class EateryStubs(DfgNode): - def __call__(self, *args, **kwargs) -> list[Eatery]: - return [Eatery(id=id) for id in EateryID] - - def description(self): - return "EateryStubs" diff --git a/src/alert/controllers/api/dfg/nodes/__init__.py b/src/alert/controllers/api/dfg/nodes/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/alert/controllers/api/dfg/nodes/macros/EateryEvents.py b/src/alert/controllers/api/dfg/nodes/macros/EateryEvents.py deleted file mode 100644 index 38d55a8..0000000 --- a/src/alert/controllers/api/dfg/nodes/macros/EateryEvents.py +++ /dev/null @@ -1,38 +0,0 @@ -from api.dfg.nodes.DfgNode import DfgNode -from api.dfg.nodes.macros.LeftMergeRegularEvents import LeftMergeRegularEvents -from api.dfg.nodes.macros.LeftMergeRepeatedEvents import LeftMergeRepeatedEvents -from api.dfg.nodes.schedule.CacheMenuInjection import CacheMenuInjection -from event.controllers.ClosedSchedule import ClosedSchedule -from api.dfg.nodes.schedule.CornellDiningEvents import CornellDiningEvents -from api.dfg.nodes.schedule.ModifiedSchedules import ModifiedSchedules -from api.dfg.nodes.schedule.RepeatingSchedule import RepeatingSchedule -from eatery.datatype.Eatery import EateryID - - -# Merges two lists of objects, combining objects with matching IDs (keys of object in left array have precedence if -# conflict) -class EateryEvents(DfgNode): - def __init__(self, eatery_id: EateryID, cache): - self.macro = CacheMenuInjection( - ClosedSchedule( - eatery_id, - LeftMergeRepeatedEvents( - ModifiedSchedules(eatery_id, cache), - LeftMergeRegularEvents( - RepeatingSchedule(eatery_id, cache), - CornellDiningEvents(eatery_id, cache), - ), - ), - cache, - ), - cache, - ) - - def children(self): - return self.macro.children() - - def __call__(self, *args, **kwargs): - return self.macro(*args, **kwargs) - - def description(self): - return "EateryEvents" diff --git a/src/alert/controllers/api/dfg/nodes/macros/LeftMergeEateries.py b/src/alert/controllers/api/dfg/nodes/macros/LeftMergeEateries.py deleted file mode 100644 index cc621d2..0000000 --- a/src/alert/controllers/api/dfg/nodes/macros/LeftMergeEateries.py +++ /dev/null @@ -1,35 +0,0 @@ -from api.dfg.nodes.DfgNode import DfgNode -from api.dfg.nodes.system.ConvertToJson import ConvertToJson -from api.dfg.nodes.system.ConvertFromJson import EateryFromJson -from api.dfg.nodes.system.LeftMerge import LeftMerge - -class LeftMergeEateries(DfgNode): - - def __init__(self, left: DfgNode, right: DfgNode): - def comparator(left, right): - if left["id"] == right["id"]: - return 0 - elif left["id"] == None: - return -1 - elif right["id"] == None: - return 1 - elif left["id"] < right["id"]: - return -1 - else: - return 1 - self.macro = EateryFromJson( - LeftMerge( - ConvertToJson(left), - ConvertToJson(right), - comparator - ) - ) - - def children(self): - return self.macro.children() - - def __call__(self, *args, **kwargs): - return self.macro(*args, **kwargs) - - def description(self): - return "LeftMergeEateries" diff --git a/src/alert/controllers/api/dfg/nodes/macros/LeftMergeEvents.py b/src/alert/controllers/api/dfg/nodes/macros/LeftMergeEvents.py deleted file mode 100644 index 19eb6cc..0000000 --- a/src/alert/controllers/api/dfg/nodes/macros/LeftMergeEvents.py +++ /dev/null @@ -1,29 +0,0 @@ -"""from api.dfg.nodes.DfgNode import DfgNode -from api.dfg.nodes.system.ConvertFromJson import EventFromJson -from api.dfg.nodes.system.ConvertToJson import ConvertToJson -from api.dfg.nodes.system.LeftMerge import LeftMerge - - -class LeftMergeEvents(DfgNode): - def __init__(self, left: DfgNode, right: DfgNode, attr_lst: list[str]): - def comparator(left, right): - left_val = [left.get(attr) for attr in attr_lst] - right_val = [right.get(attr) for attr in attr_lst] - if left_val == right_val: - return 0 - else: - return 1 - - self.macro = EventFromJson( - LeftMerge(ConvertToJson(left), ConvertToJson(right), comparator) - ) - - def children(self): - return self.macro.children() - - def __call__(self, *args, **kwargs): - return self.macro(*args, **kwargs) - - def description(self): - return "LeftMergeEvents" -""" \ No newline at end of file diff --git a/src/alert/controllers/api/dfg/nodes/macros/LeftMergeRegularEvents.py b/src/alert/controllers/api/dfg/nodes/macros/LeftMergeRegularEvents.py deleted file mode 100644 index 712187c..0000000 --- a/src/alert/controllers/api/dfg/nodes/macros/LeftMergeRegularEvents.py +++ /dev/null @@ -1,11 +0,0 @@ -from api.dfg.nodes.DfgNode import DfgNode -from api.dfg.nodes.macros.LeftMergeEvents import LeftMergeEvents - - -class LeftMergeRegularEvents(LeftMergeEvents): - """ - Merges two lists of Event objects, regardless of how they were generated - """ - - def __init__(self, left: DfgNode, right: DfgNode): - super().__init__(left, right, ["canonical_date", "description"]) diff --git a/src/alert/controllers/api/dfg/nodes/macros/LeftMergeRepeatedEvents.py b/src/alert/controllers/api/dfg/nodes/macros/LeftMergeRepeatedEvents.py deleted file mode 100644 index 014da8f..0000000 --- a/src/alert/controllers/api/dfg/nodes/macros/LeftMergeRepeatedEvents.py +++ /dev/null @@ -1,12 +0,0 @@ -from api.dfg.nodes.DfgNode import DfgNode -from api.dfg.nodes.macros.LeftMergeEvents import LeftMergeEvents - - -class LeftMergeRepeatedEvents(LeftMergeEvents): - """ - Merges two lists of Event objects, one of which consists of a list of events generated by a - repeated schedule and the other of which consists of a list of events that are exceptions - """ - - def __init__(self, left: DfgNode, right: DfgNode): - super().__init__(left, right, ["canonical_date", "generated_by"]) diff --git a/src/alert/controllers/api/dfg/nodes/system/ConvertFromJson.py b/src/alert/controllers/api/dfg/nodes/system/ConvertFromJson.py deleted file mode 100644 index b440739..0000000 --- a/src/alert/controllers/api/dfg/nodes/system/ConvertFromJson.py +++ /dev/null @@ -1,28 +0,0 @@ -from typing import Union - - -from api.dfg.nodes.DfgNode import DfgNode -from eatery.datatype.Eatery import Eatery - - -class EateryFromJson(DfgNode): - def __init__(self, child: DfgNode): - self.child = child - - def __call__(self, *args, **kwargs): - result = self.child(*args, **kwargs) - return EateryFromJson.from_json(result, *args, **kwargs) - - def children(self): - return [self.child] - - @staticmethod - def from_json(obj: Union[list, dict], *args, **kwargs): - if isinstance(obj, list): - return [EateryFromJson.from_json(elem, *args, **kwargs) for elem in obj] - else: - return Eatery.from_json(obj) - - def description(self): - return "EateryFromJson" - diff --git a/src/alert/controllers/api/dfg/nodes/system/ConvertToJson.py b/src/alert/controllers/api/dfg/nodes/system/ConvertToJson.py deleted file mode 100644 index 3894201..0000000 --- a/src/alert/controllers/api/dfg/nodes/system/ConvertToJson.py +++ /dev/null @@ -1,31 +0,0 @@ -from typing import Union - -from event.datatype.Event import Event -from api.dfg.nodes.DfgNode import DfgNode -from eatery.datatype.Eatery import Eatery - - -class ConvertToJson(DfgNode): - def __init__(self, child: DfgNode): - self.child = child - - def __call__(self, *args, **kwargs): - result = self.child(*args, **kwargs) - return ConvertToJson.to_json(result, *args, **kwargs) - - def children(self): - return [self.child] - - @staticmethod - def to_json(obj: Union[list, Eatery, Event], *args, **kwargs): - if isinstance(obj, list): - return [ConvertToJson.to_json(elem, *args, **kwargs) for elem in obj] - else: - return obj.to_json( - tzinfo=kwargs.get("tzinfo"), - start=kwargs.get("start"), - end=kwargs.get("end"), - ) - - def description(self): - return "ConvertToJson" diff --git a/src/alert/controllers/api/dfg/nodes/system/DictResponseWrapper.py b/src/alert/controllers/api/dfg/nodes/system/DictResponseWrapper.py deleted file mode 100644 index db3b67d..0000000 --- a/src/alert/controllers/api/dfg/nodes/system/DictResponseWrapper.py +++ /dev/null @@ -1,20 +0,0 @@ -from api.dfg.nodes.DfgNode import DfgNode -from api.util.json import success_json, error_json - -class DictResponseWrapper(DfgNode): - - def __init__(self, child: DfgNode, re_raise_exceptions: bool = False): - self.child = child - self.re_raise_exceptions = re_raise_exceptions - - def __call__(self, *args, **kwargs): - try: - return success_json(self.child(*args, **kwargs)) - - except Exception as e: - if self.re_raise_exceptions: - raise e - return error_json(str(e)) - - def description(self): - return "DictResponseWrapper" diff --git a/src/alert/controllers/api/dfg/nodes/system/EateryGenerator.py b/src/alert/controllers/api/dfg/nodes/system/EateryGenerator.py deleted file mode 100644 index 0e98995..0000000 --- a/src/alert/controllers/api/dfg/nodes/system/EateryGenerator.py +++ /dev/null @@ -1,30 +0,0 @@ -from typing import Optional - -from api.dfg.nodes.DfgNode import DfgNode -from eatery.datatype.Eatery import Eatery, EateryID - - -class EateryGenerator(DfgNode): - def __init__( - self, - eatery_id: EateryID, - events_dfg: Optional[DfgNode] = None, - wait_times_dfg: Optional[DfgNode] = None, - ): - self.eatery_id = eatery_id - self.events_dfg = events_dfg - self.wait_times_dfg = wait_times_dfg - - def __call__(self, *args, **kwargs) -> list: - return Eatery( - id=self.eatery_id, - events=None - if self.events_dfg is None - else self.events_dfg(*args, **kwargs), - wait_times=None - if self.wait_times_dfg is None - else self.wait_times_dfg(*args, **kwargs), - ) - - def description(self): - return "EateryGenerator" diff --git a/src/alert/controllers/api/dfg/nodes/system/InMemoryCache.py b/src/alert/controllers/api/dfg/nodes/system/InMemoryCache.py deleted file mode 100644 index 9966a6c..0000000 --- a/src/alert/controllers/api/dfg/nodes/system/InMemoryCache.py +++ /dev/null @@ -1,77 +0,0 @@ -import time - -from api.dfg.nodes.DfgNode import DfgNode -from typing import Optional - -from api.dfg.nodes.system.ConvertToJson import ConvertToJson - - -class DataSnapshot: - - def __init__(self, args, kwargs, data, time): - self.data = data - self.recorded_time = time - self.args = args - self.kwargs = kwargs - - def is_usable_snapshot(self, oldest_possible_time, args, kwargs): - return args == self.args and kwargs == self.kwargs and self.recorded_time >= oldest_possible_time - - def get_data(self): - return self.data - - def to_json(self): - return ConvertToJson.to_json(self.data, *self.args, **self.kwargs) - - def get_recorded_time(self): - return self.recorded_time - - -class InMemoryCache(DfgNode): - - def __init__(self, child, expiration: float = 3600, max_size: int = 5): - self.child = child - self.expiration = expiration - self.max_size = max_size - self.snapshots: list[DataSnapshot] = [] - - def current_time(self): - return time.time() - - def fifo_index(self): - if len(self.snapshots) == 0: - return None - oldest_snapshot_time = self.snapshots[0].get_recorded_time() - oldest_snapshot_index = 0 - for i in range(1, len(self.snapshots)): - if self.snapshots[i].get_recorded_time() < oldest_snapshot_time: - oldest_snapshot_time = self.snapshots[i].get_recorded_time() - oldest_snapshot_index = i - return oldest_snapshot_index - - def __call__(self, *args, **kwargs): - should_reload = kwargs.get("reload") - best_snapshot = None - for snapshot in self.snapshots: - if not should_reload and snapshot.is_usable_snapshot(self.current_time() - self.expiration, args, kwargs): - if best_snapshot == None or snapshot.recorded_time > best_snapshot.recorded_time: - best_snapshot = snapshot - if best_snapshot is not None: - return snapshot.get_data() - - new_snapshot = DataSnapshot(args, kwargs, self.child(*args, **kwargs), self.current_time()) - if len(self.snapshots) < self.max_size: - self.snapshots.append(new_snapshot) - else: - index_to_replace = self.fifo_index() - self.snapshots[index_to_replace] = new_snapshot - return new_snapshot.get_data() - - def to_json(self, *args, **kwargs): - for snapshot in self.snapshots: - if snapshot.is_usable_snapshot(self.current_time() - self.expiration, args, kwargs): - return snapshot.to_json() - return ConvertToJson.to_json(self.child(*args, **kwargs), *args, **kwargs) - - def description(self): - return "InMemoryCache" diff --git a/src/alert/controllers/api/dfg/nodes/system/LeftMerge.py b/src/alert/controllers/api/dfg/nodes/system/LeftMerge.py deleted file mode 100644 index 3f1edbb..0000000 --- a/src/alert/controllers/api/dfg/nodes/system/LeftMerge.py +++ /dev/null @@ -1,58 +0,0 @@ -from api.dfg.nodes.DfgNode import DfgNode -from typing import Callable, TypeVar, Any -from functools import cmp_to_key -T = TypeVar("T") - -# Merges two lists of objects, combining objects with matching IDs (keys of object in left array have precedence if -# conflict) -class LeftMerge(DfgNode): - - def __init__(self, left: DfgNode, right: DfgNode, comparator: Callable[[T, T], int]): - self.left = left - self.right = right - self.comparator = comparator - - def children(self): - return [self.left, self.right] - - def __call__(self: Any, *args, **kwargs): - left_lst = sorted(self.left(*args, **kwargs), key=cmp_to_key(self.comparator)) - right_lst = sorted(self.right(*args, **kwargs), key=cmp_to_key(self.comparator)) - left_json = _pop_first(left_lst) - right_json = _pop_first(right_lst) - merged_lst = [] - while left_json is not None and right_json is not None: - if self.comparator(left_json, right_json) == 0: - merged_json = {} - for key in right_json: - if right_json[key] is not None: - merged_json[key] = right_json[key] - for key in left_json: - if left_json[key] is not None: - merged_json[key] = left_json[key] - merged_lst.append(merged_json) - left_json = _pop_first(left_lst) - right_json = _pop_first(right_lst) - elif self.comparator(left_json, right_json) < 0: - merged_lst.append(left_json) - left_json = _pop_first(left_lst) - else: - merged_lst.append(right_json) - right_json = _pop_first(right_lst) - if left_json is not None: - merged_lst.append(left_json) - if right_json is not None: - merged_lst.append(right_json) - merged_lst.extend(left_lst) - merged_lst.extend(right_lst) - return merged_lst - - def description(self): - return "LeftMerge" - - -def _pop_first(lst: list): - try: - return lst.pop(0) - except IndexError: - return None diff --git a/src/alert/controllers/api/dfg/nodes/system/Mapping.py b/src/alert/controllers/api/dfg/nodes/system/Mapping.py deleted file mode 100644 index 8028549..0000000 --- a/src/alert/controllers/api/dfg/nodes/system/Mapping.py +++ /dev/null @@ -1,21 +0,0 @@ -from typing import Any, Callable - -from api.dfg.nodes.DfgNode import DfgNode -from eatery.datatype.Eatery import Eatery, EateryID - - -class Mapping(DfgNode): - def __init__(self, child: DfgNode, fn: Callable[[Any, dict], DfgNode]): - self.child = child - self.fn = fn - - def __call__(self, *args, **kwargs) -> list: - result = [] - cache = {} - for ele in self.child(*args, **kwargs): - dfg = self.fn(ele, cache) - result.append(dfg(*args, **kwargs)) - return result - - def description(self): - return "Mapping" diff --git a/src/alert/controllers/api/dfg/nodes/wait_times/WaitTimeFilter.py b/src/alert/controllers/api/dfg/nodes/wait_times/WaitTimeFilter.py deleted file mode 100644 index a2830fb..0000000 --- a/src/alert/controllers/api/dfg/nodes/wait_times/WaitTimeFilter.py +++ /dev/null @@ -1,39 +0,0 @@ -from api.datatype.WaitTimesDay import WaitTimesDay -from api.dfg.nodes.DfgNode import DfgNode - - -# Removes all wait times that are not part of the eatery's events - -class WaitTimeFilter(DfgNode): - def __init__(self, child: DfgNode): - self.child = child - - def children(self): - return [self.child] - - def __call__(self, *args, **kwargs): - eateries = self.child(*args, **kwargs) - result = [] - for eatery in eateries: - if eatery.wait_times is None: - result.append(eatery.clone()) - else: - wait_times_filtered = [] - for day_wait_times in eatery.wait_times: - filtered_data = [] - for wait_time_data in day_wait_times.data: - eatery_events = eatery.events() - if any([wait_time_data.timestamp in event for event in eatery_events]): - filtered_data.append(wait_time_data) - if len(filtered_data) > 0: - wait_times_filtered.append(WaitTimesDay( - canonical_date=day_wait_times.canonical_date, - data=filtered_data - )) - eatery_clone = eatery.clone() - eatery_clone.wait_times = wait_times_filtered - result.append(eatery_clone) - return result - - def description(self): - return "WaitTimeFilter" diff --git a/src/alert/controllers/api/dfg/nodes/wait_times/WaitTimes.py b/src/alert/controllers/api/dfg/nodes/wait_times/WaitTimes.py deleted file mode 100644 index f98aeb2..0000000 --- a/src/alert/controllers/api/dfg/nodes/wait_times/WaitTimes.py +++ /dev/null @@ -1,135 +0,0 @@ -from datetime import date, timedelta - -import pytz -from event.datatype.Event import Event -from api.datatype.WaitTime import WaitTime -from api.datatype.WaitTimesDay import WaitTimesDay -from api.dfg.nodes.DfgNode import DfgNode -from api.models import TransactionHistoryStore -from api.util.time import combined_timestamp -from django.db.models import Avg -from eatery.datatype.Eatery import Eatery, EateryID - - -class WaitTimes(DfgNode): - def __init__(self, eatery_id: EateryID, cache): - self.eatery_id = eatery_id - self.cache = cache - - def __call__(self, *args, **kwargs) -> list[Eatery]: - if "transactions" not in self.cache: - transactions = {} - date = kwargs.get("start") - while date <= kwargs.get("end"): - transactions[date] = [] - past_days = [] - for i in range(1, 13): - past_days.append(date - timedelta(days=7 * i)) - transaction_avg_counts = ( - TransactionHistoryStore.objects.filter(canonical_date__in=past_days) - .values("eatery_id", "block_end_time") - .annotate(transaction_avg=Avg("transaction_count")) - ) - for unit in transaction_avg_counts: - transactions[date].append(unit) - date += timedelta(days=1) - self.cache["transactions"] = transactions - - eatery_wait_times = [] - for date in self.cache["transactions"]: - eatery_transaction_avgs = [ - transaction_avg - for transaction_avg in self.cache["transactions"][date] - if transaction_avg["eatery_id"] == self.eatery_id.value - ] - date_wait_times = WaitTimes.generate_eatery_wait_times_by_day( - self.eatery_id, date, eatery_transaction_avgs, kwargs.get("tzinfo") - ) - if date_wait_times is not None: - eatery_wait_times.append(date_wait_times) - - return eatery_wait_times - - # Expected amount of time (in seconds) for the length of the line to decrease by 1 person - # Returns [lower, expected, upper] - @staticmethod - def line_decrease_by_one_time(eatery_id: EateryID) -> list[int]: - if eatery_id == EateryID.MACS_CAFE: - return [24, 27, 30] - elif eatery_id == EateryID.MATTINS_CAFE: - return [9, 15, 21] - elif eatery_id == EateryID.TERRACE: - return [15, 27, 36] - elif eatery_id == EateryID.OKENSHIELDS: - return [4, 8, 12] - else: - return [18, 21, 24] - - # Expected amount of time (in seconds) for a person to get food, assuming an empty eatery, not including the - # amount of time to check out Returns [lower, expected, upper] - @staticmethod - def base_time_to_get_food(eatery_id: EateryID) -> list[int]: - if eatery_id == EateryID.MACS_CAFE: - return [240, 300, 360] - elif eatery_id == EateryID.MATTINS_CAFE: - return [150, 210, 270] - elif eatery_id == EateryID.TERRACE: - return [180, 300, 420] - elif eatery_id == EateryID.OKENSHIELDS: - return [80, 120, 180] - else: - return [180, 240, 300] - - @staticmethod - def generate_eatery_wait_times_by_day( - eatery_id: EateryID, date: date, transactions: list, tzinfo: pytz.tzinfo - ) -> WaitTimesDay: - wait_times_data = [] - customers_waiting_in_line = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] - for index in reversed(range(0, len(transactions))): - base_times = WaitTimes.base_time_to_get_food(eatery_id) - line_decrease_times = WaitTimes.line_decrease_by_one_time(eatery_id) - # we assume all the guests in this transaction bucket showed up [how_long_ago_guest_arrival] minutes ago - how_long_ago_guest_arrival = ( - base_times[1] - + line_decrease_times[1] * transactions[index]["transaction_avg"] - ) - prev_bucket_guest_arrival = int(how_long_ago_guest_arrival // (5 * 60)) - if prev_bucket_guest_arrival > 9: - pass - # TODO: Send a slack error here instead - # print("Fatal Wait Times Error - prev_bucket_guest_arrival far too large.") - else: - customers_waiting_in_line[prev_bucket_guest_arrival] += transactions[ - index - ]["transaction_avg"] - num_customers = customers_waiting_in_line.pop(0) - wait_time_low = int( - base_times[0] + line_decrease_times[0] * num_customers - ) - wait_time_expected = int( - base_times[1] + line_decrease_times[1] * num_customers - ) - wait_time_high = int( - base_times[2] + line_decrease_times[2] * num_customers - ) - - customers_waiting_in_line.append(0.0) - block_end_time = transactions[index]["block_end_time"] - timestamp = int( - combined_timestamp(date, block_end_time, tzinfo) - 5 * 60 / 2 - ) - wait_times_data.insert( - 0, - WaitTime( - timestamp=timestamp, - wait_time_low=wait_time_low, - wait_time_expected=wait_time_expected, - wait_time_high=wait_time_high, - ), - ) - - return WaitTimesDay(canonical_date=date, data=wait_times_data) - - def description(self): - return "WaitTimes" diff --git a/src/alert/controllers/api/management/commands/export_db_snapshot.py b/src/alert/controllers/api/management/commands/export_db_snapshot.py deleted file mode 100644 index 8918a36..0000000 --- a/src/alert/controllers/api/management/commands/export_db_snapshot.py +++ /dev/null @@ -1,107 +0,0 @@ -import json -from datetime import datetime -from pathlib import Path - -import api.models as models -import api.serializers as serializers -import eatery.serializers as eatery_serializers -import pytz -from api.util.constants import SnapshotFileName -from django.core.management.base import BaseCommand - - -class Command(BaseCommand): - help = "Saves the current state of the database" - - def write_to_file( - self, serializer, db_objects, folder_path, file_name_enum: SnapshotFileName - ): - file_path = f"{folder_path}/{file_name_enum.value}" - serialized_lst = serializer(db_objects, many=True) - with open(file_path, "w") as file: - for obj in serialized_lst.data: - file.write(json.dumps(obj) + "\n") - - def handle(self, *args, **options): - tzinfo = pytz.timezone("US/Eastern") - time = datetime.now(tzinfo).strftime("%Y-%m-%d %H:%M:%S") - folder_path = f"db_snapshots/{time}" - Path(folder_path).mkdir(parents=True, exist_ok=True) - - eateries = models.EateryStore.objects.all() - self.write_to_file( - eatery_serializers.EateryStoreSerializer, - eateries, - folder_path, - SnapshotFileName.EATERY_STORE, - ) - - alerts = models.AlertStore.objects.filter( - end_timestamp__gte=datetime.now().timestamp() - ) - self.write_to_file( - serializers.AlertStoreSerializer, - alerts, - folder_path, - SnapshotFileName.ALERT_STORE, - ) - - menus = models.MenuStore.objects.all() - self.write_to_file( - serializers.MenuStoreSerializer, - menus, - folder_path, - SnapshotFileName.MENU_STORE, - ) - - categories = models.CategoryStore.objects.all() - self.write_to_file( - serializers.CategoryStoreSerializer, - categories, - folder_path, - SnapshotFileName.CATEGORY_STORE, - ) - - items = models.ItemStore.objects.all() - self.write_to_file( - serializers.ItemStoreSerializer, - items, - folder_path, - SnapshotFileName.ITEM_STORE, - ) - - subitems = models.SubItemStore.objects.all() - self.write_to_file( - serializers.SubItemStoreSerializer, - subitems, - folder_path, - SnapshotFileName.SUBITEM_STORE, - ) - - category_item_associations = models.CategoryItemAssociation.objects.all() - self.write_to_file( - serializers.CategoryItemAssociationSerializer, - category_item_associations, - folder_path, - SnapshotFileName.CATEGORY_ITEM_ASSOCIATION, - ) - - schedule_exceptions = models.ScheduleException.objects.all() - self.write_to_file( - serializers.ScheduleExceptionSerializer, - schedule_exceptions, - folder_path, - SnapshotFileName.SCHEDULE_EXCEPTION, - ) - - day_of_week_event_schedules = models.RepeatingEventSchedule.objects.all() - self.write_to_file( - serializers.RepeatingEventScheduleSerializer, - day_of_week_event_schedules, - folder_path, - SnapshotFileName.DAY_OF_WEEK_EVENT_SCHEDULE, - ) - - # # TODO: Need to filter here for only the valid schedules - # event_schedules = models.EventSchedule.objects.all() - # self.write_to_file(event_schedules, f"{folder_path}/{SnapshotFileName.EVENT_SCHEDULE}") diff --git a/src/alert/controllers/api/management/commands/ingest_db_snapshot.py b/src/alert/controllers/api/management/commands/ingest_db_snapshot.py deleted file mode 100644 index e978dc0..0000000 --- a/src/alert/controllers/api/management/commands/ingest_db_snapshot.py +++ /dev/null @@ -1,63 +0,0 @@ -import json - -import api.serializers as serializers -import eatery.serializers as eatery_serializers -from api.util.constants import SnapshotFileName -from django.core.management.base import BaseCommand - - -class Command(BaseCommand): - help = ( - "Overrides current state of the db with a db snapshot. Takes --input argument" - ) - - def add_arguments(self, parser): - parser.add_argument("--input", type=str) - - # Only writes data if the table has been flushed - def ingest_data(self, serializer, folder_path: str, file_name: SnapshotFileName): - with open(f"{folder_path}/{file_name.value}", "r") as file: - json_objs = [] - for line in file: - if len(line) > 2: - json_objs.append(json.loads(line)) - serialized_objs = serializer(data=json_objs, many=True) - serialized_objs.is_valid() - serialized_objs.save() - - def handle(self, *args, **options): - folder_path = options["input"] - self.ingest_data( - eatery_serializers.EateryStoreSerializer, - folder_path, - SnapshotFileName.EATERY_STORE, - ) - self.ingest_data( - serializers.AlertStoreSerializer, folder_path, SnapshotFileName.ALERT_STORE - ) - self.ingest_data( - serializers.MenuStoreSerializer, folder_path, SnapshotFileName.MENU_STORE - ) - self.ingest_data( - serializers.CategoryStoreSerializer, - folder_path, - SnapshotFileName.CATEGORY_STORE, - ) - self.ingest_data( - serializers.ItemStoreSerializer, folder_path, SnapshotFileName.ITEM_STORE - ) - self.ingest_data( - serializers.SubItemStoreSerializer, - folder_path, - SnapshotFileName.SUBITEM_STORE, - ) - self.ingest_data( - serializers.CategoryItemAssociationSerializer, - folder_path, - SnapshotFileName.CATEGORY_ITEM_ASSOCIATION, - ) - self.ingest_data( - serializers.RepeatingEventScheduleSerializer, - folder_path, - SnapshotFileName.DAY_OF_WEEK_EVENT_SCHEDULE, - ) diff --git a/src/alert/controllers/api/management/commands/ingest_log_transactions.py b/src/alert/controllers/api/management/commands/ingest_log_transactions.py deleted file mode 100644 index c0e14b3..0000000 --- a/src/alert/controllers/api/management/commands/ingest_log_transactions.py +++ /dev/null @@ -1,34 +0,0 @@ -from datetime import datetime -from django.core.management.base import BaseCommand -import json - -from api.controllers.create_transaction import CreateTransactionController -from api.controllers.delete_all_transactions import DeleteAllTransactionsController - -class Command(BaseCommand): - help = 'Transfers log data from the old storage format (log.txt file) into the TransactionHistoryStore table' - - def add_arguments(self, parser): - parser.add_argument('--input', type=str) - - def handle(self, *args, **options): - num_deleted = DeleteAllTransactionsController().process() - counter = 0 - num_inserted = 0 - file_path = options["input"] - # Transaction Histories used to be stored in a giant log file. Ingest that log file into the db - with open(file_path, "r") as log: - for line in log: - try: - data = json.loads(line) - timestamp = datetime.strptime(data['TIMESTAMP'], '%Y-%m-%d %I:%M:%S %p') - if counter % 100 == 1: - print(timestamp) - if timestamp.year == 2021 and timestamp.month > 7: - counter += 1 - inserted = CreateTransactionController(data).process() - num_inserted += inserted - except Exception as e: - pass - print("{} Entries Deleted".format(num_deleted)) - print("{} Entries Inserted".format(num_inserted)) \ No newline at end of file diff --git a/src/alert/controllers/api/management/commands/ingest_recent_transactions.py b/src/alert/controllers/api/management/commands/ingest_recent_transactions.py deleted file mode 100644 index ea55659..0000000 --- a/src/alert/controllers/api/management/commands/ingest_recent_transactions.py +++ /dev/null @@ -1,26 +0,0 @@ -# Transaction Histories used to be stored in a giant log file. Ingest that log file into the db - -import requests -import os -from requests.structures import CaseInsensitiveDict -from django.core.management.base import BaseCommand -from api.controllers.create_transaction import CreateTransactionController - -class Command(BaseCommand): - help = 'Fetches transaction data from a vendor API and adds it to our transaction history database' - - def handle(self, *args, **options): - endpoint = "https://vendor-api-extra.scl.cornell.edu/api/external/location-count" - headers = CaseInsensitiveDict() - token = os.environ.get("CORNELL_VENDOR_TOKEN") - api_key = os.environ.get("CORNELL_VENDOR_API_KEY") - headers["Accept"] = "application/json" - headers["Authorization"] = "Bearer {}".format(token) - headers["X-Api-Key"] = api_key - resp = requests.get(endpoint, headers=headers) - num_inserted = 0 - if resp.status_code == 200: - res = CreateTransactionController(resp.json()).process() - if res["success"]: - num_inserted = res["result"]["num_inserted"] - # print("{} Entries Inserted".format(num_inserted)) \ No newline at end of file diff --git a/src/alert/controllers/api/migrations/0001_initial.py b/src/alert/controllers/api/migrations/0001_initial.py deleted file mode 100644 index 2984ce0..0000000 --- a/src/alert/controllers/api/migrations/0001_initial.py +++ /dev/null @@ -1,166 +0,0 @@ -# Generated by Django 4.0 on 2022-01-13 17:27 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='EateryStore', - fields=[ - ('id', models.IntegerField(primary_key=True, serialize=False)), - ('name', models.CharField(blank=True, max_length=40)), - ('menu_summary', models.CharField(blank=True, max_length=60)), - ('image_url', models.URLField(blank=True)), - ('location', models.CharField(blank=True, max_length=30)), - ('campus_area', models.CharField(blank=True, choices=[('West', 'West'), ('North', 'North'), ('Central', 'Central'), ('Collegetown', 'Collegetown'), ('', 'None')], default='', max_length=15)), - ('online_order_url', models.URLField(blank=True)), - ('latitude', models.FloatField(blank=True, null=True)), - ('longitude', models.FloatField(blank=True, null=True)), - ('payment_accepts_meal_swipes', models.BooleanField(blank=True, null=True)), - ('payment_accepts_brbs', models.BooleanField(blank=True, null=True)), - ('payment_accepts_cash', models.BooleanField(blank=True, null=True)), - ], - ), - migrations.CreateModel( - name='ItemStore', - fields=[ - ('id', models.IntegerField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=40)), - ('description', models.CharField(blank=True, max_length=200)), - ('base_price', models.FloatField(blank=True, null=True)), - ('eatery', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.eaterystore')), - ], - ), - migrations.CreateModel( - name='TransactionHistoryStore', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('canonical_date', models.DateField()), - ('block_end_time', models.TimeField()), - ('transaction_count', models.IntegerField()), - ('eatery', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.eaterystore')), - ], - ), - migrations.CreateModel( - name='SubItemStore', - fields=[ - ('id', models.IntegerField(primary_key=True, serialize=False)), - ('additional_price', models.FloatField(blank=True, null=True)), - ('total_price', models.FloatField(blank=True, null=True)), - ('name', models.CharField(max_length=40)), - ('item_subsection', models.CharField(max_length=40)), - ('item', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.itemstore')), - ], - ), - migrations.CreateModel( - name='ReportStore', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('type', models.CharField(max_length=200)), - ('content', models.TextField()), - ('created_timestamp', models.IntegerField()), - ('eatery', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.eaterystore')), - ], - ), - migrations.CreateModel( - name='MenuStore', - fields=[ - ('id', models.IntegerField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=40)), - ('eatery', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.eaterystore')), - ], - ), - migrations.CreateModel( - name='DayOfWeekEventSchedule', - fields=[ - ('id', models.IntegerField(primary_key=True, serialize=False)), - ('event_description', models.CharField(choices=[('Breakfast', 'Breakfast'), ('Brunch', 'Brunch'), ('Lunch', 'Lunch'), ('Dinner', 'Dinner'), ('General', 'General')], max_length=10)), - ('day_of_week', models.CharField(choices=[('Monday', 'Monday'), ('Tuesday', 'Tuesday'), ('Wednesday', 'Wednesday'), ('Thursday', 'Thursday'), ('Friday', 'Friday'), ('Saturday', 'Saturday'), ('Sunday', 'Sunday')], max_length=10)), - ('start', models.TimeField()), - ('end', models.TimeField()), - ('eatery', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.eaterystore')), - ('menu', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.menustore')), - ], - ), - migrations.CreateModel( - name='DateEventSchedule', - fields=[ - ('id', models.IntegerField(primary_key=True, serialize=False)), - ('event_description', models.CharField(choices=[('Breakfast', 'Breakfast'), ('Brunch', 'Brunch'), ('Lunch', 'Lunch'), ('Dinner', 'Dinner'), ('General', 'General')], max_length=10)), - ('canonical_date', models.DateField()), - ('start_timestamp', models.IntegerField()), - ('end_timestamp', models.IntegerField()), - ('eatery', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.eaterystore')), - ('menu', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.menustore')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='ClosedEventSchedule', - fields=[ - ('id', models.IntegerField(primary_key=True, serialize=False)), - ('event_description', models.CharField(choices=[('Breakfast', 'Breakfast'), ('Brunch', 'Brunch'), ('Lunch', 'Lunch'), ('Dinner', 'Dinner'), ('General', 'General')], max_length=10)), - ('canonical_date', models.DateField()), - ('eatery', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.eaterystore')), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='CategoryStore', - fields=[ - ('id', models.IntegerField(primary_key=True, serialize=False)), - ('category', models.CharField(max_length=40)), - ('menu', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.menustore')), - ], - ), - migrations.CreateModel( - name='CategoryItemAssociation', - fields=[ - ('id', models.IntegerField(primary_key=True, serialize=False)), - ('category', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.categorystore')), - ('item', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.itemstore')), - ], - ), - migrations.CreateModel( - name='AlertStore', - fields=[ - ('id', models.IntegerField(primary_key=True, serialize=False)), - ('description', models.CharField(max_length=250)), - ('start_timestamp', models.IntegerField()), - ('end_timestamp', models.IntegerField()), - ('eatery', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.eaterystore')), - ], - ), - migrations.AddIndex( - model_name='transactionhistorystore', - index=models.Index(fields=['canonical_date'], name='api_transac_canonic_7e6d4f_idx'), - ), - migrations.AlterUniqueTogether( - name='transactionhistorystore', - unique_together={('eatery_id', 'block_end_time', 'canonical_date')}, - ), - migrations.AlterUniqueTogether( - name='menustore', - unique_together={('eatery', 'name')}, - ), - migrations.AlterUniqueTogether( - name='dayofweekeventschedule', - unique_together={('eatery', 'day_of_week', 'event_description')}, - ), - migrations.AlterUniqueTogether( - name='categorystore', - unique_together={('menu', 'category')}, - ), - ] diff --git a/src/alert/controllers/api/migrations/0002_repeatingeventschedule_scheduleexception_and_more.py b/src/alert/controllers/api/migrations/0002_repeatingeventschedule_scheduleexception_and_more.py deleted file mode 100644 index 08a4d33..0000000 --- a/src/alert/controllers/api/migrations/0002_repeatingeventschedule_scheduleexception_and_more.py +++ /dev/null @@ -1,111 +0,0 @@ -# Generated by Django 4.0 on 2022-09-14 15:53 - -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion -import re - - -class Migration(migrations.Migration): - - dependencies = [ - ('eatery', '0001_initial'), - ('api', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='RepeatingEventSchedule', - fields=[ - ('id', models.IntegerField(primary_key=True, serialize=False)), - ('event_description', models.CharField(choices=[('Breakfast', 'Breakfast'), ('Brunch', 'Brunch'), ('Lunch', 'Lunch'), ('Dinner', 'Dinner'), ('General', 'General')], max_length=10)), - ('start_date', models.DateField()), - ('start_time', models.TimeField()), - ('end_time', models.TimeField()), - ('repeat_interval', models.IntegerField()), - ('offset_lst', models.CharField(max_length=100, validators=[django.core.validators.RegexValidator(re.compile('^\\d+(?:,\\d+)*\\Z'), code='invalid', message='Enter only digits separated by commas.')])), - ('eatery', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='eatery.eaterystore')), - ], - ), - migrations.CreateModel( - name='ScheduleException', - fields=[ - ('id', models.IntegerField(primary_key=True, serialize=False)), - ('date', models.DateField()), - ('exception_type', models.CharField(choices=[('closed', 'Closed'), ('modified', 'Modified')], max_length=10)), - ('start_time', models.TimeField(blank=True, null=True)), - ('end_time', models.TimeField(blank=True, null=True)), - ('eatery', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='eatery.eaterystore')), - ('parent', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.repeatingeventschedule')), - ], - options={ - 'abstract': False, - }, - ), - migrations.RemoveField( - model_name='dateeventschedule', - name='eatery', - ), - migrations.RemoveField( - model_name='dateeventschedule', - name='menu', - ), - migrations.AlterUniqueTogether( - name='dayofweekeventschedule', - unique_together=None, - ), - migrations.RemoveField( - model_name='dayofweekeventschedule', - name='eatery', - ), - migrations.RemoveField( - model_name='dayofweekeventschedule', - name='menu', - ), - migrations.AlterField( - model_name='alertstore', - name='eatery', - field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='eatery.eaterystore'), - ), - migrations.AlterField( - model_name='itemstore', - name='eatery', - field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='eatery.eaterystore'), - ), - migrations.AlterField( - model_name='menustore', - name='eatery', - field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='eatery.eaterystore'), - ), - migrations.AlterField( - model_name='reportstore', - name='eatery', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='eatery.eaterystore'), - ), - migrations.AlterField( - model_name='transactionhistorystore', - name='eatery', - field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='eatery.eaterystore'), - ), - migrations.DeleteModel( - name='ClosedEventSchedule', - ), - migrations.DeleteModel( - name='DateEventSchedule', - ), - migrations.DeleteModel( - name='DayOfWeekEventSchedule', - ), - migrations.DeleteModel( - name='EateryStore', - ), - migrations.AddField( - model_name='repeatingeventschedule', - name='menu', - field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='api.menustore'), - ), - migrations.AlterUniqueTogether( - name='repeatingeventschedule', - unique_together={('eatery', 'event_description')}, - ), - ] diff --git a/src/alert/controllers/api/migrations/__init__.py b/src/alert/controllers/api/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/alert/controllers/api/models/TransactionModel.py b/src/alert/controllers/api/models/TransactionModel.py deleted file mode 100644 index 4ce0976..0000000 --- a/src/alert/controllers/api/models/TransactionModel.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.db import models -from eatery.models import EateryStore - -# [transaction_count] transactions at [name] in time range [block_end_time - 5 minutes, block_end_time] on [canonical_date] - - -class TransactionHistoryStore(models.Model): - class Meta: - unique_together = ("eatery_id", "block_end_time", "canonical_date") - indexes = [models.Index(fields=["canonical_date"])] - - eatery = models.ForeignKey(EateryStore, on_delete=models.DO_NOTHING) - canonical_date = models.DateField() - block_end_time = models.TimeField() - transaction_count = models.IntegerField() diff --git a/src/alert/controllers/api/models/__init__.py b/src/alert/controllers/api/models/__init__.py deleted file mode 100644 index 3c045c1..0000000 --- a/src/alert/controllers/api/models/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# Need to expose models to django. -# In this app, models should be imported directly from api.models, not from api.models.package - -from eatery.models import EateryStore - -#from .alert.models.AlertModel import AlertStore -#from .EventScheduleModel import EventSchedule, RepeatingEventSchedule, ScheduleException -#from ...reports.ReportModel import ReportStore -from .TransactionModel import TransactionHistoryStore diff --git a/src/alert/controllers/api/serializers.py b/src/alert/controllers/api/serializers.py deleted file mode 100644 index a7e9c09..0000000 --- a/src/alert/controllers/api/serializers.py +++ /dev/null @@ -1,45 +0,0 @@ -from rest_framework import serializers - -import api.models as models - -class MenuStoreSerializer(serializers.ModelSerializer): - class Meta: - model = models.MenuStore - fields = "__all__" - - -class ItemStoreSerializer(serializers.ModelSerializer): - class Meta: - model = models.ItemStore - fields = "__all__" - - -class SubItemStoreSerializer(serializers.ModelSerializer): - class Meta: - model = models.SubItemStore - fields = "__all__" - - -class CategoryStoreSerializer(serializers.ModelSerializer): - class Meta: - model = models.CategoryStore - fields = "__all__" - - -class CategoryItemAssociationSerializer(serializers.ModelSerializer): - class Meta: - model = models.CategoryItemAssociation - fields = "__all__" - -class RepeatingEventScheduleSerializer(serializers.ModelSerializer): - class Meta: - model = models.RepeatingEventSchedule - fields = "__all__" - - -class ScheduleExceptionSerializer(serializers.ModelSerializer): - class Meta: - model = models.ScheduleException - fields = "__all__" - - diff --git a/src/alert/controllers/misc_code.py b/src/alert/controllers/misc_code.py deleted file mode 100644 index ee54407..0000000 --- a/src/alert/controllers/misc_code.py +++ /dev/null @@ -1,27 +0,0 @@ -# EateriesFromDB -"""alerts=EateriesFromDB.alerts(serialized_eatery["id"], serialized_alerts), - -@staticmethod - def alerts(eatery_id: int, serialized_alerts: list[dict]): - return [ - EateriesFromDB.alert_from_serialized(alert) - for alert in serialized_alerts - if alert["eatery"] == eatery_id - ] - - @staticmethod - def alert_from_serialized(serialized_alert: dict): - return EateryAlert( - id=serialized_alert["id"], - description=serialized_alert["description"], - start_timestamp=serialized_alert["start_timestamp"], - end_timestamp=serialized_alert["end_timestamp"], - - - alerts = AlertStore.objects.filter( - end_timestamp__gte=datetime.now().timestamp(), - start_timestamp__lte=datetime.now().timestamp(), - ) - serialized_alerts = AlertStoreSerializer(data=alerts, many=True) - serialized_alerts.is_valid() - )"""