-
Notifications
You must be signed in to change notification settings - Fork 39
/
Copy pathmodels.py
135 lines (113 loc) · 4.48 KB
/
models.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
from google.appengine.ext import db
from google.appengine.api import urlfetch, memcache, users, mail
from datetime import datetime, timedelta, time, date
from icalendar import Calendar, Event as CalendarEvent
from pytz import timezone
import pytz
from utils import human_username
import logging
ROOM_OPTIONS = (
('Cave', 15),
('Deck', 30),
('Savanna', 120),
('140b', 129),
('Cubby 1', 2),
('Cubby 2', 2),
('Cubby 3', 2),
('Upstairs Office', 2),
('Front Area', 20))
GUESTS_PER_STAFF = 25
PENDING_LIFETIME = 30 # days
def to_sentence(aList):
sentence = ', '.join([e for e in aList if aList.index(e) != len(aList) -1])
if len(aList) > 1: sentence = '%s and %s' % (sentence, aList[-1])
return sentence
def to_name_list(aList):
sentence = ', '.join([human_username(e) for e in aList if aList.index(e) != len(aList) -1])
if len(aList) > 1: sentence = '%s and %s' % (sentence, human_username(aList[-1]))
return sentence
class Event(db.Model):
status = db.StringProperty(required=True, default='pending', choices=set(
['pending', 'understaffed', 'approved', 'canceled', 'onhold', 'expired']))
member = db.UserProperty(auto_current_user_add=True)
name = db.StringProperty(required=True)
start_time = db.DateTimeProperty(required=True)
end_time = db.DateTimeProperty()
staff = db.ListProperty(users.User)
rooms = db.StringListProperty() #choices=set(ROOM_OPTIONS)
details = db.StringProperty()
url = db.StringProperty()
fee = db.StringProperty()
notes = db.StringProperty()
type = db.StringProperty(required=True)
estimated_size = db.StringProperty(required=True)
contact_name = db.StringProperty(required=True)
contact_phone = db.StringProperty(required=True)
expired = db.DateTimeProperty()
created = db.DateTimeProperty(auto_now_add=True)
updated = db.DateTimeProperty(auto_now=True)
@classmethod
def get_approved_list(cls):
return cls.all() \
.filter('start_time >', datetime.today()) \
.filter('status IN', ['approved', 'canceled']) \
.order('start_time')
@classmethod
def get_pending_list(cls):
return cls.all() \
.filter('start_time >', datetime.today()) \
.filter('status IN', ['pending', 'understaffed', 'onhold', 'expired']) \
.order('start_time')
def stafflist(self):
return to_name_list(self.staff)
def roomlist(self):
return to_sentence(self.rooms)
def is_staffed(self):
return len(self.staff) >= self.staff_needed()
def staff_needed(self):
return int(self.estimated_size) / GUESTS_PER_STAFF
def is_canceled(self):
return self.status == 'canceled'
def is_past(self):
return self.end_time < datetime.today()
def start_date(self):
return self.start_time.date()
def approve(self):
user = users.get_current_user()
if self.is_staffed():
self.expired = None
self.status = 'approved'
logging.info('%s approved %s' % (user.nickname, self.name))
else:
self.status = 'understaffed'
logging.info('%s approved %s but it is still understaffed' % (user.nickname, self.name))
self.put()
def cancel(self):
user = users.get_current_user()
self.status = 'canceled'
self.put()
logging.info('%s cancelled %s' % (user.nickname, self.name))
def expire(self):
user = users.get_current_user()
self.expired = datetime.now()
self.status = 'expired'
self.put()
logging.info('%s expired %s' % (user.nickname, self.name))
def add_staff(self, user):
self.staff.append(user)
if self.is_staffed() and self.status == 'understaffed':
self.status = 'approved'
self.put()
logging.info('%s staffed %s' % (user.nickname, self.name))
def to_ical(self):
event = CalendarEvent()
event.add('summary', self.name if self.status == 'approved' else self.name + ' (%s)' % self.status.upper())
event.add('dtstart', self.start_time.replace(tzinfo=timezone('US/Pacific')))
event.add('dtend', self.end_time.replace(tzinfo=timezone('US/Pacific')))
return event
class Feedback(db.Model):
user = db.UserProperty(auto_current_user_add=True)
event = db.ReferenceProperty(Event)
rating = db.IntegerProperty()
comment = db.StringProperty(multiline=True)
created = db.DateTimeProperty(auto_now_add=True)