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 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',
|
||||||
|
|||||||
@@ -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">
|
<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>
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user