-
Notifications
You must be signed in to change notification settings - Fork 2
/
helpers.py
102 lines (70 loc) · 2.41 KB
/
helpers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import re
from datetime import datetime, timedelta
from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404
from depot.models import Depot
def get_depot_if_allowed(depot_id, user):
"""
Return the depot for the given if the user is allowed to access it
Otherwise throws a PermissionDenied exception.
:author: Benedikt Seidl
"""
depot = get_object_or_404(Depot, pk=depot_id)
if not depot.organization.managed_by(user) and not depot.active:
raise PermissionDenied('Depot is not active')
return depot
def show_private_items(depot, user):
return user.is_superuser or depot.organization.is_member(user)
def get_item_list(depot, user):
"""
Return the list of items the user is allowed to see in this depot
:author: Benedikt Seidl
"""
if show_private_items(depot, user):
return depot.active_items.all()
else:
return depot.public_items.all()
def get_start_return_date(data):
"""
Return the start and return dates from the request
If required data is missing or invalid, default values are returned.
:author: Benedikt Seidl
"""
try:
start_date = datetime.strptime(data.get('start_date'), '%Y-%m-%d %H:%M')
except:
start_date = datetime.now() + timedelta(days=1)
try:
return_date = datetime.strptime(data.get('return_date'), '%Y-%m-%d %H:%M')
except:
return_date = start_date + timedelta(days=3)
return (start_date, max(start_date, return_date))
def extract_item_quantities(data):
"""
Extract the item quantities from the provided dictionary
The format matches the input names of the rental creation form.
Only positive quantities are considered.
:author: Benedikt Seidl
"""
item_quantities = {}
for key, quantity in data.items():
m = re.match(r'^item-([0-9]+)-quantity$', key)
if m is not None and int(quantity) > 0:
item_quantities[int(m.group(1))] = int(quantity)
return item_quantities
def get_chart_data(intervals):
"""
Generate the data the JavaScript can render
:author: Benedikt Seidl
"""
data = []
for begin, end, availability in intervals:
data.append({
"x": begin.isoformat(),
"y": availability
})
data.append({
"x": end.isoformat(),
"y": availability
})
return data