From 95e744de30507537c67de008d725b056fe1383a9 Mon Sep 17 00:00:00 2001 From: Ivo Spijkerman Date: Wed, 22 Sep 2021 15:34:07 +0200 Subject: [PATCH] NOJIRA refactored repo into orderrepo --- src/main.py | 47 ++++++++++------------------------ src/models/order_total.py | 29 --------------------- src/order_repository.py | 48 +++++++++++++++++++++++++++++++++++ src/repository.py | 27 -------------------- src/templates/frietlijst.html | 8 +++--- test/test_anonymize_name.py | 2 +- 6 files changed, 67 insertions(+), 94 deletions(-) delete mode 100644 src/models/order_total.py create mode 100644 src/order_repository.py delete mode 100644 src/repository.py diff --git a/src/main.py b/src/main.py index e5e3174..474d28d 100644 --- a/src/main.py +++ b/src/main.py @@ -1,47 +1,28 @@ -import datetime +from datetime import datetime, timedelta -from cachetools import cached, TTLCache from flask import render_template -from models.order import Order -from models.order_total import OrderTotal -from repository import Repository +from item_builder import ItemBuilder +from order_repository import OrderRepository def process(_) -> str: - data = _get_data() - return render_template('frietlijst.html', data=data) + min_datetime = datetime.now() - timedelta(days=2) + orders = _repository.find_by_datetime_placed_greater_than(min_datetime) + items = ItemBuilder(orders).build() + item_count = sum([len(o.items) for o in orders]) + applicants = sorted([o.name for o in orders]) -def anonymize_name(name: str) -> str: - parts = name.split(" ") - result = parts[0] - for part in parts[1:]: - if part: - result += " " + part[0] - return result - - -@cached(cache=TTLCache(maxsize=1, ttl=10)) -def _get_data() -> OrderTotal: - cutoff = datetime.datetime.now() - datetime.timedelta(days=2) - - rows_to_process = [row for row in _repository.load_rows() - if row and datetime.datetime.strptime(row[0], '%d-%m-%Y %H:%M:%S') > cutoff] - - result = OrderTotal() - - for row in rows_to_process: - result.add(Order( - applicant_name=anonymize_name(row[1]), - item_names=[item_name.lower().strip() for item_name in row[2:]], - )) - - return result + return render_template('frietlijst.html', + items=items, + item_count=item_count, + applicants=applicants, + ) if __name__ == 'main': - _repository = Repository( + _repository = OrderRepository( sa_file_name='token.json', spreadsheet_id='18vCgc5DGUiFZN1NX_GBmxSBCb47KdsBkV6Glf9Sx-wE', spreadsheet_range='Friet bestelling!A2:F', diff --git a/src/models/order_total.py b/src/models/order_total.py deleted file mode 100644 index 1dc7c3e..0000000 --- a/src/models/order_total.py +++ /dev/null @@ -1,29 +0,0 @@ -from typing import List, Dict - -from item_builder import ItemBuilder -from models.item import Item -from models.order import Order - - -class OrderTotal: - def __init__(self): - self.__orders: List[Order] = [] - - def add(self, order: Order) -> None: - self.__orders.append(order) - - @property - def items(self) -> List[Item]: - return ItemBuilder(self.__orders).build() - - @property - def item_count(self) -> int: - return sum([len(o.items) for o in self.__orders]) - - @property - def applicants(self) -> List[str]: - return sorted([o.name for o in self.__orders]) - - @property - def orders(self) -> List[Order]: - return sorted(self.__orders) diff --git a/src/order_repository.py b/src/order_repository.py new file mode 100644 index 0000000..a2d9fab --- /dev/null +++ b/src/order_repository.py @@ -0,0 +1,48 @@ +from datetime import datetime +from typing import List + +from cachetools import cached, TTLCache +from google.oauth2.service_account import Credentials +from googleapiclient.discovery import build + +from models.order import Order + + +class OrderRepository: + def __init__(self, + sa_file_name: str, + spreadsheet_id: str, + spreadsheet_range: str, + ): + credentials = Credentials.from_service_account_file( + filename=sa_file_name, + scopes=['https://www.googleapis.com/auth/spreadsheets.readonly'], + ) + service = build('sheets', 'v4', credentials=credentials) + self.__sheets = service.spreadsheets() + self.__spreadsheet_id = spreadsheet_id + self.__spreadsheet_range = spreadsheet_range + + @cached(cache=TTLCache(maxsize=1, ttl=10)) + def find_by_datetime_placed_greater_than(self, min_datetime: datetime) -> List[Order]: + result: List[List[str]] = self.__sheets.values().get( + spreadsheetId=self.__spreadsheet_id, + range=self.__spreadsheet_range, + ).execute().get('values', []) + + return sorted([ + Order( + applicant_name=anonymize_name(row[1]), + item_names=[item_name.strip().lower() for item_name in row[2:]] + ) for row in result + if row and datetime.strptime(row[0], '%d-%m-%Y %H:%M:%S') > min_datetime + ]) + + +def anonymize_name(name: str) -> str: + parts = name.split(" ") + result = parts[0] + for part in parts[1:]: + if part: + result += " " + part[0] + return result diff --git a/src/repository.py b/src/repository.py deleted file mode 100644 index d0bf0f5..0000000 --- a/src/repository.py +++ /dev/null @@ -1,27 +0,0 @@ -from typing import List - -from google.oauth2.service_account import Credentials -from googleapiclient.discovery import build - - -class Repository: - def __init__(self, - sa_file_name: str, - spreadsheet_id: str, - spreadsheet_range: str, - ): - credentials = Credentials.from_service_account_file( - filename=sa_file_name, - scopes=['https://www.googleapis.com/auth/spreadsheets.readonly'], - ) - service = build('sheets', 'v4', credentials=credentials) - self.__sheets = service.spreadsheets() - self.__spreadsheet_id = spreadsheet_id - self.__spreadsheet_range = spreadsheet_range - - def load_rows(self) -> List[List[str]]: - result = self.__sheets.values().get( - spreadsheetId=self.__spreadsheet_id, - range=self.__spreadsheet_range, - ).execute() - return result.get('values', []) diff --git a/src/templates/frietlijst.html b/src/templates/frietlijst.html index c9327f6..22baa83 100644 --- a/src/templates/frietlijst.html +++ b/src/templates/frietlijst.html @@ -8,20 +8,20 @@

Reeds besteld

    - {% for applicant in data.applicants %} + {% for applicant in applicants %}
  1. {{ applicant }}
  2. {% endfor %}
-

Streeplijst - {{ data.item_count }} stuks

+

Streeplijst - {{ item_count }} stuks

Totaaloverzicht