diff options
author | James Boisture <jboisture@jboisture-laptop.(none)> | 2010-07-29 18:05:01 (GMT) |
---|---|---|
committer | James Boisture <jboisture@jboisture-laptop.(none)> | 2010-07-29 18:05:01 (GMT) |
commit | 09e3eea7a72e9e2300b639f0356100c7b83b5dfb (patch) | |
tree | d3608997517daa0ae5f98e5bf5ba95c8e29520b9 | |
parent | b817158f554f7b3342ecfe3ce24d04e91abed3c3 (diff) |
made a lot of major changes because it has been a long time since I commited last. There are many new features. Also added app.yaml file which should be placed in the web2py directly in order for the URL to work properly.
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}} + |