Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app.yaml47
-rw-r--r--controllers/default.py397
-rw-r--r--errors/127.0.0.1.2010-07-22.17-24-28.38ccea81-882e-4042-938b-efa671e3c7c817
-rw-r--r--errors/127.0.0.1.2010-07-22.17-39-28.15a9379c-ac34-44ab-bc1e-364cd903b02a17
-rw-r--r--errors/127.0.0.1.2010-07-22.17-39-33.02930942-2e25-4966-a9e0-c6435a26a7b217
-rw-r--r--errors/127.0.0.1.2010-07-22.17-39-34.a6cec48e-f59f-4387-bd36-6748e816b76917
-rw-r--r--errors/127.0.0.1.2010-07-22.17-39-51.fafceef8-b7b5-4510-ad5e-f08f67eca4ed17
-rw-r--r--errors/127.0.0.1.2010-07-26.20-48-09.a4d32305-5768-49d6-8707-d1030c2cbcfb17
-rw-r--r--models/db.py43
-rw-r--r--sessions/127-0-0-1-540fd07d-c80c-470e-908f-a8669bd5cee94
-rw-r--r--sessions/127-0-0-1-e7f60399-646e-42e9-a642-b5332e33f7e185
-rw-r--r--views/default/_base.html12
-rw-r--r--views/default/admin.html33
-rw-r--r--views/default/delete_image_confirmation.html5
-rw-r--r--views/default/friends.html27
-rw-r--r--views/default/image.html25
-rw-r--r--views/default/index.html24
-rw-r--r--views/default/profile.html42
-rw-r--r--views/default/requests.html13
19 files changed, 809 insertions, 50 deletions
diff --git a/app.yaml b/app.yaml
new file mode 100644
index 0000000..a4ce4ee
--- /dev/null
+++ b/app.yaml
@@ -0,0 +1,47 @@
+application: turtleartsite
+version: 1
+api_version: 1
+runtime: python
+
+handlers:
+
+#- url: /(?P<a>.+?)/static/(?P<b>.+)
+# static_files: applications/\1/static/\2
+# upload: applications/(.+?)/static/(.+)
+# secure: optional
+
+- url: /static/(?P<s>.+)
+ static_files: applications/turtlesite/static/\1
+ upload: applications/turtlesite/static/(.+)
+ secure: optional
+
+- url: /admin-gae/.*
+ script: $PYTHON_LIB/google/appengine/ext/admin
+ login: admin
+
+- url: /_ah/queue/default
+ script: gaehandler.py
+ login: admin
+
+- url: .*
+ script: gaehandler.py
+ secure: optional
+
+skip_files: |
+ ^(.*/)?(
+ (app\.yaml)|
+ (app\.yml)|
+ (index\.yaml)|
+ (index\.yml)|
+ (#.*#)|
+ (.*~)|
+ (.*\.py[co])|
+ (.*/RCS/.*)|
+ (\..*)|
+ ((admin|examples|welcome)\.tar)|
+ (applications/(admin|examples)/.*)|
+ (applications/.*?/databases/.*) |
+ (applications/.*?/errors/.*)|
+ (applications/.*?/cache/.*)|
+ (applications/.*?/sessions/.*)|
+ )$
diff --git a/controllers/default.py b/controllers/default.py
index d9f9a6d..21cf579 100644
--- a/controllers/default.py
+++ b/controllers/default.py
@@ -1,12 +1,69 @@
import os
+import pickle
+from gluon.tools import Service
+service=Service(globals())
-def sort_by_views(L):
- if len(L) <= 1: return L
- return sort_by_views( [ lt for lt in L[1:] if lt.views < L[0].views ] ) + [ L[0] ] + sort_by_views( [ ge for ge in L[1:] if ge.views >= L[0].views ] )
+def get_requests():
+ if auth.is_logged_in():
+ users = db().select(db.auth_user.ALL)
+ for user in users:
+ if auth.user.username == user.username:
+ return len(pickle.loads(user.requests))
+ else: return None
+
+@auth.requires_membership('admin')
+def admin():
+ if "page" in request.vars.keys(): page = int(request.vars["page"])-1
+ else: page = 0
+ users = db().select(db.auth_user.ALL)
+ users_list=[]
+ for user in users:
+ users_list.append(user)
+ users_list.sort(cmp=lambda x,y:cmp(x.username.lower(),y.username.lower()))
+ users_on_page = users_list[page*10:(page+1)*10]
+ pages = len(users_list) / 10
+ if len(users_list)%10 > 0: pages += 1
+ return dict(users = users_on_page, page=page+1,pages=pages, num_requests = get_requests())
+
+@auth.requires_membership('admin')
+def make_admin():
+ if "page" in request.vars.keys(): page = int(request.vars["page"])
+ else: page = 1
+ if "user" in request.vars.keys(): user = request.vars["user"]
+ else: redirect(URL(r=request, f="admin?page="+str(page)))
+ auth.add_membership('admin',user)
+ redirect(URL(r=request, f="admin?page="+str(page)))
+
+@auth.requires_membership('admin')
+def remove_admin():
+ if "page" in request.vars.keys(): page = int(request.vars["page"])
+ else: page = 1
+ if "user" in request.vars.keys(): user = request.vars["user"]
+ else: redirect(URL(r=request, f="admin?page="+str(page)))
+ auth.del_membership(auth.id_group('admin'),user)
+ redirect(URL(r=request, f="admin?page="+str(page)))
+
+@auth.requires_membership('admin')
+def delete_user():
+ if "page" in request.vars.keys(): page = int(request.vars["page"])
+ else: page = 1
+ if "user" in request.vars.keys(): user_to_delete = request.vars["user"]
+ else: redirect(URL(r=request, f="admin?page="+str(page)))
+ query=(db.auth_user.username==user_to_delete)
+ db(query).delete()
+ images = db().select(db.image.ALL)
+ for image in images:
+ if image.creator == user_to_delete:
+ query=(db.image.id==image.id)
+ db(query).delete()
+ comments = db().select(db.comment.ALL)
+ for comment in comments:
+ if comment.author == user_to_delete:
+ query=(db.comment.id==comment.id)
+ db(query).delete()
+ redirect(URL(r=request, f="admin?page="+str(page)))
+
-def sort_by_id(L):
- if len(L) <= 1: return L
- return sort_by_id( [ lt for lt in L[1:] if lt.id < L[0].id ] ) + [ L[0] ] + sort_by_id( [ ge for ge in L[1:] if ge.id >= L[0].id ] )
def index():
sorts = ["newest", "views"]
@@ -18,22 +75,37 @@ def index():
sort = "newest"
if "profile" in request.vars.keys(): profile = request.vars["profile"]
else: profile = None
+ if "favorites" in request.vars.keys(): show_favorites = bool(request.vars["favorites"])
+ else: show_favorites = False
+ profile_user = None
+ favorites = None
+ if profile != None:
+ users = db().select(db.auth_user.ALL)
+ for user in users:
+ if user.username == profile:
+ profile_user = user
+ favorites = pickle.loads(profile_user.favorites)
table = []
raw_images = db().select(db.image.ALL)
i = 0
row = []
count = 0
images = []
+ c = 1
for image in raw_images:
if profile != None:
- if image.creator == profile:
- images.append(image)
+ if show_favorites:
+ if image.id in favorites:
+ images.append(image)
+ if not show_favorites:
+ if image.creator == profile:
+ images.append(image)
else: images.append(image)
if sort == 'views':
- #images = sort_by_views(images)
+ images.sort(cmp=lambda x,y:cmp(float(x.views),float(y.views)))
images.reverse()
if sort == 'newest':
- images.sort(cmp=lambda x,y:cmp(x.id,y.id))
+ images.sort(cmp=lambda x,y:cmp(float(x.Submit_Time),float(y.Submit_Time)))
images.reverse()
for image in images:
if count >= page * 12 and page*12+12 > count:
@@ -48,28 +120,253 @@ def index():
pages = count / 12
if count%12 > 0: pages += 1
page += 1
- return dict(images=table, pages=pages, page=page, sort=sort, profile=profile)
+ return dict(images=table, pages=pages, page=page, sort=sort, profile=profile_user, show_favorites=show_favorites,num_requests = get_requests())
+
+
+def profile():
+ if "profile" in request.vars.keys(): profile = request.vars["profile"]
+ else: redirect(URL(r=request,f='index'))
+ users = db().select(db.auth_user.ALL)
+ for user in users:
+ if user.username == profile:
+ profile_user = user
+ favorite_ids = pickle.loads(profile_user.favorites)
+ friends = pickle.loads(profile_user.friends)
+ requests = pickle.loads(profile_user.requests)
+ raw_images = db().select(db.image.ALL)
+ images = []
+ favorites = []
+ avatar = None
+ for image in raw_images:
+ #if image.id == int(profile_user.avatar):
+ # avatar = image
+ if image.creator == profile:
+ images.append(image)
+ if image.id in favorite_ids:
+ favorites.append(image)
+ images.sort(cmp=lambda x,y:cmp(float(x.Submit_Time),float(y.Submit_Time)))
+ images.reverse()
+ favorite_ids.reverse()
+ favorites_table = []
+ favs_sorted = []
+ i = 0
+ row = []
+ for f_id in favorite_ids:
+ if i < 8:
+ for fav in favorites:
+ if fav.id == f_id:
+ favs_sorted.append(fav)
+ if len(favs_sorted) < 4:
+ favorites_table.append(favs_sorted)
+ if len(favs_sorted) == 4 or len(favs_sorted)>4:
+ favorites_table.append(favs_sorted[:4])
+ if len(favs_sorted) > 4 and len(favs_sorted) < 8:
+ favorites_table.append(favs_sorted[4:])
+ if len(favs_sorted) > 4 and len(favs_sorted) >= 8:
+ favorites_table.append(favs_sorted[4:8])
+
+ images_table = []
+ row = []
+ c = 0
+ i = 0
+ for image in images:
+ if c < 2:
+ row.append(image)
+ i += 1
+ if i == 4:
+ images_table.append(row)
+ c += 1
+ i = 0
+ row = []
+ if len(images) < 8 and len(images)%4 != 0:
+ images_table.append(row)
+ return dict(profile = profile_user, images = images_table, favorites = favorites_table,requests = requests,friends=friends,avatar=avatar, num_requests = get_requests())
+
+def friends():
+ if "page" in request.vars.keys(): page = int(request.vars["page"]) - 1
+ else: page = 0
+ if "user" in request.vars.keys(): username = request.vars["user"]
+ else: redirect(URL(r=request,f='index'))
+ users = db().select(db.auth_user.ALL)
+ for user in users:
+ if user.username == username:
+ friends = pickle.loads(user.friends)
+ friends_list=[]
+ for user in users:
+ if user.username in friends:
+ friends_list.append(user)
+ friends_list.sort(cmp=lambda x,y:cmp(x.username.lower(),y.username.lower()))
+ friends_on_page = friends_list[page*10:(page+1)*10]
+ pages = len(friends_list) / 10
+ if len(friends_list)%10 > 0: pages += 1
+ return dict(username = username, friends = friends_on_page,page=page+1,pages=pages, num_requests = get_requests())
+
+def respond_to_request():
+ if "user" in request.vars.keys() and auth.is_logged_in(): username = request.vars["user"]
+ else: redirect(URL(r=request,f='index'))
+ if "response" in request.vars.keys(): response = bool(request.vars["user"])
+ else: redirect(URL(r=request,f='index'))
+ users = db().select(db.auth_user.ALL)
+ current_user = None
+ user_to_add = None
+ for user in users:
+ if user.username == auth.user.username:
+ current_user = user
+ if user.username == username:
+ user_to_add = user
+ if user_to_add == None or current_user == None:
+ redirect(URL(r=request,f='index'))
+ requests = pickle.loads(current_user.requests)
+ real_request = None
+ for r in requests:
+ if r[1] == user_to_add.username:
+ real_request = r
+ if real_request == None:redirect(URL(r=request,f='index'))
+ requests.remove(real_request)
+ db(db.auth_user.username==current_user.username).update(requests = pickle.dumps(requests))
+ if response:
+ friends = pickle.loads(current_user.friends)
+ friends.append(user_to_add.username)
+ db(db.auth_user.username==current_user.username).update(friends = pickle.dumps(friends))
+ friends = pickle.loads(user_to_add.friends)
+ friends.append(current_user.username)
+ db(db.auth_user.username==user_to_add.username).update(friends = pickle.dumps(friends))
+ redirect(URL(r=request,f='requests'))
+
+def remove_friends():
+ if "user" in request.vars.keys() and auth.is_logged_in(): username = request.vars["user"]
+ else: redirect(URL(r=request,f='index'))
+ users = db().select(db.auth_user.ALL)
+ current_user = None
+ user_to_remove = None
+ for user in users:
+ if user.username == auth.user.username:
+ current_user = user
+ if user.username == username:
+ user_to_remove = user
+ if user_to_remove == None or current_user == None:
+ redirect(URL(r=request,f='index'))
+ friends = pickle.loads(current_user.friends)
+ if user_to_remove.username in friends:
+ friends.remove(user_to_remove.username)
+ db(db.auth_user.username==current_user.username).update(friends = pickle.dumps(friends))
+ friends = pickle.loads(user_to_remove.friends)
+ if current_user.username in friends:
+ friends.remove(current_user.username)
+ db(db.auth_user.username==user_to_remove.username).update(friends = pickle.dumps(friends))
+ redirect(URL(r=request,f='friends?user='+current_user.username))
+
+def add_as_friend():
+ if "user" in request.vars.keys() and auth.is_logged_in(): username = request.vars["user"]
+ else: redirect(URL(r=request,f='index'))
+ users = db().select(db.auth_user.ALL)
+ for user in users:
+ if user.username == username:
+ user_to_add = user
+ requests = pickle.loads(user_to_add.requests)
+ requests.append(('friend', auth.user.username))
+ db(db.auth_user.username==user_to_add.username).update(requests = pickle.dumps(requests))
+ redirect(URL(r=request,f='profile?profile='+username))
+
+
+def requests():
+ if not auth.is_logged_in(): redirect(URL(r=request,f='index'))
+ users = db().select(db.auth_user.ALL)
+ for user in users:
+ if user.username == auth.user.username:
+ current_user = user
+ requests = pickle.loads(current_user.requests)
+ return dict(requests = requests, num_requests = get_requests())
+
def upload():
- form = SQLFORM(db.image, fields = ['title', 'file', 'newimage', 'description'])
- if form.accepts(request.vars, session):
- session.new_image_title = form.vars.title
- db(db.image.title==session.new_image_title).update(creator = auth.user.username)
- db(db.image.title==session.new_image_title).update(views = 0)
- redirect(URL(r=request, f='index'))
+ upload_key = request.vars["upload_key"]
+ title = request.vars["title"]
+ form = SQLFORM(db.image, fields = ['title', 'file', 'newimage','small_image', 'description','upload_key'])
+ if form.accepts(request.vars):
+ keys = db().select(db.upload_key.ALL)
+ for key in keys:
+ if key.upload_key == upload_key:
+ user = key.user
+ db(db.image.upload_key==upload_key).update(creator = user)
+ query=(db.upload_key.upload_key==upload_key)
+ db(query).delete()
+ images = db().select(db.image.ALL)
+ for image in images:
+ if image.id == form.vars.id:
+ real_image = image
+ images = db().select(db.image.ALL)
+ for image in images:
+ if image.creator == user and image.title.lower() == form.vars.title.lower() and image.upload_key != upload_key:
+ db(db.image.upload_key==upload_key).update(views = image.views)
+ query=(db.image.id==image.id)
+ db(query).delete()
+ else:
+ import logging
+ logging.error("form not accepted")
+ raise HTTP(400,"failed to upload")
return dict(form=form)
-"""@service.xmlrpc
-def upload_remote(username,password,image,ta_file,title,description):
+
+@service.xmlrpc
+def login_remote(username,password):
logged_in = auth.login_bare(username,password)
if logged_in:
- db.image.insert(file=ta_file,
- image=image,
- title=title,
- description=description,
- creator=auth.user.username,
- views=0)"""
-
+ db.upload_key.insert(user=username)
+ keys = db().select(db.upload_key.ALL)
+ for key in keys:
+ if key.user == username:
+ return str(key.upload_key)
+ return False
+ else: return False
+
+
+def remove_as_favorite():
+ if "id" in request.vars.keys(): image_id = int(request.vars["id"])
+ else: redirect(URL(r=request,f='index'))
+ if auth.is_logged_in():
+ images = db().select(db.image.ALL)
+ for image in images:
+ if image.id == image_id:
+ favorite_users = pickle.loads(image.favorite_users)
+ if auth.user.username in favorite_users:
+ favorite_users.remove(auth.user.username)
+ db(db.image.id==image_id).update(favorite_users = pickle.dumps(favorite_users))
+ users = db().select(db.auth_user.ALL)
+ for user in users:
+ if user.username == auth.user.username:
+ favorites = pickle.loads(user.favorites)
+ if image_id in favorites:
+ favorites.remove(image_id)
+ db(db.auth_user.username==auth.user.username).update(favorites = pickle.dumps(favorites))
+ redirect(URL(r=request, f='image?image='+str(image_id)))
+
+def make_avatar():
+ if "image" in request.vars.keys() and auth.is_logged_in(): image_id = int(request.vars["image"])
+ else: redirect(URL(r=request,f='index'))
+ db(db.auth_user.username==auth.user.username).update(avatar = image_id)
+ redirect(URL(r=request,f='image?image='+str(image_id)))
+
+
+def add_as_favorite():
+ if "id" in request.vars.keys(): image_id = int(request.vars["id"])
+ else: redirect(URL(r=request,f='index'))
+ if auth.is_logged_in():
+ images = db().select(db.image.ALL)
+ for image in images:
+ if image.id == image_id:
+ favorite_users = pickle.loads(image.favorite_users)
+ if auth.user.username not in favorite_users:
+ favorite_users.append(auth.user.username)
+ db(db.image.id==image_id).update(favorite_users = pickle.dumps(favorite_users))
+ users = db().select(db.auth_user.ALL)
+ for user in users:
+ if user.username == auth.user.username:
+ favorites = pickle.loads(user.favorites)
+ if image_id not in favorites:
+ favorites.append(image_id)
+ db(db.auth_user.username==auth.user.username).update(favorites = pickle.dumps(favorites))
+ redirect(URL(r=request, f='image?image='+str(image_id)))
def image():
@@ -83,8 +380,12 @@ def image():
redirect(URL(r=request, f='index'))
if auth.is_logged_in():
if auth.user.username != real_image.creator:
- views = int(real_image.views) + 1
+ try:
+ views = int(real_image.views) + 1
+ except: views = 1
db(db.image.title==real_image.title).update(views = views)
+ users = db().select(db.auth_user.ALL)
+ favorite_users = pickle.loads(real_image.favorite_users)
form = SQLFORM(db.comment, fields = ['body'])
if form.accepts(request.vars, session):
db(db.comment.id==form.vars.id).update(author = auth.user.username)
@@ -94,27 +395,57 @@ def image():
for comment in comments:
if comment.image_id == real_image.id:
image_comments.append(comment)
- return dict(image = real_image, form= form,comments=image_comments)
-
+ return dict(image = real_image, form= form,comments=image_comments,favorites = favorite_users,num_requests = get_requests())
+
def testimage():
return db(db.image.title=="hellotest")
+
def user():
return dict(form=auth())
-def delete():
+@auth.requires_membership('admin')
+def delete_comment():
+ comment_id = int(request.vars["id"])
+ if "image" in request.vars.keys():
+ image_id = request.vars["image"]
+ else:image_id = None
+ if auth.is_logged_in():
+ if auth.has_membership('admin'):
+ query=(db.comment.id==comment_id)
+ db(query).delete()
+ if image_id != None:
+ redirect(URL(r=request, f='image?image='+image_id))
+ else:
+ redirect(URL(r=request, f='index'))
+
+def delete_image_confirmation():
images = db().select(db.image.ALL)
image_id = int(request.vars["id"])
for image in images:
if image.id == image_id:
real_image = image
if auth.is_logged_in():
- if auth.user.username == real_image.creator:
+ if auth.user.username == real_image.creator or auth.has_membership('admin'):
+ return dict(image = real_image,num_requests = get_requests())
+ else: redirect(URL(r=request, f='index'))
+
+def delete_image():
+ images = db().select(db.image.ALL)
+ image_id = int(request.vars["id"])
+ for image in images:
+ if image.id == image_id:
+ real_image = image
+ if auth.is_logged_in():
+ if auth.user.username == real_image.creator or auth.has_membership('admin'):
query=(db.image.id==real_image.id)
db(query).delete()
redirect(URL(r=request, f='index'))
-
-
+
+
def download():
return response.download(request, db)
+
+
+def call(): return service()
diff --git a/errors/127.0.0.1.2010-07-22.17-24-28.38ccea81-882e-4042-938b-efa671e3c7c8 b/errors/127.0.0.1.2010-07-22.17-24-28.38ccea81-882e-4042-938b-efa671e3c7c8
new file mode 100644
index 0000000..46f3b0b
--- /dev/null
+++ b/errors/127.0.0.1.2010-07-22.17-24-28.38ccea81-882e-4042-938b-efa671e3c7c8
@@ -0,0 +1,17 @@
+(dp1
+S'output'
+p2
+S''
+sS'layer'
+p3
+S'/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py'
+p4
+sS'code'
+p5
+S'import os\nfrom gluon.tools import Service\nservice=Service(globals())\n\ndef sort_by_views(L):\n if len(L) <= 1: return L\n return sort_by_views( [ lt for lt in L[1:] if lt.views < L[0].views ] ) + [ L[0] ] + sort_by_views( [ ge for ge in L[1:] if ge.views >= L[0].views ] )\n\ndef sort_by_id(L):\n if len(L) <= 1: return L\n return sort_by_id( [ lt for lt in L[1:] if lt.id < L[0].id ] ) + [ L[0] ] + sort_by_id( [ ge for ge in L[1:] if ge.id >= L[0].id ] )\n\n\ndef admin():\n import pdb\n pdb.set_trace()\n\ndef index():\n sorts = ["newest", "views"]\n if "page" in request.vars.keys(): page = int(request.vars["page"]) - 1\n else: page = 0\n if "sort" in request.vars.keys(): sort = request.vars["sort"]\n else: sort = \'newest\'\n if sort not in sorts:\n sort = "newest"\n if "profile" in request.vars.keys(): profile = request.vars["profile"]\n else: profile = None\n table = []\n raw_images = db().select(db.image.ALL)\n i = 0\n row = []\n count = 0\n images = []\n c = 1\n for image in raw_images:\n if profile != None:\n if image.creator == profile:\n images.append(image)\n else: images.append(image)\n if sort == \'views\':\n images = sort_by_views(images)\n images.reverse()\n if sort == \'newest\':\n images.sort(cmp=lambda x,y:cmp(x.id,y.id))\n images.reverse()\n for image in images:\n if count >= page * 12 and page*12+12 > count:\n if i == 4:\n table.append(row)\n row = []\n i = 0\n i += 1\n row.append(image)\n count += 1\n table.append(row)\n pages = count / 12\n if count%12 > 0: pages += 1\n page += 1\n return dict(images=table, pages=pages, page=page, sort=sort, profile=profile)\n\n\ndef upload():\n upload_key = request.vars["upload_key"]\n title = request.vars["title"]\n form = SQLFORM(db.image, fields = [\'title\', \'file\', \'newimage\', \'description\',\'upload_key\'])\n if form.accepts(request.vars):\n keys = db().select(db.upload_key.ALL)\n for key in keys:\n if key.upload_key == upload_key:\n db(db.image.upload_key==upload_key).update(creator = key.user)\n query=(db.upload_key.upload_key==upload_key)\n db(query).delete()\n else:\n import logging\n logging.error("form not accepted")\n raise HTTP(400,"failed to upload")\n return dict(form=form)\n\n\n@service.xmlrpc\ndef login_remote(username,password):\n logged_in = auth.login_bare(username,password)\n if logged_in:\n db.upload_key.insert(user=username)\n keys = db().select(db.upload_key.ALL)\n for key in keys:\n if key.user == username:\n return str(key.upload_key)\n return False\n else: return False\n\n\ndef image():\n images = db().select(db.image.ALL)\n image_id = int(request.vars["image"])\n for image in images:\n if image.id == image_id:\n real_image = image\n title=real_image.title\n if real_image == None:\n redirect(URL(r=request, f=\'index\'))\n if auth.is_logged_in():\n if auth.user.username != real_image.creator:\n try:\n views = int(real_image.views) + 1\n except: views = 1\n db(db.image.title==real_image.title).update(views = views)\n form = SQLFORM(db.comment, fields = [\'body\'])\n if form.accepts(request.vars, session):\n db(db.comment.id==form.vars.id).update(author = auth.user.username)\n db(db.comment.id==form.vars.id).update(image_id = real_image.id)\n comments=db().select(db.comment.ALL)\n image_comments = []\n for comment in comments:\n if comment.image_id == real_image.id:\n image_comments.append(comment)\n return dict(image = real_image, form= form,comments=image_comments)\n\n \ndef testimage():\n\treturn db(db.image.title=="hellotest")\n\n\ndef user(): \n return dict(form=auth())\n\n\ndef delete():\n images = db().select(db.image.ALL)\n image_id = int(request.vars["id"])\n for image in images:\n if image.id == image_id:\n real_image = image\n if auth.is_logged_in():\n if auth.user.username == real_image.creator:\n query=(db.image.id==real_image.id)\n db(query).delete()\n redirect(URL(r=request, f=\'index\')) \n\n\ndef download():\n return response.download(request, db)\n\n\ndef call(): return service()\n\nresponse._vars=response._caller(admin)\n'
+p6
+sS'traceback'
+p7
+S'Traceback (most recent call last):\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/gluon/restricted.py", line 178, in restricted\n exec ccode in environment\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py", line 147, in <module>\n def call(): return service()\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/gluon/globals.py", line 96, in <lambda>\n self._caller = lambda f: f()\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py", line 16, in admin\n for user in users:\n File "/usr/lib/python2.6/bdb.py", line 50, in trace_dispatch\n return self.dispatch_return(frame, arg)\n File "/usr/lib/python2.6/bdb.py", line 84, in dispatch_return\n if self.quitting: raise BdbQuit\nBdbQuit\n'
+p8
+s. \ No newline at end of file
diff --git a/errors/127.0.0.1.2010-07-22.17-39-28.15a9379c-ac34-44ab-bc1e-364cd903b02a b/errors/127.0.0.1.2010-07-22.17-39-28.15a9379c-ac34-44ab-bc1e-364cd903b02a
new file mode 100644
index 0000000..c391636
--- /dev/null
+++ b/errors/127.0.0.1.2010-07-22.17-39-28.15a9379c-ac34-44ab-bc1e-364cd903b02a
@@ -0,0 +1,17 @@
+(dp1
+S'output'
+p2
+S''
+sS'layer'
+p3
+S'/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py'
+p4
+sS'code'
+p5
+S'import os\nfrom gluon.tools import Service\nservice=Service(globals())\n\ndef sort_by_views(L):\n if len(L) <= 1: return L\n return sort_by_views( [ lt for lt in L[1:] if lt.views < L[0].views ] ) + [ L[0] ] + sort_by_views( [ ge for ge in L[1:] if ge.views >= L[0].views ] )\n\ndef sort_by_id(L):\n if len(L) <= 1: return L\n return sort_by_id( [ lt for lt in L[1:] if lt.id < L[0].id ] ) + [ L[0] ] + sort_by_id( [ ge for ge in L[1:] if ge.id >= L[0].id ] )\n\n\ndef admin():\n if "page" in request.vars.keys(): = page = int(request.vars["page"])-1\n else: page = 0\n users = db().select(db.auth_user.ALL)\n users_list=[]\n for user in users: users_list.append(users)\n users_on_page = users_list[page*20,(page+1)*20]\n return dict(users = users_on_page, page=page+1)\n\n\ndef index():\n sorts = ["newest", "views"]\n if "page" in request.vars.keys(): page = int(request.vars["page"]) - 1\n else: page = 0\n if "sort" in request.vars.keys(): sort = request.vars["sort"]\n else: sort = \'newest\'\n if sort not in sorts:\n sort = "newest"\n if "profile" in request.vars.keys(): profile = request.vars["profile"]\n else: profile = None\n table = []\n raw_images = db().select(db.image.ALL)\n i = 0\n row = []\n count = 0\n images = []\n c = 1\n for image in raw_images:\n if profile != None:\n if image.creator == profile:\n images.append(image)\n else: images.append(image)\n if sort == \'views\':\n images = sort_by_views(images)\n images.reverse()\n if sort == \'newest\':\n images.sort(cmp=lambda x,y:cmp(x.id,y.id))\n images.reverse()\n for image in images:\n if count >= page * 12 and page*12+12 > count:\n if i == 4:\n table.append(row)\n row = []\n i = 0\n i += 1\n row.append(image)\n count += 1\n table.append(row)\n pages = count / 12\n if count%12 > 0: pages += 1\n page += 1\n return dict(images=table, pages=pages, page=page, sort=sort, profile=profile)\n\n\ndef upload():\n upload_key = request.vars["upload_key"]\n title = request.vars["title"]\n form = SQLFORM(db.image, fields = [\'title\', \'file\', \'newimage\', \'description\',\'upload_key\'])\n if form.accepts(request.vars):\n keys = db().select(db.upload_key.ALL)\n for key in keys:\n if key.upload_key == upload_key:\n db(db.image.upload_key==upload_key).update(creator = key.user)\n query=(db.upload_key.upload_key==upload_key)\n db(query).delete()\n else:\n import logging\n logging.error("form not accepted")\n raise HTTP(400,"failed to upload")\n return dict(form=form)\n\n\n@service.xmlrpc\ndef login_remote(username,password):\n logged_in = auth.login_bare(username,password)\n if logged_in:\n db.upload_key.insert(user=username)\n keys = db().select(db.upload_key.ALL)\n for key in keys:\n if key.user == username:\n return str(key.upload_key)\n return False\n else: return False\n\n\ndef image():\n images = db().select(db.image.ALL)\n image_id = int(request.vars["image"])\n for image in images:\n if image.id == image_id:\n real_image = image\n title=real_image.title\n if real_image == None:\n redirect(URL(r=request, f=\'index\'))\n if auth.is_logged_in():\n if auth.user.username != real_image.creator:\n try:\n views = int(real_image.views) + 1\n except: views = 1\n db(db.image.title==real_image.title).update(views = views)\n form = SQLFORM(db.comment, fields = [\'body\'])\n if form.accepts(request.vars, session):\n db(db.comment.id==form.vars.id).update(author = auth.user.username)\n db(db.comment.id==form.vars.id).update(image_id = real_image.id)\n comments=db().select(db.comment.ALL)\n image_comments = []\n for comment in comments:\n if comment.image_id == real_image.id:\n image_comments.append(comment)\n return dict(image = real_image, form= form,comments=image_comments)\n\n \ndef testimage():\n\treturn db(db.image.title=="hellotest")\n\n\ndef user(): \n return dict(form=auth())\n\n\ndef delete():\n images = db().select(db.image.ALL)\n image_id = int(request.vars["id"])\n for image in images:\n if image.id == image_id:\n real_image = image\n if auth.is_logged_in():\n if auth.user.username == real_image.creator:\n query=(db.image.id==real_image.id)\n db(query).delete()\n redirect(URL(r=request, f=\'index\')) \n\n\ndef download():\n return response.download(request, db)\n\n\ndef call(): return service()\n\nresponse._vars=response._caller(admin)\n'
+p6
+sS'traceback'
+p7
+S'Traceback (most recent call last):\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/gluon/restricted.py", line 176, in restricted\n ccode = compile2(code,layer)\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/gluon/restricted.py", line 163, in compile2\n return compile(code.rstrip().replace(\'\\r\\n\',\'\\n\')+\'\\n\', layer, \'exec\')\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py", line 15\n if "page" in request.vars.keys(): = page = int(request.vars["page"])-1\n ^\nSyntaxError: invalid syntax\n'
+p8
+s. \ No newline at end of file
diff --git a/errors/127.0.0.1.2010-07-22.17-39-33.02930942-2e25-4966-a9e0-c6435a26a7b2 b/errors/127.0.0.1.2010-07-22.17-39-33.02930942-2e25-4966-a9e0-c6435a26a7b2
new file mode 100644
index 0000000..c391636
--- /dev/null
+++ b/errors/127.0.0.1.2010-07-22.17-39-33.02930942-2e25-4966-a9e0-c6435a26a7b2
@@ -0,0 +1,17 @@
+(dp1
+S'output'
+p2
+S''
+sS'layer'
+p3
+S'/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py'
+p4
+sS'code'
+p5
+S'import os\nfrom gluon.tools import Service\nservice=Service(globals())\n\ndef sort_by_views(L):\n if len(L) <= 1: return L\n return sort_by_views( [ lt for lt in L[1:] if lt.views < L[0].views ] ) + [ L[0] ] + sort_by_views( [ ge for ge in L[1:] if ge.views >= L[0].views ] )\n\ndef sort_by_id(L):\n if len(L) <= 1: return L\n return sort_by_id( [ lt for lt in L[1:] if lt.id < L[0].id ] ) + [ L[0] ] + sort_by_id( [ ge for ge in L[1:] if ge.id >= L[0].id ] )\n\n\ndef admin():\n if "page" in request.vars.keys(): = page = int(request.vars["page"])-1\n else: page = 0\n users = db().select(db.auth_user.ALL)\n users_list=[]\n for user in users: users_list.append(users)\n users_on_page = users_list[page*20,(page+1)*20]\n return dict(users = users_on_page, page=page+1)\n\n\ndef index():\n sorts = ["newest", "views"]\n if "page" in request.vars.keys(): page = int(request.vars["page"]) - 1\n else: page = 0\n if "sort" in request.vars.keys(): sort = request.vars["sort"]\n else: sort = \'newest\'\n if sort not in sorts:\n sort = "newest"\n if "profile" in request.vars.keys(): profile = request.vars["profile"]\n else: profile = None\n table = []\n raw_images = db().select(db.image.ALL)\n i = 0\n row = []\n count = 0\n images = []\n c = 1\n for image in raw_images:\n if profile != None:\n if image.creator == profile:\n images.append(image)\n else: images.append(image)\n if sort == \'views\':\n images = sort_by_views(images)\n images.reverse()\n if sort == \'newest\':\n images.sort(cmp=lambda x,y:cmp(x.id,y.id))\n images.reverse()\n for image in images:\n if count >= page * 12 and page*12+12 > count:\n if i == 4:\n table.append(row)\n row = []\n i = 0\n i += 1\n row.append(image)\n count += 1\n table.append(row)\n pages = count / 12\n if count%12 > 0: pages += 1\n page += 1\n return dict(images=table, pages=pages, page=page, sort=sort, profile=profile)\n\n\ndef upload():\n upload_key = request.vars["upload_key"]\n title = request.vars["title"]\n form = SQLFORM(db.image, fields = [\'title\', \'file\', \'newimage\', \'description\',\'upload_key\'])\n if form.accepts(request.vars):\n keys = db().select(db.upload_key.ALL)\n for key in keys:\n if key.upload_key == upload_key:\n db(db.image.upload_key==upload_key).update(creator = key.user)\n query=(db.upload_key.upload_key==upload_key)\n db(query).delete()\n else:\n import logging\n logging.error("form not accepted")\n raise HTTP(400,"failed to upload")\n return dict(form=form)\n\n\n@service.xmlrpc\ndef login_remote(username,password):\n logged_in = auth.login_bare(username,password)\n if logged_in:\n db.upload_key.insert(user=username)\n keys = db().select(db.upload_key.ALL)\n for key in keys:\n if key.user == username:\n return str(key.upload_key)\n return False\n else: return False\n\n\ndef image():\n images = db().select(db.image.ALL)\n image_id = int(request.vars["image"])\n for image in images:\n if image.id == image_id:\n real_image = image\n title=real_image.title\n if real_image == None:\n redirect(URL(r=request, f=\'index\'))\n if auth.is_logged_in():\n if auth.user.username != real_image.creator:\n try:\n views = int(real_image.views) + 1\n except: views = 1\n db(db.image.title==real_image.title).update(views = views)\n form = SQLFORM(db.comment, fields = [\'body\'])\n if form.accepts(request.vars, session):\n db(db.comment.id==form.vars.id).update(author = auth.user.username)\n db(db.comment.id==form.vars.id).update(image_id = real_image.id)\n comments=db().select(db.comment.ALL)\n image_comments = []\n for comment in comments:\n if comment.image_id == real_image.id:\n image_comments.append(comment)\n return dict(image = real_image, form= form,comments=image_comments)\n\n \ndef testimage():\n\treturn db(db.image.title=="hellotest")\n\n\ndef user(): \n return dict(form=auth())\n\n\ndef delete():\n images = db().select(db.image.ALL)\n image_id = int(request.vars["id"])\n for image in images:\n if image.id == image_id:\n real_image = image\n if auth.is_logged_in():\n if auth.user.username == real_image.creator:\n query=(db.image.id==real_image.id)\n db(query).delete()\n redirect(URL(r=request, f=\'index\')) \n\n\ndef download():\n return response.download(request, db)\n\n\ndef call(): return service()\n\nresponse._vars=response._caller(admin)\n'
+p6
+sS'traceback'
+p7
+S'Traceback (most recent call last):\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/gluon/restricted.py", line 176, in restricted\n ccode = compile2(code,layer)\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/gluon/restricted.py", line 163, in compile2\n return compile(code.rstrip().replace(\'\\r\\n\',\'\\n\')+\'\\n\', layer, \'exec\')\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py", line 15\n if "page" in request.vars.keys(): = page = int(request.vars["page"])-1\n ^\nSyntaxError: invalid syntax\n'
+p8
+s. \ No newline at end of file
diff --git a/errors/127.0.0.1.2010-07-22.17-39-34.a6cec48e-f59f-4387-bd36-6748e816b769 b/errors/127.0.0.1.2010-07-22.17-39-34.a6cec48e-f59f-4387-bd36-6748e816b769
new file mode 100644
index 0000000..c391636
--- /dev/null
+++ b/errors/127.0.0.1.2010-07-22.17-39-34.a6cec48e-f59f-4387-bd36-6748e816b769
@@ -0,0 +1,17 @@
+(dp1
+S'output'
+p2
+S''
+sS'layer'
+p3
+S'/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py'
+p4
+sS'code'
+p5
+S'import os\nfrom gluon.tools import Service\nservice=Service(globals())\n\ndef sort_by_views(L):\n if len(L) <= 1: return L\n return sort_by_views( [ lt for lt in L[1:] if lt.views < L[0].views ] ) + [ L[0] ] + sort_by_views( [ ge for ge in L[1:] if ge.views >= L[0].views ] )\n\ndef sort_by_id(L):\n if len(L) <= 1: return L\n return sort_by_id( [ lt for lt in L[1:] if lt.id < L[0].id ] ) + [ L[0] ] + sort_by_id( [ ge for ge in L[1:] if ge.id >= L[0].id ] )\n\n\ndef admin():\n if "page" in request.vars.keys(): = page = int(request.vars["page"])-1\n else: page = 0\n users = db().select(db.auth_user.ALL)\n users_list=[]\n for user in users: users_list.append(users)\n users_on_page = users_list[page*20,(page+1)*20]\n return dict(users = users_on_page, page=page+1)\n\n\ndef index():\n sorts = ["newest", "views"]\n if "page" in request.vars.keys(): page = int(request.vars["page"]) - 1\n else: page = 0\n if "sort" in request.vars.keys(): sort = request.vars["sort"]\n else: sort = \'newest\'\n if sort not in sorts:\n sort = "newest"\n if "profile" in request.vars.keys(): profile = request.vars["profile"]\n else: profile = None\n table = []\n raw_images = db().select(db.image.ALL)\n i = 0\n row = []\n count = 0\n images = []\n c = 1\n for image in raw_images:\n if profile != None:\n if image.creator == profile:\n images.append(image)\n else: images.append(image)\n if sort == \'views\':\n images = sort_by_views(images)\n images.reverse()\n if sort == \'newest\':\n images.sort(cmp=lambda x,y:cmp(x.id,y.id))\n images.reverse()\n for image in images:\n if count >= page * 12 and page*12+12 > count:\n if i == 4:\n table.append(row)\n row = []\n i = 0\n i += 1\n row.append(image)\n count += 1\n table.append(row)\n pages = count / 12\n if count%12 > 0: pages += 1\n page += 1\n return dict(images=table, pages=pages, page=page, sort=sort, profile=profile)\n\n\ndef upload():\n upload_key = request.vars["upload_key"]\n title = request.vars["title"]\n form = SQLFORM(db.image, fields = [\'title\', \'file\', \'newimage\', \'description\',\'upload_key\'])\n if form.accepts(request.vars):\n keys = db().select(db.upload_key.ALL)\n for key in keys:\n if key.upload_key == upload_key:\n db(db.image.upload_key==upload_key).update(creator = key.user)\n query=(db.upload_key.upload_key==upload_key)\n db(query).delete()\n else:\n import logging\n logging.error("form not accepted")\n raise HTTP(400,"failed to upload")\n return dict(form=form)\n\n\n@service.xmlrpc\ndef login_remote(username,password):\n logged_in = auth.login_bare(username,password)\n if logged_in:\n db.upload_key.insert(user=username)\n keys = db().select(db.upload_key.ALL)\n for key in keys:\n if key.user == username:\n return str(key.upload_key)\n return False\n else: return False\n\n\ndef image():\n images = db().select(db.image.ALL)\n image_id = int(request.vars["image"])\n for image in images:\n if image.id == image_id:\n real_image = image\n title=real_image.title\n if real_image == None:\n redirect(URL(r=request, f=\'index\'))\n if auth.is_logged_in():\n if auth.user.username != real_image.creator:\n try:\n views = int(real_image.views) + 1\n except: views = 1\n db(db.image.title==real_image.title).update(views = views)\n form = SQLFORM(db.comment, fields = [\'body\'])\n if form.accepts(request.vars, session):\n db(db.comment.id==form.vars.id).update(author = auth.user.username)\n db(db.comment.id==form.vars.id).update(image_id = real_image.id)\n comments=db().select(db.comment.ALL)\n image_comments = []\n for comment in comments:\n if comment.image_id == real_image.id:\n image_comments.append(comment)\n return dict(image = real_image, form= form,comments=image_comments)\n\n \ndef testimage():\n\treturn db(db.image.title=="hellotest")\n\n\ndef user(): \n return dict(form=auth())\n\n\ndef delete():\n images = db().select(db.image.ALL)\n image_id = int(request.vars["id"])\n for image in images:\n if image.id == image_id:\n real_image = image\n if auth.is_logged_in():\n if auth.user.username == real_image.creator:\n query=(db.image.id==real_image.id)\n db(query).delete()\n redirect(URL(r=request, f=\'index\')) \n\n\ndef download():\n return response.download(request, db)\n\n\ndef call(): return service()\n\nresponse._vars=response._caller(admin)\n'
+p6
+sS'traceback'
+p7
+S'Traceback (most recent call last):\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/gluon/restricted.py", line 176, in restricted\n ccode = compile2(code,layer)\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/gluon/restricted.py", line 163, in compile2\n return compile(code.rstrip().replace(\'\\r\\n\',\'\\n\')+\'\\n\', layer, \'exec\')\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py", line 15\n if "page" in request.vars.keys(): = page = int(request.vars["page"])-1\n ^\nSyntaxError: invalid syntax\n'
+p8
+s. \ No newline at end of file
diff --git a/errors/127.0.0.1.2010-07-22.17-39-51.fafceef8-b7b5-4510-ad5e-f08f67eca4ed b/errors/127.0.0.1.2010-07-22.17-39-51.fafceef8-b7b5-4510-ad5e-f08f67eca4ed
new file mode 100644
index 0000000..c391636
--- /dev/null
+++ b/errors/127.0.0.1.2010-07-22.17-39-51.fafceef8-b7b5-4510-ad5e-f08f67eca4ed
@@ -0,0 +1,17 @@
+(dp1
+S'output'
+p2
+S''
+sS'layer'
+p3
+S'/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py'
+p4
+sS'code'
+p5
+S'import os\nfrom gluon.tools import Service\nservice=Service(globals())\n\ndef sort_by_views(L):\n if len(L) <= 1: return L\n return sort_by_views( [ lt for lt in L[1:] if lt.views < L[0].views ] ) + [ L[0] ] + sort_by_views( [ ge for ge in L[1:] if ge.views >= L[0].views ] )\n\ndef sort_by_id(L):\n if len(L) <= 1: return L\n return sort_by_id( [ lt for lt in L[1:] if lt.id < L[0].id ] ) + [ L[0] ] + sort_by_id( [ ge for ge in L[1:] if ge.id >= L[0].id ] )\n\n\ndef admin():\n if "page" in request.vars.keys(): = page = int(request.vars["page"])-1\n else: page = 0\n users = db().select(db.auth_user.ALL)\n users_list=[]\n for user in users: users_list.append(users)\n users_on_page = users_list[page*20,(page+1)*20]\n return dict(users = users_on_page, page=page+1)\n\n\ndef index():\n sorts = ["newest", "views"]\n if "page" in request.vars.keys(): page = int(request.vars["page"]) - 1\n else: page = 0\n if "sort" in request.vars.keys(): sort = request.vars["sort"]\n else: sort = \'newest\'\n if sort not in sorts:\n sort = "newest"\n if "profile" in request.vars.keys(): profile = request.vars["profile"]\n else: profile = None\n table = []\n raw_images = db().select(db.image.ALL)\n i = 0\n row = []\n count = 0\n images = []\n c = 1\n for image in raw_images:\n if profile != None:\n if image.creator == profile:\n images.append(image)\n else: images.append(image)\n if sort == \'views\':\n images = sort_by_views(images)\n images.reverse()\n if sort == \'newest\':\n images.sort(cmp=lambda x,y:cmp(x.id,y.id))\n images.reverse()\n for image in images:\n if count >= page * 12 and page*12+12 > count:\n if i == 4:\n table.append(row)\n row = []\n i = 0\n i += 1\n row.append(image)\n count += 1\n table.append(row)\n pages = count / 12\n if count%12 > 0: pages += 1\n page += 1\n return dict(images=table, pages=pages, page=page, sort=sort, profile=profile)\n\n\ndef upload():\n upload_key = request.vars["upload_key"]\n title = request.vars["title"]\n form = SQLFORM(db.image, fields = [\'title\', \'file\', \'newimage\', \'description\',\'upload_key\'])\n if form.accepts(request.vars):\n keys = db().select(db.upload_key.ALL)\n for key in keys:\n if key.upload_key == upload_key:\n db(db.image.upload_key==upload_key).update(creator = key.user)\n query=(db.upload_key.upload_key==upload_key)\n db(query).delete()\n else:\n import logging\n logging.error("form not accepted")\n raise HTTP(400,"failed to upload")\n return dict(form=form)\n\n\n@service.xmlrpc\ndef login_remote(username,password):\n logged_in = auth.login_bare(username,password)\n if logged_in:\n db.upload_key.insert(user=username)\n keys = db().select(db.upload_key.ALL)\n for key in keys:\n if key.user == username:\n return str(key.upload_key)\n return False\n else: return False\n\n\ndef image():\n images = db().select(db.image.ALL)\n image_id = int(request.vars["image"])\n for image in images:\n if image.id == image_id:\n real_image = image\n title=real_image.title\n if real_image == None:\n redirect(URL(r=request, f=\'index\'))\n if auth.is_logged_in():\n if auth.user.username != real_image.creator:\n try:\n views = int(real_image.views) + 1\n except: views = 1\n db(db.image.title==real_image.title).update(views = views)\n form = SQLFORM(db.comment, fields = [\'body\'])\n if form.accepts(request.vars, session):\n db(db.comment.id==form.vars.id).update(author = auth.user.username)\n db(db.comment.id==form.vars.id).update(image_id = real_image.id)\n comments=db().select(db.comment.ALL)\n image_comments = []\n for comment in comments:\n if comment.image_id == real_image.id:\n image_comments.append(comment)\n return dict(image = real_image, form= form,comments=image_comments)\n\n \ndef testimage():\n\treturn db(db.image.title=="hellotest")\n\n\ndef user(): \n return dict(form=auth())\n\n\ndef delete():\n images = db().select(db.image.ALL)\n image_id = int(request.vars["id"])\n for image in images:\n if image.id == image_id:\n real_image = image\n if auth.is_logged_in():\n if auth.user.username == real_image.creator:\n query=(db.image.id==real_image.id)\n db(query).delete()\n redirect(URL(r=request, f=\'index\')) \n\n\ndef download():\n return response.download(request, db)\n\n\ndef call(): return service()\n\nresponse._vars=response._caller(admin)\n'
+p6
+sS'traceback'
+p7
+S'Traceback (most recent call last):\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/gluon/restricted.py", line 176, in restricted\n ccode = compile2(code,layer)\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/gluon/restricted.py", line 163, in compile2\n return compile(code.rstrip().replace(\'\\r\\n\',\'\\n\')+\'\\n\', layer, \'exec\')\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py", line 15\n if "page" in request.vars.keys(): = page = int(request.vars["page"])-1\n ^\nSyntaxError: invalid syntax\n'
+p8
+s. \ No newline at end of file
diff --git a/errors/127.0.0.1.2010-07-26.20-48-09.a4d32305-5768-49d6-8707-d1030c2cbcfb b/errors/127.0.0.1.2010-07-26.20-48-09.a4d32305-5768-49d6-8707-d1030c2cbcfb
new file mode 100644
index 0000000..843af4b
--- /dev/null
+++ b/errors/127.0.0.1.2010-07-26.20-48-09.a4d32305-5768-49d6-8707-d1030c2cbcfb
@@ -0,0 +1,17 @@
+(dp1
+S'output'
+p2
+S''
+sS'layer'
+p3
+S'/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py'
+p4
+sS'code'
+p5
+S'import os\nimport pickle\nfrom gluon.tools import Service\nservice=Service(globals())\n\n@auth.requires_membership(\'admin\')\ndef admin():\n if "page" in request.vars.keys(): page = int(request.vars["page"])-1\n else: page = 0\n users = db().select(db.auth_user.ALL)\n users_list=[]\n for user in users:\n users_list.append(user)\n users_list.sort(cmp=lambda x,y:cmp(x.username.lower(),y.username.lower()))\n users_on_page = users_list[page*10:(page+1)*10]\n pages = len(users_list) / 10\n if len(users_list)%10 > 0: pages += 1\n return dict(users = users_on_page, page=page+1,pages=pages)\n\n@auth.requires_membership(\'admin\')\ndef make_admin():\n if "page" in request.vars.keys(): page = int(request.vars["page"])\n else: page = 1\n if "user" in request.vars.keys(): user = request.vars["user"]\n else: redirect(URL(r=request, f="admin?page="+str(page)))\n auth.add_membership(\'admin\',user)\n redirect(URL(r=request, f="admin?page="+str(page)))\n\n@auth.requires_membership(\'admin\')\ndef remove_admin():\n if "page" in request.vars.keys(): page = int(request.vars["page"])\n else: page = 1\n if "user" in request.vars.keys(): user = request.vars["user"]\n else: redirect(URL(r=request, f="admin?page="+str(page)))\n auth.del_membership(auth.id_group(\'admin\'),user)\n redirect(URL(r=request, f="admin?page="+str(page)))\n\n@auth.requires_membership(\'admin\')\ndef delete_user():\n if "page" in request.vars.keys(): page = int(request.vars["page"])\n else: page = 1\n if "user" in request.vars.keys(): user_to_delete = request.vars["user"]\n else: redirect(URL(r=request, f="admin?page="+str(page)))\n query=(db.auth_user.username==user_to_delete)\n db(query).delete()\n images = db().select(db.image.ALL)\n for image in images:\n if image.creator == user_to_delete:\n query=(db.image.id==image.id)\n db(query).delete()\n comments = db().select(db.comment.ALL)\n for comment in comments:\n if comment.author == user_to_delete:\n query=(db.comment.id==comment.id)\n db(query).delete()\n redirect(URL(r=request, f="admin?page="+str(page))) \n \n\n\ndef index():\n import pdb\n pdb.set_trace()\n sorts = ["newest", "views"]\n if "page" in request.vars.keys(): page = int(request.vars["page"]) - 1\n else: page = 0\n if "sort" in request.vars.keys(): sort = request.vars["sort"]\n else: sort = \'newest\'\n if sort not in sorts:\n sort = "newest"\n if "profile" in request.vars.keys(): profile = request.vars["profile"]\n else: profile = None\n if "favorites" in request.vars.keys(): show_favorites = bool(request.vars["favorites"])\n else: show_favorites = False\n profile_user = None\n favorites = None\n if profile != None:\n users = db().select(db.auth_user.ALL)\n for user in users:\n if user.username == profile:\n profile_user = user\n favorites = pickle.loads(profile_user.favorites)\n table = []\n raw_images = db().select(db.image.ALL)\n i = 0\n row = []\n count = 0\n images = []\n c = 1\n for image in raw_images:\n if profile != None:\n if show_favorites:\n if image.id in favorites:\n images.append(image)\n if not show_favorites:\n if image.creator == profile:\n images.append(image)\n else: images.append(image)\n if sort == \'views\':\n images.sort(cmp=lambda x,y:cmp(float(x.views),float(y.views)))\n images.reverse()\n if sort == \'newest\':\n images.sort(cmp=lambda x,y:cmp(float(x.id),float(y.id)))\n images.reverse()\n for image in images:\n if count >= page * 12 and page*12+12 > count:\n if i == 4:\n table.append(row)\n row = []\n i = 0\n i += 1\n row.append(image)\n count += 1\n table.append(row)\n pages = count / 12\n if count%12 > 0: pages += 1\n page += 1\n return dict(images=table, pages=pages, page=page, sort=sort, profile=profile_user, show_favorites=show_favorites)\n\n\ndef profile():\n if "profile" in request.vars.keys(): profile = request.vars["profile"]\n else: redirect(URL(r=request,f=\'index\'))\n users = db().select(db.auth_user.ALL)\n for user in users:\n if user.username == profile:\n profile_user = user\n favorite_ids = pickle.loads(profile_user.favorites)\n raw_images = db().select(db.image.ALL)\n images = []\n favorites = []\n for image in raw_images:\n if image.creator == profile:\n images.append(image)\n if image.id in favorite_ids:\n favorites.append(image)\n favorites_table = []\n images_table = []\n row = []\n c = 0\n i = 0\n for image in images:\n if c < 2:\n row.append(image)\n i += 1\n if i == 4:\n images_table.append(row)\n c += 1\n i = 0\n row = []\n if len(images) < 8 and len(images)%4 != 0:\n images_table.append(row)\n row = []\n c = 0\n i = 0\n for image in favorites:\n if c < 2:\n row.append(image)\n i += 1\n if i == 4:\n favorites_table.append(row)\n c += 1\n i = 0\n row = []\n if len(favorites) < 8 and len(favorites)%4 != 0:\n favorites_table.append(row)\n return dict(profile = profile_user, images = images_table, favorites = favorites_table)\n\ndef respond_to_request():\n if "user" in request.vars.keys() and auth.is_logged_in(): username = request.vars["user"]\n else: redirect(URL(r=request,f=\'index\'))\n if "response" in request.vars.keys(): response = bool(request.vars["user"])\n else: redirect(URL(r=request,f=\'index\'))\n users = db().select(db.auth_user.ALL)\n current_user = None\n user_to_add = None\n for user in users:\n if user.username == auth.user.username:\n current_user = user\n if user.username == username:\n user_to_add = user\n if user_to_add == None or current_user == None:\n redirect(URL(r=request,f=\'index\'))\n requests = pickle.loads(current_user.requests)\n real_request = None\n for r in requests:\n if r[1] == user_to_add.username:\n real_request = r\n if real_request == None:redirect(URL(r=request,f=\'index\'))\n requests.remove(real_request)\n db(db.auth_user.username==current_user.username).update(requests = pickle.dumps(requests))\n if response:\n friends = pickle.loads(current_user.friends)\n friends.append(user_to_add.username)\n db(db.auth_user.username==current_user.username).update(friends = pickle.dumps(friends))\n friends = pickle.loads(user_to_add.friends)\n friends.append(current_user.username)\n db(db.auth_user.username==user_to_add.username).update(friends = pickle.dumps(friends))\n redirect(URL(r=request,f=\'requests\'))\n \n \n \n \ndef add_as_friend():\n if "user" in request.vars.keys() and auth.is_logged_in(): username = request.vars["user"]\n else: redirect(URL(r=request,f=\'index\'))\n users = db().select(db.auth_user.ALL)\n for user in users:\n if user.username == username:\n user_to_add = user\n requests = pickle.loads(user_to_add.requests)\n requests.append((\'friend\', auth.user.username))\n db(db.auth_user.username==user_to_add.username).update(requests = pickle.dumps(requests))\n redirect(URL(r=request,f=\'profile?profile=\'+username))\n\n\ndef requests():\n if auth.is_logged_in(): user = auth.user\n else: redirect(URL(r=request,f=\'index\'))\n users = db().select(db.auth_user.ALL)\n for user in users:\n if user.username == auth.user.username:\n current_user = user\n requests = pickle.loads(current_user.requests)\n return dict(requests = requests)\n\n\ndef upload():\n upload_key = request.vars["upload_key"]\n title = request.vars["title"]\n form = SQLFORM(db.image, fields = [\'title\', \'file\', \'newimage\',\'small_image\', \'description\',\'upload_key\'])\n if form.accepts(request.vars):\n keys = db().select(db.upload_key.ALL)\n for key in keys:\n if key.upload_key == upload_key:\n user = key.user\n db(db.image.upload_key==upload_key).update(creator = user)\n query=(db.upload_key.upload_key==upload_key)\n db(query).delete()\n images = db().select(db.image.ALL)\n for image in images:\n if image.id == form.vars.id:\n real_image = image\n images = db().select(db.image.ALL)\n for image in images:\n if image.creator == user and image.title.lower() == form.vars.title.lower() and image.upload_key != upload_key:\n db(db.image.upload_key==upload_key).update(views = image.views)\n query=(db.image.id==image.id)\n db(query).delete()\n else:\n import logging\n logging.error("form not accepted")\n raise HTTP(400,"failed to upload")\n return dict(form=form)\n\n\n@service.xmlrpc\ndef login_remote(username,password):\n logged_in = auth.login_bare(username,password)\n if logged_in:\n db.upload_key.insert(user=username)\n keys = db().select(db.upload_key.ALL)\n for key in keys:\n if key.user == username:\n return str(key.upload_key)\n return False\n else: return False\n\n"""def upload():\n upload_key = request.vars["upload_key"]\n title = request.vars["title"]\n form = SQLFORM(db.image, fields = [\'title\', \'file\', \'newimage\', \'description\',\'upload_key\'])\n if form.accepts(request.vars):\n keys = db().select(db.upload_key.ALL)\n for key in keys:\n if key.upload_key == upload_key:\n db(db.image.upload_key==upload_key).update(creator = key.user)\n query=(db.upload_key.upload_key==upload_key)\n db(query).delete()\n else:\n import logging\n logging.error("form not accepted")\n raise HTTP(400,"failed to upload")\n return dict(form=form)\n\n\n@service.xmlrpc\ndef login_remote(username,password):\n logged_in = auth.login_bare(username,password)\n if logged_in:\n db.upload_key.insert(user=username)\n keys = db().select(db.upload_key.ALL)\n for key in keys:\n if key.user == username:\n return str(key.upload_key)\n return False\n else: return False"""\n\n\ndef remove_as_favorite():\n if "id" in request.vars.keys(): image_id = int(request.vars["id"])\n else: redirect(URL(r=request,f=\'index\'))\n if auth.is_logged_in():\n images = db().select(db.image.ALL)\n for image in images:\n if image.id == image_id:\n favorite_users = pickle.loads(image.favorite_users)\n if auth.user.username in favorite_users:\n favorite_users.remove(auth.user.username)\n db(db.image.id==image_id).update(favorite_users = pickle.dumps(favorite_users))\n users = db().select(db.auth_user.ALL)\n for user in users:\n if user.username == auth.user.username:\n favorites = pickle.loads(user.favorites)\n if image_id in favorites:\n favorites.remove(image_id)\n db(db.auth_user.username==auth.user.username).update(favorites = pickle.dumps(favorites))\n redirect(URL(r=request, f=\'image?image=\'+str(image_id)))\n\n\ndef add_as_favorite():\n if "id" in request.vars.keys(): image_id = int(request.vars["id"])\n else: redirect(URL(r=request,f=\'index\'))\n if auth.is_logged_in():\n images = db().select(db.image.ALL)\n for image in images:\n if image.id == image_id:\n favorite_users = pickle.loads(image.favorite_users)\n if auth.user.username not in favorite_users:\n favorite_users.append(auth.user.username)\n db(db.image.id==image_id).update(favorite_users = pickle.dumps(favorite_users))\n users = db().select(db.auth_user.ALL)\n for user in users:\n if user.username == auth.user.username:\n favorites = pickle.loads(user.favorites)\n if image_id not in favorites:\n favorites.append(image_id)\n db(db.auth_user.username==auth.user.username).update(favorites = pickle.dumps(favorites))\n redirect(URL(r=request, f=\'image?image=\'+str(image_id)))\n\n\ndef image():\n images = db().select(db.image.ALL)\n image_id = int(request.vars["image"])\n for image in images:\n if image.id == image_id:\n real_image = image\n title=real_image.title\n if real_image == None:\n redirect(URL(r=request, f=\'index\'))\n if auth.is_logged_in():\n if auth.user.username != real_image.creator:\n try:\n views = int(real_image.views) + 1\n except: views = 1\n db(db.image.title==real_image.title).update(views = views)\n users = db().select(db.auth_user.ALL)\n favorite_users = pickle.loads(real_image.favorite_users)\n form = SQLFORM(db.comment, fields = [\'body\'])\n if form.accepts(request.vars, session):\n db(db.comment.id==form.vars.id).update(author = auth.user.username)\n db(db.comment.id==form.vars.id).update(image_id = real_image.id)\n comments=db().select(db.comment.ALL)\n image_comments = []\n for comment in comments:\n if comment.image_id == real_image.id:\n image_comments.append(comment)\n return dict(image = real_image, form= form,comments=image_comments,favorites = favorite_users)\n\n \ndef testimage():\n\treturn db(db.image.title=="hellotest")\n\n\ndef user(): \n return dict(form=auth())\n\n@auth.requires_membership(\'admin\')\ndef delete_comment():\n comment_id = int(request.vars["id"])\n if "image" in request.vars.keys():\n image_id = request.vars["image"]\n else:image_id = None\n if auth.is_logged_in():\n if auth.has_membership(\'admin\'):\n query=(db.comment.id==comment_id)\n db(query).delete()\n if image_id != None:\n redirect(URL(r=request, f=\'image?image=\'+image_id))\n else:\n redirect(URL(r=request, f=\'index\'))\n\ndef delete_image():\n images = db().select(db.image.ALL)\n image_id = int(request.vars["id"])\n for image in images:\n if image.id == image_id:\n real_image = image\n if auth.is_logged_in():\n if auth.user.username == real_image.creator or auth.has_membership(\'admin\'):\n query=(db.image.id==real_image.id)\n db(query).delete()\n redirect(URL(r=request, f=\'index\')) \n\n\ndef download():\n return response.download(request, db)\n\n\ndef call(): return service()\n\nresponse._vars=response._caller(index)\n'
+p6
+sS'traceback'
+p7
+S'Traceback (most recent call last):\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/gluon/restricted.py", line 178, in restricted\n exec ccode in environment\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py", line 411, in <module>\n if image_id != None:\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/gluon/globals.py", line 96, in <lambda>\n self._caller = lambda f: f()\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py", line 63, in index\n else: page = 0\n File "/home/jboisture/Desktop/google_appengine/turtleartsite/applications/turtlesite/controllers/default.py", line 63, in index\n else: page = 0\n File "/usr/lib/python2.6/bdb.py", line 46, in trace_dispatch\n return self.dispatch_line(frame)\n File "/usr/lib/python2.6/bdb.py", line 65, in dispatch_line\n if self.quitting: raise BdbQuit\nBdbQuit\n'
+p8
+s. \ No newline at end of file
diff --git a/models/db.py b/models/db.py
index 6ce4922..a7c7732 100644
--- a/models/db.py
+++ b/models/db.py
@@ -1,22 +1,53 @@
+import uuid
+import time
+import pickle
+
+class RESIZE:
+ def __init__(self,nx=250,ny=32,error_message='not an image'):
+ (self.nx,self.ny,self.error_message)=(nx,ny,error_message)
+ def __call__(self,value):
+ import google.appengine.api as api
+ import cStringIO
+ try:
+ avatar = api.images.resize(value.file.read(), self.nx)
+ value.file = cStringIO.StringIO(avatar)
+ return (value,None)
+ except:
+ return (value,self.error_message)
+
+
if request.env.web2py_runtime_gae:
db = DAL('gae')
session.connect(request,response,db=db)
else:db = DAL("sqlite://storage.db")
+db.define_table('upload_key',
+ Field('upload_key', length=64, default=uuid.uuid4()),
+ Field('user'))
+
db.define_table('image',
Field('file', 'upload', requires=[IS_NOT_EMPTY(error_message="Please select a file to upload"), IS_UPLOAD_FILENAME(extension='ta', error_message="Must be a Turtle Art file")]),
- Field('title', requires=[IS_NOT_EMPTY(error_message="You must include a title"), IS_NOT_IN_DB(db, 'image.title', error_message="Title is already taken")]),
+ Field('title', requires=[IS_NOT_EMPTY(error_message="You must include a title")]),
Field('image_id'),
Field('creator', requires=IS_NOT_EMPTY(error_message="You must include your name")),
Field('description', 'text'),
- Field('views'),
- Field('newimage', 'upload', requires=[IS_NOT_EMPTY(error_message="Please select a image to upload"), IS_UPLOAD_FILENAME(extension='png', error_message="Must be a PNG image")]))
+ Field('views',default = 0),
+ Field('newimage', 'upload', requires=[IS_NOT_EMPTY(error_message="Please select a image to upload"), IS_UPLOAD_FILENAME(extension='png', error_message="Must be a PNG image")]),
+ Field('avatar',default = None),
+ Field('small_image','upload',requires=RESIZE()),
+ Field('favorite_users','text',default=pickle.dumps([]), writable=False, readable=False),
+ Field('upload_key', requires= [IS_NOT_IN_DB(db, 'image.upload_key'), IS_IN_DB(db, 'upload_key.upload_key', error_message="key not in database")]),
+ Field('Submit_Time', default = time.time()))
+
+
+
db.define_table('comment',
Field('image_id', db.image),
Field('author'),
Field('body', 'text'))
+
from gluon.tools import Auth
auth = Auth(globals(),db)
auth_table = db.define_table(
@@ -27,7 +58,11 @@ auth_table = db.define_table(
readable=False, label='Password'),
Field('registration_key', length=128, default= "",
writable=False, readable=False),
- Field('reset_password_key', length=128, default="",readable=False))
+ Field('favorites','text',default=pickle.dumps([]), writable=False, readable=False),
+ Field('requests','text',default=pickle.dumps([]), writable=False, readable=False),
+ Field('friends','text',default=pickle.dumps([]), writable=False, readable=False),
+ Field('avatar', default = None,writable=False,readable=False),
+ Field('reset_password_key', length=128, default="",readable=False, writable=False))
db.comment.image_id.requires = IS_IN_DB(db, db.image.image_id, '%(title)s')
db.comment.author.requires = IS_NOT_EMPTY()
diff --git a/sessions/127-0-0-1-540fd07d-c80c-470e-908f-a8669bd5cee9 b/sessions/127-0-0-1-540fd07d-c80c-470e-908f-a8669bd5cee9
new file mode 100644
index 0000000..b3d9e6e
--- /dev/null
+++ b/sessions/127-0-0-1-540fd07d-c80c-470e-908f-a8669bd5cee9
@@ -0,0 +1,4 @@
+(dp1
+S'auth'
+p2
+Ns. \ No newline at end of file
diff --git a/sessions/127-0-0-1-e7f60399-646e-42e9-a642-b5332e33f7e1 b/sessions/127-0-0-1-e7f60399-646e-42e9-a642-b5332e33f7e1
new file mode 100644
index 0000000..44e977f
--- /dev/null
+++ b/sessions/127-0-0-1-e7f60399-646e-42e9-a642-b5332e33f7e1
@@ -0,0 +1,85 @@
+(dp1
+S'flash'
+p2
+NsS'auth'
+p3
+ccopy_reg
+_reconstructor
+p4
+(cgluon.storage
+Storage
+p5
+c__builtin__
+dict
+p6
+(dp7
+S'expiration'
+p8
+I3600
+sS'last_visit'
+p9
+cdatetime
+datetime
+p10
+(S'\x07\xda\x07\x16\x11\x19\x08\x068\xa1'
+tRp11
+sS'user'
+p12
+g4
+(g5
+g6
+(dp13
+S'username'
+p14
+S'jboisture'
+p15
+sS'reset_password_key'
+p16
+S''
+sS'registration_key'
+p17
+S''
+sS'password'
+p18
+S'098f6bcd4621d373cade4e832627b4f6'
+p19
+sS'email'
+p20
+S'jamieboisture@gmail.com'
+p21
+sS'id'
+p22
+I1
+stRp23
+(dp24
+g14
+g15
+sg16
+S''
+sg17
+S''
+sg18
+g19
+sg20
+g21
+sg22
+I1
+sbstRp25
+(dp26
+g8
+I3600
+sg9
+g11
+sg12
+g23
+sbsS'_formkey[login]'
+p27
+S'5bd430d4-6c03-4f06-a920-ac3b3d2e814e'
+p28
+sS'_formkey[register]'
+p29
+S'fe152f9b-2d6d-440a-a46e-e97683d1a1f4'
+p30
+s.7683d1a1f4'
+p31
+s. \ No newline at end of file
diff --git a/views/default/_base.html b/views/default/_base.html
index a277d77..061186f 100644
--- a/views/default/_base.html
+++ b/views/default/_base.html
@@ -7,10 +7,16 @@
<div id="header">
<h1><a href="index.html" >Home</a></h1>
<ul>
+ {{import pickle}}
{{if auth.is_logged_in():}}
- <li><a href={{="index?profile="+auth.user.username}}>{{=auth.user.username}}</a>: </li>
- <li><a href="user/logout">Log Out</li>
- <li><a href="upload.html" >New Image</a></li>
+ <li><a href={{="profile?profile="+auth.user.username}}>{{=auth.user.username}}</a>: </li>
+ {{if auth.has_membership("admin"):}}
+ <li><a href="admin">Admin Acount</a><li>
+ {{pass}}
+ {{if num_requests > 0:}}
+ <li><a href = "requests">{{=str(num_requests)+" Request(s)"}}</a></li>
+ {{pass}}
+ <li><a href="user/logout">Log Out</a></li>
{{pass}}
{{if not auth.is_logged_in():}}
<li><a href="user.html">log in</a></li>
diff --git a/views/default/admin.html b/views/default/admin.html
new file mode 100644
index 0000000..feb1924
--- /dev/null
+++ b/views/default/admin.html
@@ -0,0 +1,33 @@
+{{extend 'default/_base.html'}}
+<br><br>
+<center>
+<table><tr>
+<td>Username</td>
+<td>Email</td>
+<td>Delete User</td>
+<td>Admin Status</td>
+{{for user in users:}}
+ <tr>
+ <td><a href={{= 'profile?profile=' +str(user.username)}}>{{=user.username}}</a></td>
+ <td>{{=user.email}}</td>
+ <td><a href={{="delete_user?user="+user.username+";page="+str(page)}}>Delete</a></td>
+ {{if auth.has_membership('admin', user.id):}}
+ <td>Admin (<a href={{="remove_admin?user="+str(user.id)+";page="+str(page)}}>Remove Admin</a>)</td>
+ {{pass}}
+ {{if not auth.has_membership('admin',user.id):}}
+ <td><a href={{='make_admin?user='+str(user.id)+';page='+str(page)}}>Make Admin</a></td>
+ {{pass}}
+ </tr>
+ {{pass}}
+</table>
+<ul id="navlist">
+{{for count in range(pages):}}
+ {{if count+1 == page:}}
+ <li>{{=str(page)}}</li>
+ {{pass}}
+ {{if count+1 != page:}}
+ <li><a href = {{="admin.html?page="+str(count+1)}}>{{ = str(count+1)}}</a></li>
+ {{pass}}
+ {{pass}}
+</ul>
+</center>
diff --git a/views/default/delete_image_confirmation.html b/views/default/delete_image_confirmation.html
new file mode 100644
index 0000000..1573d2b
--- /dev/null
+++ b/views/default/delete_image_confirmation.html
@@ -0,0 +1,5 @@
+{{extend 'default/_base.html'}}
+<h1>Are you sure you want to delete this image?</h1>
+<p>
+<a href={{="delete_image?id="+str(image.id)}}>yes delete image</a>
+<a href={{="image?image="+str(image.id)}}>no don't delete image</a></p>
diff --git a/views/default/friends.html b/views/default/friends.html
new file mode 100644
index 0000000..4dacbaa
--- /dev/null
+++ b/views/default/friends.html
@@ -0,0 +1,27 @@
+{{extend 'default/_base.html'}}
+{{=username+"'s Friends List:"}}
+<center>
+<table>
+{{for user in friends:}}
+ <tr>
+ <td>{{=user.username}}</td>
+ <td><a href={{= 'profile?profile=' +str(user.username)}}>view profile</a></td>
+ {{if auth.is_logged_in():}}
+ {{if username == auth.user.username:}}
+ <td><a href={{= 'remove_friends?user=' +str(user.username)}}>remove friend</a></td>
+ {{pass}}
+ {{pass}}
+ </tr>
+ {{pass}}
+</table>
+<ul id="navlist">
+{{for count in range(pages):}}
+ {{if count+1 == page:}}
+ <li>{{=str(page)}}</li>
+ {{pass}}
+ {{if count+1 != page:}}
+ <li><a href = {{="admin.html?page="+str(count+1)}}>{{ = str(count+1)}}</a></li>
+ {{pass}}
+ {{pass}}
+</ul>
+</center>
diff --git a/views/default/image.html b/views/default/image.html
index 7af062f..223ed4d 100644
--- a/views/default/image.html
+++ b/views/default/image.html
@@ -3,11 +3,25 @@
<img width="1000px"src="{{=URL(r=request, f='download', args=image.newimage)}}">
<br>
{{if auth.is_logged_in():}}
- {{if image.creator == auth.user.username:}}
- <a href={{="delete?id="+str(image.id)}}>delete image</a>
+ {{if auth.user.username in favorites:}}
+ <a href={{="remove_as_favorite?id="+str(image.id)}}>remove from favorites</a>
+ {{pass}}
+ {{if auth.user.username not in favorites:}}
+ <a href={{="add_as_favorite?id="+str(image.id)}}>add to favorites</a>
+ {{pass}}
+ <br><br>
+ {{if image.creator == auth.user.username or auth.has_membership('admin'):}}
+ <a href={{="delete_image_confirmation?id="+str(image.id)}}>delete image</a>
{{pass}}
+ <!--<br><br>
+ {{if image.creator == auth.user.username:}}
+ {{pass}}
+ <a href={{="make_avatar?image="+str(image.id)}}>make this your avatar</a>>-->
{{pass}}
-<p>{{ = "author: "}}<a href={{= "index?profile=" +str(image.creator)}}>{{=image.creator}} </a></p>
+{{if len(favorites) > 0:}}
+ <p>{{ = "this is in " + str(len(favorites)) + " users favorite pictures"}}</p>
+ {{pass}}
+<p>{{ = "author: "}}<a href={{= "profile?profile=" +str(image.creator)}}>{{=image.creator}} </a></p>
<a href="{{=URL(r=request, f='download', args=image.file)}}"> Download TA file</a>
<p>{{ = "description: " + str(image.description)}}</p>
<p>views: {{=image.views}}</p>
@@ -15,6 +29,11 @@
{{for comment in comments:}}
<a href={{= "profile?user=" +str(comment.author)}}>{{=comment.author}} </a>
{{=": " + comment.body}}
+ {{if auth.is_logged_in():}}
+ {{if image.creator == auth.user.username or auth.has_membership('admin'):}}
+ ( <a href={{="delete_comment?id="+str(comment.id)+";image="+str(image.id)}}>delete comment</a> )
+ {{pass}}
+ {{pass}}
<br>
<br>
{{pass}}
diff --git a/views/default/index.html b/views/default/index.html
index da1f19c..455f564 100644
--- a/views/default/index.html
+++ b/views/default/index.html
@@ -1,6 +1,11 @@
{{extend 'default/_base.html'}}
{{if profile != None:}}
- <h1>{{=profile+ "'s Submissions"}}</h1>
+ {{if not show_favorites:}}
+ <h1>{{=profile.username+ "'s Submissions:"}}</h1>
+ {{pass}}
+ {{if show_favorites:}}
+ <h1>{{=profile.username+ "'s Favorites:"}}</h1>
+ {{pass}}
{{pass}}
{{if profile == None:}}
<h1>Submissions</h1>
@@ -19,10 +24,10 @@
{{if profile != None:}}
{{if sort == "newest":}}
{{=sort}}
- <a href={{="index.html?sort=views;profile="+profile}}> views</a></p>
+ <a href={{="index.html?sort=views;profile="+profile.username+";favorites"+str(show_favorites)}}> views</a></p>
{{pass}}
{{if sort == "views":}}
- <a href={{="index.html?profile="+profile}}> newest</a>
+ <a href={{="index.html?profile="+profile.username+";favorites"+str(show_favorites)}}> newest</a>
{{=sort}}</p>
{{pass}}
{{pass}}
@@ -30,9 +35,14 @@
<table><tr>
{{for image in row:}}
<td><a href = {{="image.html?image="+str(image.id)}}>
- <img width="250px" src="{{=URL(r=request, f='download', args=image.newimage)}}"
+ <img src="{{=URL(r=request, f='download', args=image.small_image)}}"
onclick="ajax('ajaxwiki_onclick',['text'],'html')"/>
- <br><center>{{=image.title}}</center></a></td>
+ {{if len(image.title)>30:}}
+ <br><center>{{=image.title[:27]+"..."}}</center></a></td>
+ {{pass}}
+ {{if len(image.title)<=30:}}
+ <br><center>{{=image.title}}</center></a></td>
+ {{pass}}
{{pass}}
</tr></table>
{{pass}}
@@ -44,10 +54,10 @@
{{pass}}
{{if count+1 != page:}}
{{if profile == None:}}
- <li><a href = {{="index.html?page="+str(count+1)+";sort="+sort}}>{{ = str(count+1)}}</a></li>
+ <li><a href = {{="index.html?page="+str(count+1)+";sort="+sort+";favorites"+str(show_favorites)}}>{{ = str(count+1)}}</a></li>
{{pass}}
{{if profile != None:}}
- <li><a href = {{="index.html?page="+str(count+1)+";sort="+sort}}+";profile="+profile>{{ = str(count+1)}}</a></li>
+ <li><a href = {{="index.html?page="+str(count+1)+";sort="+sort+";profile="+profile.username+";favorites"+str(show_favorites)}}>{{ = str(count+1)}}</a></li>
{{pass}}
{{pass}}
{{pass}}
diff --git a/views/default/profile.html b/views/default/profile.html
new file mode 100644
index 0000000..ed442c0
--- /dev/null
+++ b/views/default/profile.html
@@ -0,0 +1,42 @@
+{{extend 'default/_base.html'}}
+{{if avatar != None:}}
+ <img src="{{=URL(r=request,f='download',args=avatar.avatar)}}"/>
+ {{pass}}
+<h1>{{=profile.username + "'s profile"}}</h1>
+{{if auth.is_logged_in():}}
+ {{if profile.username != auth.user.username:}}
+ {{if ("friend",auth.user.username) in requests:}}
+ <p>friend request pending</p>
+ {{pass}}
+ {{if ("friend",auth.user.username) not in requests and auth.user.username not in friends:}}
+ <p><a href={{="add_as_friend?user="+profile.username}}>Add as friend</a></p>
+ {{pass}}
+ <p>{{=profile.username+" has "+str(len(friends))+" friend(s) ("}}<a href={{="friends?user="+profile.username}}>view all</a>)</p>
+ {{pass}}
+ {{if profile.username == auth.user.username:}}
+ <p>{{="You have "+str(len(friends))+" friend(s) ("}}<a href={{="friends?user="+profile.username}}>view all</a>)</p>
+ {{pass}}
+ {{pass}}
+
+<p>{{=profile.username + "'s submissions ("}}<a href={{="index?profile="+profile.username}}>view all</a>):</p>
+{{for row in images:}}
+ <table><tr>
+ {{for image in row:}}
+ <td><a href = {{="image.html?image="+str(image.id)}}>
+ <img src="{{=URL(r=request, f='download', args=image.small_image)}}"
+ onclick="ajax('ajaxwiki_onclick',['text'],'html')"/>
+ <br><center>{{=image.title}}</center></a></td>
+ {{pass}}
+ </tr></table>
+ {{pass}}
+<p>{{=profile.username + "'s favorites("}}<a href={{="index?profile="+profile.username+";favorites=True"}}>view all</a>):</p>
+{{for row in favorites:}}
+ <table><tr>
+ {{for image in row:}}
+ <td><a href = {{="image.html?image="+str(image.id)}}>
+ <img width="250px" src="{{=URL(r=request, f='download', args=image.small_image)}}"
+ onclick="ajax('ajaxwiki_onclick',['text'],'html')"/>
+ <br><center>{{=image.title}}</center></a></td>
+ {{pass}}
+ </tr></table>
+ {{pass}}
diff --git a/views/default/requests.html b/views/default/requests.html
new file mode 100644
index 0000000..6bd5c6c
--- /dev/null
+++ b/views/default/requests.html
@@ -0,0 +1,13 @@
+{{extend 'default/_base.html'}}
+{{if len(requests)==0:}}
+ <p>There are no friend requests currently</p>
+ {{pass}}
+<br>
+{{for request in requests:}}
+ {{if request[0] == 'friend':}}
+ {{=request[1] + " wants to be your friend:"}}
+ <a href={{="respond_to_request?response=True;user="+request[1]}}>Confirm Friend</a>
+ <a href={{="respond_to_request?response=False;user="+request[1]}}>Decline Friend</a>
+ {{pass}}
+ {{pass}}
+