NOJIRA refactored repo into orderrepo

This commit is contained in:
2021-09-22 15:34:07 +02:00
parent 1f0353c6f5
commit 95e744de30
6 changed files with 67 additions and 94 deletions

View File

@@ -1,47 +1,28 @@
import datetime from datetime import datetime, timedelta
from cachetools import cached, TTLCache
from flask import render_template from flask import render_template
from models.order import Order from item_builder import ItemBuilder
from models.order_total import OrderTotal from order_repository import OrderRepository
from repository import Repository
def process(_) -> str: def process(_) -> str:
data = _get_data() min_datetime = datetime.now() - timedelta(days=2)
return render_template('frietlijst.html', data=data) 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: return render_template('frietlijst.html',
parts = name.split(" ") items=items,
result = parts[0] item_count=item_count,
for part in parts[1:]: applicants=applicants,
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
if __name__ == 'main': if __name__ == 'main':
_repository = Repository( _repository = OrderRepository(
sa_file_name='token.json', sa_file_name='token.json',
spreadsheet_id='18vCgc5DGUiFZN1NX_GBmxSBCb47KdsBkV6Glf9Sx-wE', spreadsheet_id='18vCgc5DGUiFZN1NX_GBmxSBCb47KdsBkV6Glf9Sx-wE',
spreadsheet_range='Friet bestelling!A2:F', spreadsheet_range='Friet bestelling!A2:F',

View File

@@ -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
View 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

View File

@@ -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', [])

View File

@@ -8,20 +8,20 @@
<div class="markdown-body"> <div class="markdown-body">
<h1>Reeds besteld</h1> <h1>Reeds besteld</h1>
<ol> <ol>
{% for applicant in data.applicants %} {% for applicant in applicants %}
<li>{{ applicant }}</li> <li>{{ applicant }}</li>
{% endfor %} {% endfor %}
</ol> </ol>
<h1>Streeplijst - {{ data.item_count }} stuks</h1> <h1>Streeplijst - {{ item_count }} stuks</h1>
<ul> <ul>
{% for item in data.items %} {% for item in items %}
<li>{{ item.name }}: {{ item.amount }}</li> <li>{{ item.name }}: {{ item.amount }}</li>
{% endfor %} {% endfor %}
</ul> </ul>
<h1>Totaaloverzicht</h1> <h1>Totaaloverzicht</h1>
<ul> <ul>
{% for order in data.orders %} {% for order in orders %}
<li> <li>
{{ order.name }} {{ order.name }}
<ul> <ul>

View File

@@ -1,6 +1,6 @@
import unittest import unittest
from main import anonymize_name from order_repository import anonymize_name
class TestMain(unittest.TestCase): class TestMain(unittest.TestCase):