-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathviews.py
242 lines (183 loc) · 8.91 KB
/
views.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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
import os, logging, urllib
from xml.dom import minidom
from random import choice, shuffle
from google.appengine.api import memcache
from google.appengine.api import urlfetch
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from models import UserPrefs
import settings
class BasePage(webapp.RequestHandler):
"""Base class to handle requests."""
gphoto_namespace = 'http://schemas.google.com/photos/2007'
media_namespace = 'http://search.yahoo.com/mrss/'
template_values = {}
userprefs = None
class AdminPage(BasePage):
"""Class to handle requests to the admin directory."""
def RenderAdminPage(self):
"""Renders the admin page"""
logging.info('RenderAdminPage called')
self.template_values['title'] = self.userprefs.site_title+" gallery admin"
self.template_values['album_name'] = "admin"
self.template_values['logout_url'] = users.create_logout_url('/')
if users.get_current_user() != self.userprefs.user:
self.template_values['current_user'] = users.get_current_user()
self.template_values['user'] = self.userprefs
self.template_values['settings'] = settings
self.template_values['debug'] = settings.DEBUG
backend = self.userprefs.GetPhotoBackend()
try:
albums = backend.GetAllAlbums()
except:
albums = []
album_list = []
featured_albums = self.userprefs.featured_albums
for a in albums:
if a['title'] in featured_albums:
a['featured'] = True
else:
a['featured'] = False
album_list.append(a)
album_list.append({'id': 'all', 'title': 'all', 'featured': ('all' in featured_albums)})
self.template_values['all_albums'] = album_list
path = os.path.join(os.path.dirname(__file__), 'admin.html')
self.response.out.write(template.render(path, self.template_values))
def InitializeUser(self):
# Get the owner of the app
self.userprefs = UserPrefs.all().get()
if not self.userprefs:
# Create the owner of the app
self.userprefs = UserPrefs(user=users.get_current_user())
self.userprefs.put()
def get(self):
"""Default method called upon entry to the app."""
self.InitializeUser()
# Reset template values with every new request.
self.template_values = {
}
self.RenderAdminPage()
def post(self):
"""Save the admin settings."""
self.InitializeUser()
self.template_values = {
}
# Get the admin settings and save them
try:
if self.request.get('clear-cache'):
backend = self.userprefs.GetPhotoBackend()
backend.ClearCache()
self.template_values['cache_cleared'] = True
else:
self.userprefs.photo_backend = int(self.request.get('backend'))
self.userprefs.SetUsername(self.request.get('backend-id'))
self.userprefs.site_title = self.request.get('site-title').strip()
self.userprefs.site_header = self.request.get('site-header').strip()
self.userprefs.thumb_size = int(self.request.get('thumb-size'))
if self.userprefs.photo_backend == settings.PHOTO_BACKEND_FLICKR:
self.userprefs.thumb_size = 75
elif self.userprefs.photo_backend == settings.PHOTO_BACKEND_PICASA and self.userprefs.thumb_size == 75:
self.userprefs.thumb_size = 72
self.userprefs.thumb_cropped = bool(self.request.get('thumb-cropped'))
self.userprefs.full_size = int(self.request.get('full-size'))
self.userprefs.homepage_size = int(self.request.get('homepage-size'))
backend = self.userprefs.GetPhotoBackend()
homepage_album = self.request.get('homepage-album').strip()
for album in backend.GetAllAlbums():
if album['title'] == homepage_album:
self.userprefs.homepage_album = homepage_album
featured_albums = self.request.get('featured-album', allow_multiple=True)
self.userprefs.featured_albums = featured_albums
self.userprefs.merchant_id = self.request.get('merchant-id')
self.userprefs.analytics_id = self.request.get('analytics-id')
self.userprefs.put()
self.template_values['saved'] = True
except (TypeError, ValueError), e:
self.template_values['error'] = True
self.template_values['error_message'] = str(e)
self.RenderAdminPage()
class MainPage(BasePage):
"""Class to handle requests to the root directory."""
def GetSinglePhoto(self, album_name, photo_id):
"""Retrieves URL for a specific photo.
Args:
album_name: string name of Picasa web album.
photo_id: integer photo ID.
Returns:
String URL pointing to the large photo.
"""
logging.info('GetSinglePhoto with '+album_name+' and '+photo_id)
# Attempt to retrieve url from memcache, keyed on album_name + photo_id.
photo_url = memcache.get(album_name + '_' + photo_id)
if settings.MEMCACHE_ENABLED and photo_url is not None:
logging.info('GetSinglePhoto memcache hit')
return photo_url
url = '%s/album/%s/photoid/%s?imgmax=800' % (self.GetApiUrl(), album_name, photo_id)
logging.info('GetSinglePhoto url '+url)
result = urlfetch.fetch(url)
try:
dom = minidom.parseString(result.content)
for node in dom.getElementsByTagNameNS(self.media_namespace, 'content'):
memcache.add(album_name + '_' + photo_id, node.getAttribute('url'),
settings.MEMCACHE_PHOTO_EXPIRATION)
logging.info('GetSinglePhoto photo url '+node.getAttribute('url'))
return node.getAttribute('url')
except:
logging.info('GetSinglePhoto exception')
return None
def RenderAlbum(self, album_name):
"""Renders an HTML page for a specific album.
Args:
album_name: string name of Picasa album.
"""
backend = self.userprefs.GetPhotoBackend()
logging.info('RenderAlbum called')
self.template_values['album_name'] = album_name
self.template_values['photos'] = backend.GetPhotosInAlbum(album_name, featured=self.userprefs.featured_albums)
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, self.template_values))
def RenderHomepage(self):
"""Renders homepage with a single big photo"""
logging.info('RenderHomepage called')
try:
backend = self.userprefs.GetPhotoBackend()
backend.imgmax = self.userprefs.homepage_size
photos = backend.GetPhotosInAlbum(self.userprefs.homepage_album)
shuffle(photos)
for photo in photos:
if photo['width'] > photo['height']:
break
self.template_values['homepage_photo'] = {
'id': photo['id'],
'album': self.userprefs.homepage_album,
'src': photo['url'],
}
except Exception, e:
logging.info("Got an error: %s" % str(e))
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, self.template_values))
def get(self, album_name=None):
"""Default method called upon entry to the app."""
# Get the owner of the app
if not self.userprefs:
self.userprefs = UserPrefs.all().get()
if not self.userprefs:
# Redirect to the admin page
self.redirect('/admin/')
return
backend = self.userprefs.GetPhotoBackend()
# Reset template values with every new request.
self.template_values = {
'user': self.userprefs,
'title': self.userprefs.site_title+" gallery",
'albums': backend.GetFeaturedAlbums(self.userprefs.featured_albums),
'debug': settings.DEBUG,
}
if users.is_current_user_admin():
self.template_values['logout_url'] = users.create_logout_url('/')
#album_name = self.request.get('album_name')
if album_name:
self.RenderAlbum(album_name)
else:
self.RenderHomepage()