mirror of
https://github.com/golang/go
synced 2024-11-25 11:57:58 -07:00
152 lines
5.0 KiB
Python
152 lines
5.0 KiB
Python
|
# Copyright 2010 The Go Authors. All rights reserved.
|
||
|
# Use of this source code is governed by a BSD-style
|
||
|
# license that can be found in the LICENSE file.
|
||
|
|
||
|
from google.appengine.api import mail
|
||
|
from google.appengine.api import memcache
|
||
|
from google.appengine.api import users
|
||
|
from google.appengine.ext import db
|
||
|
from google.appengine.ext import webapp
|
||
|
from google.appengine.ext.webapp import template
|
||
|
from google.appengine.ext.webapp.util import run_wsgi_app
|
||
|
import os
|
||
|
import sets
|
||
|
|
||
|
# local imports
|
||
|
import toutf8
|
||
|
import const
|
||
|
|
||
|
template.register_template_library('toutf8')
|
||
|
|
||
|
class Project(db.Model):
|
||
|
name = db.StringProperty(indexed=True)
|
||
|
descr = db.StringProperty()
|
||
|
web_url = db.StringProperty()
|
||
|
category = db.StringProperty(indexed=True)
|
||
|
tags = db.ListProperty(str)
|
||
|
approved = db.BooleanProperty(indexed=True)
|
||
|
|
||
|
CacheTimeout = 3600
|
||
|
|
||
|
class ProjectPage(webapp.RequestHandler):
|
||
|
|
||
|
def get(self):
|
||
|
admin = users.is_current_user_admin()
|
||
|
if self.request.path == "/project/login":
|
||
|
self.redirect(users.create_login_url("/project"))
|
||
|
elif self.request.path == "/project/edit" and admin:
|
||
|
self.edit()
|
||
|
else:
|
||
|
self.list()
|
||
|
|
||
|
def post(self):
|
||
|
if self.request.path == "/project/edit":
|
||
|
self.edit(True)
|
||
|
else:
|
||
|
data = dict(map(lambda x: (x, self.request.get(x)), ["name","descr","web_url"]))
|
||
|
if reduce(lambda x, y: x or not y, data.values(), False):
|
||
|
data["submitMsg"] = "You must complete all the fields."
|
||
|
self.list(data)
|
||
|
return
|
||
|
p = Project.get_by_key_name("proj-"+data["name"])
|
||
|
if p is not None:
|
||
|
data["submitMsg"] = "A project by this name already exists."
|
||
|
self.list(data)
|
||
|
return
|
||
|
p = Project(key_name="proj-"+data["name"], **data)
|
||
|
p.put()
|
||
|
|
||
|
path = os.path.join(os.path.dirname(__file__), 'project-notify.txt')
|
||
|
mail.send_mail(
|
||
|
sender=const.mail_from,
|
||
|
to=const.mail_submit_to,
|
||
|
subject=const.mail_submit_subject,
|
||
|
body=template.render(path, {'project': p}))
|
||
|
|
||
|
self.list({"submitMsg": "Your project has been submitted."})
|
||
|
|
||
|
def list(self, additional_data={}):
|
||
|
cache_key = 'view-project-data'
|
||
|
tag = self.request.get('tag', None)
|
||
|
if tag:
|
||
|
cache_key += '-'+tag
|
||
|
data = memcache.get(cache_key)
|
||
|
admin = users.is_current_user_admin()
|
||
|
if admin or not data:
|
||
|
projects = Project.all().order('category').order('name')
|
||
|
if not admin:
|
||
|
projects = projects.filter('approved =', True)
|
||
|
projects = list(projects)
|
||
|
|
||
|
tags = sets.Set()
|
||
|
for p in projects:
|
||
|
for t in p.tags:
|
||
|
tags.add(t)
|
||
|
|
||
|
if tag:
|
||
|
projects = filter(lambda x: tag in x.tags, projects)
|
||
|
|
||
|
data = {}
|
||
|
data['tag'] = tag
|
||
|
data['tags'] = tags
|
||
|
data['projects'] = projects
|
||
|
data['admin']= admin
|
||
|
if not admin:
|
||
|
memcache.set(cache_key, data, time=CacheTimeout)
|
||
|
|
||
|
for k, v in additional_data.items():
|
||
|
data[k] = v
|
||
|
|
||
|
self.response.headers['Content-Type'] = 'text/html; charset=utf-8'
|
||
|
path = os.path.join(os.path.dirname(__file__), 'project.html')
|
||
|
self.response.out.write(template.render(path, data))
|
||
|
|
||
|
def edit(self, save=False):
|
||
|
if save:
|
||
|
name = self.request.get("orig_name")
|
||
|
else:
|
||
|
name = self.request.get("name")
|
||
|
|
||
|
p = Project.get_by_key_name("proj-"+name)
|
||
|
if not p:
|
||
|
self.response.out.write("Couldn't find that Project.")
|
||
|
return
|
||
|
|
||
|
if save:
|
||
|
if self.request.get("do") == "Delete":
|
||
|
p.delete()
|
||
|
else:
|
||
|
for f in ['name', 'descr', 'web_url', 'category']:
|
||
|
setattr(p, f, self.request.get(f, None))
|
||
|
p.approved = self.request.get("approved") == "1"
|
||
|
p.tags = filter(lambda x: x, self.request.get("tags", "").split(","))
|
||
|
p.put()
|
||
|
memcache.delete('view-project-data')
|
||
|
self.redirect('/project')
|
||
|
return
|
||
|
|
||
|
# get all project categories and tags
|
||
|
cats, tags = sets.Set(), sets.Set()
|
||
|
for r in Project.all():
|
||
|
cats.add(r.category)
|
||
|
for t in r.tags:
|
||
|
tags.add(t)
|
||
|
|
||
|
self.response.headers['Content-Type'] = 'text/html; charset=utf-8'
|
||
|
path = os.path.join(os.path.dirname(__file__), 'project-edit.html')
|
||
|
self.response.out.write(template.render(path, {
|
||
|
"taglist": tags, "catlist": cats, "p": p, "tags": ",".join(p.tags) }))
|
||
|
|
||
|
def redirect(self, url):
|
||
|
self.response.set_status(302)
|
||
|
self.response.headers.add_header("Location", url)
|
||
|
|
||
|
def main():
|
||
|
app = webapp.WSGIApplication([
|
||
|
('/.*', ProjectPage),
|
||
|
], debug=True)
|
||
|
run_wsgi_app(app)
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|