NOJIRA refactored repo into orderrepo
This commit is contained in:
47
src/main.py
47
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',
|
||||
|
||||
@@ -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)
|
||||
48
src/order_repository.py
Normal file
48
src/order_repository.py
Normal file
@@ -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
|
||||
@@ -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', [])
|
||||
@@ -8,20 +8,20 @@
|
||||
<div class="markdown-body">
|
||||
<h1>Reeds besteld</h1>
|
||||
<ol>
|
||||
{% for applicant in data.applicants %}
|
||||
{% for applicant in applicants %}
|
||||
<li>{{ applicant }}</li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
|
||||
<h1>Streeplijst - {{ data.item_count }} stuks</h1>
|
||||
<h1>Streeplijst - {{ item_count }} stuks</h1>
|
||||
<ul>
|
||||
{% for item in data.items %}
|
||||
{% for item in items %}
|
||||
<li>{{ item.name }}: {{ item.amount }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<h1>Totaaloverzicht</h1>
|
||||
<ul>
|
||||
{% for order in data.orders %}
|
||||
{% for order in orders %}
|
||||
<li>
|
||||
{{ order.name }}
|
||||
<ul>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import unittest
|
||||
|
||||
from main import anonymize_name
|
||||
from order_repository import anonymize_name
|
||||
|
||||
|
||||
class TestMain(unittest.TestCase):
|
||||
|
||||
Reference in New Issue
Block a user