1
1
import json
2
+ import time
2
3
3
4
from flask import abort , Blueprint , redirect , render_template , url_for , flash
4
5
from flask_login import current_user , login_required
5
6
7
+ import config
6
8
from forms import EventForm
7
9
from models import db , Event
8
10
from util import admin_required , isoformat
@@ -24,67 +26,137 @@ def events_create():
24
26
25
27
26
28
@blueprint .route ('/list/json' )
27
- def events_list_json ():
28
- events = Event .query .filter_by ().order_by (Event .start_time .desc ()).all ()
29
- event_list = []
30
- for event in events :
31
- start_time = event .start_time
32
- obj = {
33
- 'id' : event .id ,
34
- 'approved' : event .approved ,
35
- 'name' : event .title ,
36
- 'startTime' : start_time * 1000 ,
37
- 'startTimeFormat' : isoformat (start_time ),
38
- 'endTime' : (start_time + event .duration * 60 * 60 ) * 1000 ,
39
- 'duration' : event .duration
40
- }
41
- event_list .append (obj )
29
+ @blueprint .route ('/list/json/page/<int:page_number>' )
30
+ def events_list_json (page_number = 1 ):
31
+ if page_number <= 0 :
32
+ abort (404 )
33
+
34
+ page_size = config .EVENT_LIST_PAGE_SIZE
35
+ page_offset = (page_number - 1 ) * page_size
36
+ events = Event .query .order_by (Event .start_time .desc ()).offset (page_offset ).limit (page_size ).all ()
37
+ if page_number != 1 and not events :
38
+ abort (404 )
39
+
40
+ event_list = [{
41
+ 'id' : event .id ,
42
+ 'approved' : event .approved ,
43
+ 'name' : event .title ,
44
+ 'startTime' : event .start_time * 1000 ,
45
+ 'startTimeFormat' : isoformat (event .start_time ),
46
+ 'endTime' : (event .start_time + event .duration * 60 * 60 ) * 1000 ,
47
+ 'duration' : event .duration
48
+ } for event in events ]
42
49
return json .dumps (event_list )
43
50
44
51
45
52
@blueprint .route ('/' )
46
53
@blueprint .route ('/all' )
47
- def events_all ():
48
- events = Event .query .filter_by (approved = True , removed = False ).order_by (Event .start_time .desc ()).all ()
49
- for event in events :
50
- event .start_time_format = isoformat (event .start_time )
51
- return render_template ('events/list.html' , tab = 'all' , events = events )
54
+ @blueprint .route ('/all/page/<int:page_number>' )
55
+ def events_all (page_number = 1 ):
56
+ if page_number <= 0 :
57
+ abort (404 )
58
+
59
+ page_size = config .EVENT_LIST_PAGE_SIZE
60
+ page_offset = (page_number - 1 ) * page_size
61
+ # Offset + limit for pagination is inefficient; implement page_start based pages if perf issues.
62
+ events = Event .query .filter_by (approved = True , removed = False ).order_by (Event .start_time .desc ()) \
63
+ .offset (page_offset ).limit (page_size + 1 ).all ()
64
+ if page_number != 1 and not events :
65
+ abort (404 )
66
+
67
+ last_page = len (events ) <= page_size
68
+ if not last_page :
69
+ events .pop ()
70
+
71
+ return render_template ('events/list.html' , tab = 'all' , page_number = page_number , last_page = last_page , events = events )
52
72
53
73
54
74
# todo
55
75
@blueprint .route ('/upcoming' )
56
- def events_upcoming ():
57
- events = Event .query .filter_by (approved = True , removed = False ).order_by (Event .start_time .desc ()).all ()
58
- for event in events :
59
- event .start_time_format = isoformat (event .start_time )
60
- return render_template ('events/list.html' , tab = 'upcoming' , events = events )
76
+ @blueprint .route ('/upcoming/page/<int:page_number>' )
77
+ def events_upcoming (page_number = 1 ):
78
+ if page_number <= 0 :
79
+ abort (404 )
80
+
81
+ page_size = config .EVENT_LIST_PAGE_SIZE
82
+ page_offset = (page_number - 1 ) * page_size
83
+ upcoming_events = Event .query .filter_by (approved = True , removed = False ).filter (Event .start_time > time .time ()) \
84
+ .order_by (Event .start_time .desc ()).offset (page_offset ).limit (page_size + 1 ).all ()
85
+ if page_number != 1 and not upcoming_events :
86
+ abort (404 )
87
+
88
+ last_page = len (upcoming_events ) <= page_size
89
+ if not last_page :
90
+ upcoming_events .pop ()
91
+
92
+ return render_template ('events/list.html' , tab = 'upcoming' , page_number = page_number , last_page = last_page ,
93
+ events = upcoming_events )
61
94
62
95
63
96
# todo
64
97
@blueprint .route ('/past' )
65
- def events_past ():
66
- events = Event .query .filter_by (approved = True , removed = False ).order_by (Event .start_time .desc ()).all ()
67
- for event in events :
68
- event .start_time_format = isoformat (event .start_time )
69
- return render_template ('events/list.html' , tab = 'past' , events = events )
98
+ @blueprint .route ('/past/page/<int:page_number>' )
99
+ def events_past (page_number = 1 ):
100
+ if page_number <= 0 :
101
+ abort (404 )
102
+
103
+ page_size = config .EVENT_LIST_PAGE_SIZE
104
+ page_offset = (page_number - 1 ) * page_size
105
+ past_events = Event .query .filter_by (approved = True , removed = False ).filter (Event .end_time <= time .time ()) \
106
+ .order_by (Event .start_time .desc ()).offset (page_offset ).limit (page_size + 1 ).all ()
107
+ if page_number != 1 and not past_events :
108
+ abort (404 )
109
+
110
+ last_page = len (past_events ) <= page_size
111
+ if not last_page :
112
+ past_events .pop ()
113
+
114
+ return render_template ('events/list.html' , tab = 'past' , page_number = page_number , last_page = last_page ,
115
+ events = past_events )
70
116
71
117
72
118
@blueprint .route ('/unapproved' )
119
+ @blueprint .route ('/unapproved/page/<int:page_number>' )
73
120
@admin_required
74
- def events_unapproved ():
75
- unapproved_events = Event .query .filter_by (approved = False , removed = False ).order_by (Event .start_time .desc ()).all ()
76
- for event in unapproved_events :
77
- event .start_time_format = isoformat (event .start_time )
78
- return render_template ('events/list.html' , tab = 'unapproved' , events = unapproved_events , enabled_actions = ['approve' ])
121
+ def events_unapproved (page_number = 1 ):
122
+ if page_number <= 0 :
123
+ abort (404 )
124
+
125
+ page_size = config .EVENT_LIST_PAGE_SIZE
126
+ page_offset = (page_number - 1 ) * page_size
127
+ unapproved_events = Event .query .filter_by (approved = False , removed = False ).order_by (Event .start_time .desc ()) \
128
+ .offset (page_offset ).limit (page_size + 1 ).all ()
129
+ if page_number != 1 and not unapproved_events :
130
+ abort (404 )
131
+
132
+ last_page = len (unapproved_events ) <= page_size
133
+ if not last_page :
134
+ unapproved_events .pop ()
135
+
136
+ return render_template ('events/list.html' , tab = 'unapproved' , page_number = page_number , last_page = last_page ,
137
+ events = unapproved_events , enabled_actions = ['approve' ])
79
138
80
139
81
140
@blueprint .route ('/owned' )
141
+ @blueprint .route ('/owned/page/<int:page_number>' )
82
142
@login_required
83
- def events_owned ():
84
- owned_events = current_user .events .filter_by (removed = False )
85
- for event in owned_events :
86
- event .start_time_format = isoformat (event .start_time )
87
- return render_template ('events/list.html' , tab = 'owned' , events = owned_events , enabled_actions = ['manage' , 'remove' ])
143
+ def events_owned (page_number = 1 ):
144
+ if page_number <= 0 :
145
+ abort (404 )
146
+
147
+ page_size = config .EVENT_LIST_PAGE_SIZE
148
+ page_offset = (page_number - 1 ) * page_size
149
+ owned_events = current_user .events .filter_by (removed = False ).order_by (Event .start_time .desc ()) \
150
+ .offset (page_offset ).limit (page_size + 1 ).all ()
151
+ if page_number != 1 and not owned_events :
152
+ abort (404 )
153
+
154
+ last_page = len (owned_events ) <= page_size
155
+ if not last_page :
156
+ owned_events .pop ()
157
+
158
+ return render_template ('events/list.html' , tab = 'owned' , page_number = page_number , last_page = last_page ,
159
+ events = owned_events , enabled_actions = ['manage' , 'remove' ])
88
160
89
161
90
162
@blueprint .route ('/<int:event_id>' )
@@ -115,6 +187,7 @@ def events_manage(event_id):
115
187
event_form = EventForm (obj = event )
116
188
if event_form .validate_on_submit ():
117
189
event_form .populate_obj (event )
190
+ db .session .commit ()
118
191
return redirect (url_for ('.events_detail' , event_id = event_id ))
119
192
return render_template ('events/manage.html' , event = event , event_form = event_form )
120
193
0 commit comments