Created
November 12, 2012 13:53
-
-
Save ShenXuGongZi/4059511 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python | |
| # coding=utf-8 | |
| import os | |
| import base64 | |
| import re | |
| import time | |
| import datetime | |
| import hashlib | |
| import httplib | |
| import string | |
| import pickle | |
| from google.appengine.ext import webapp | |
| from google.appengine.api import memcache | |
| from google.appengine.api import images | |
| from google.appengine.ext import db | |
| from google.appengine.ext.webapp import util | |
| from google.appengine.ext.webapp import template | |
| from v2ex.babel import Member | |
| from v2ex.babel import Avatar | |
| from v2ex.babel import Counter | |
| from v2ex.babel.security import * | |
| from v2ex.babel.ua import * | |
| from v2ex.babel.da import * | |
| from v2ex.babel.l10n import * | |
| from v2ex.babel.ext.cookies import Cookies | |
| from v2ex.babel.ext.sessions import Session | |
| from v2ex.babel import SYSTEM_VERSION | |
| import config | |
| template.register_template_library('v2ex.templatetags.filters') | |
| class MemberHandler(webapp.RequestHandler): | |
| def get(self, member_username): | |
| site = GetSite() | |
| browser = detect(self.request) | |
| self.session = Session() | |
| template_values = {} | |
| template_values['site'] = site | |
| template_values['system_version'] = SYSTEM_VERSION | |
| member = CheckAuth(self) | |
| template_values['member'] = member | |
| template_values['show_extra_options'] = False | |
| if member: | |
| if member.num == 1: | |
| template_values['show_extra_options'] = True | |
| l10n = GetMessages(self, member, site) | |
| template_values['l10n'] = l10n | |
| one = False | |
| one = GetMemberByUsername(member_username) | |
| if one is not False: | |
| if one.followers_count is None: | |
| one.followers_count = 0 | |
| template_values['one'] = one | |
| template_values['page_title'] = site.title + u' › ' + one.username | |
| template_values['canonical'] = 'http://' + site.domain + '/member/' + one.username | |
| if one is not False: | |
| q2 = db.GqlQuery("SELECT * FROM Topic WHERE member_num = :1 ORDER BY created DESC LIMIT 10", one.num) | |
| template_values['topics'] = q2 | |
| replies = memcache.get('member::' + str(one.num) + '::participated') | |
| if replies is None: | |
| q3 = db.GqlQuery("SELECT * FROM Reply WHERE member_num = :1 ORDER BY created DESC LIMIT 100", one.num) | |
| ids = [] | |
| replies = [] | |
| i = 0 | |
| for reply in q3: | |
| if reply.topic.num not in ids: | |
| i = i + 1 | |
| if i > 10: | |
| break | |
| replies.append(reply) | |
| ids.append(reply.topic.num) | |
| if len(replies) > 0: | |
| memcache.set('member::' + str(one.num) + '::participated', replies, 7200) | |
| if len(replies) > 0: | |
| template_values['replies'] = replies | |
| template_values['show_block'] = False | |
| template_values['show_follow'] = False | |
| template_values['favorited'] = False | |
| if one and member: | |
| if one.num != member.num: | |
| template_values['show_follow'] = True | |
| template_values['show_block'] = True | |
| try: | |
| blocked = pickle.loads(member.blocked.encode('utf-8')) | |
| except: | |
| blocked = [] | |
| if one.num in blocked: | |
| template_values['one_is_blocked'] = True | |
| else: | |
| template_values['one_is_blocked'] = False | |
| if member.hasFavorited(one): | |
| template_values['favorited'] = True | |
| else: | |
| template_values['favorited'] = False | |
| if 'message' in self.session: | |
| template_values['message'] = self.session['message'] | |
| del self.session['message'] | |
| if one is not False: | |
| if browser['ios']: | |
| path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile', 'member_home.html') | |
| else: | |
| path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop', 'member_home.html') | |
| else: | |
| if browser['ios']: | |
| path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile', 'member_not_found.html') | |
| else: | |
| path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop', 'member_not_found.html') | |
| output = template.render(path, template_values) | |
| self.response.out.write(output) | |
| class MemberApiHandler(webapp.RequestHandler): | |
| def get(self, member_username): | |
| site = GetSite() | |
| one = GetMemberByUsername(member_username) | |
| if one: | |
| if one.avatar_mini_url: | |
| if (one.avatar_mini_url[0:1] == '/'): | |
| one.avatar_mini_url = 'http://' + site.domain + one.avatar_mini_url | |
| one.avatar_normal_url = 'http://' + site.domain + one.avatar_normal_url | |
| one.avatar_large_url = 'http://' + site.domain + one.avatar_large_url | |
| template_values = {} | |
| template_values['site'] = site | |
| template_values['one'] = one | |
| path = os.path.join(os.path.dirname(__file__), 'tpl', 'api', 'member.json') | |
| self.response.headers['Content-type'] = 'application/json;charset=UTF-8' | |
| output = template.render(path, template_values) | |
| self.response.out.write(output) | |
| else: | |
| self.error(404) | |
| class SettingsHandler(webapp.RequestHandler): | |
| def get(self): | |
| site = GetSite() | |
| browser = detect(self.request) | |
| self.session = Session() | |
| template_values = {} | |
| template_values['site'] = site | |
| template_values['system_version'] = SYSTEM_VERSION | |
| member = CheckAuth(self) | |
| l10n = GetMessages(self, member, site) | |
| template_values['l10n'] = l10n | |
| template_values['page_title'] = site.title + u' › ' + l10n.settings.decode('utf-8') | |
| if (member): | |
| template_values['member'] = member | |
| template_values['member_username'] = member.username | |
| template_values['member_email'] = member.email | |
| if (member.website == None): | |
| member.website = '' | |
| template_values['member_website'] = member.website | |
| if (member.twitter == None): | |
| member.twitter = '' | |
| template_values['member_twitter'] = member.twitter | |
| if (member.location == None): | |
| member.location = '' | |
| template_values['member_location'] = member.location | |
| if (member.tagline == None): | |
| member.tagline = '' | |
| template_values['member_tagline'] = member.tagline | |
| if (member.bio == None): | |
| member.bio = '' | |
| template_values['member_bio'] = member.bio | |
| if (member.l10n == None): | |
| member.l10n = 'en' | |
| template_values['member_l10n'] = member.l10n | |
| s = GetLanguageSelect(member.l10n) | |
| template_values['s'] = s | |
| if member.twitter_sync == 1: | |
| template_values['member_twitter_sync'] = 1 | |
| if 'message' in self.session: | |
| message = self.session['message'] | |
| del self.session['message'] | |
| else: | |
| message = None | |
| template_values['message'] = message | |
| try: | |
| blocked = pickle.loads(member.blocked.encode('utf-8')) | |
| except: | |
| blocked = [] | |
| template_values['member_stats_blocks'] = len(blocked) | |
| member_topics = memcache.get('Member_' + str(member.num) + '_topics_count') | |
| if member_topics is None: | |
| q = db.GqlQuery("SELECT __key__ FROM Topic WHERE member = :1", member) | |
| member_topics = q.count() | |
| memcache.set('Member_' + str(member.num) + '_topics_count', member_topics, 3600 * 4) | |
| template_values['member_stats_topics'] = member_topics | |
| member_replies = memcache.get('Member_' + str(member.num) + '_replies_count') | |
| if member_replies is None: | |
| replies = Reply.all() | |
| replies.filter("member = ", member) | |
| member_replies = replies.count() | |
| memcache.set('Member_' + str(member.num) + '_replies_count', member_replies, 3600 * 4) | |
| template_values['member_stats_replies'] = member_replies | |
| if browser['ios']: | |
| path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile', 'member_settings.html') | |
| else: | |
| path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop', 'member_settings.html') | |
| output = template.render(path, template_values) | |
| self.response.out.write(output) | |
| else: | |
| self.redirect('/signin') | |
| def post(self): | |
| self.session = Session() | |
| site = GetSite() | |
| browser = detect(self.request) | |
| template_values = {} | |
| template_values['system_version'] = SYSTEM_VERSION | |
| errors = 0 | |
| member = CheckAuth(self) | |
| l10n = GetMessages(self, member, site) | |
| template_values['l10n'] = l10n | |
| template_values['page_title'] = site.title + u' › ' + l10n.settings.decode('utf-8') | |
| if (member): | |
| template_values['member'] = member | |
| template_values['member_username'] = member.username | |
| template_values['member_email'] = member.email | |
| template_values['member_website'] = member.website | |
| template_values['member_twitter'] = member.twitter | |
| # Verification: password | |
| password_error = 0 | |
| password_update = False | |
| password_error_messages = ['', | |
| '新密码长度不能超过 32 个字符', | |
| '请输入当前密码', | |
| '当前密码不正确' | |
| ] | |
| password_new = self.request.get('password_new').strip() | |
| if (len(password_new) > 0): | |
| password_update = True | |
| if (len(password_new) > 32): | |
| password_error = 1 | |
| else: | |
| password_current = self.request.get('password_current').strip() | |
| if (len(password_current) == 0): | |
| password = 2 | |
| else: | |
| password_current_sha1 = hashlib.sha1(password_current).hexdigest() | |
| if (password_current_sha1 != member.password): | |
| password_error = 3 | |
| template_values['password_error'] = password_error | |
| template_values['password_error_message'] = password_error_messages[password_error] | |
| if ((password_error == 0) and (password_update == True)): | |
| member.password = hashlib.sha1(password_new).hexdigest() | |
| member.auth = hashlib.sha1(str(member.num) + ':' + member.password).hexdigest() | |
| member.put() | |
| self.response.headers['Set-Cookie'] = 'auth=' + member.auth + '; expires=' + (datetime.datetime.now() + datetime.timedelta(days=365)).strftime("%a, %d-%b-%Y %H:%M:%S GMT") + '; path=/' | |
| self.redirect('/settings') | |
| # Verification: email | |
| member_email_error = 0 | |
| member_email_error_messages = ['', | |
| u'请输入你的电子邮件地址', | |
| u'电子邮件地址长度不能超过 32 个字符', | |
| u'你输入的电子邮件地址不符合规则', | |
| u'抱歉这个电子邮件地址已经有人注册过了'] | |
| member_email = self.request.get('email').strip() | |
| if (len(member_email) == 0): | |
| errors = errors + 1 | |
| member_email_error = 1 | |
| else: | |
| if (len(member_email) > 32): | |
| errors = errors + 1 | |
| member_email_error = 2 | |
| else: | |
| p = re.compile(r"(?:^|\s)[-a-z0-9_.]+@(?:[-a-z0-9]+\.)+[a-z]{2,6}(?:\s|$)", re.IGNORECASE) | |
| if (p.search(member_email)): | |
| q = db.GqlQuery('SELECT * FROM Member WHERE email = :1 AND num != :2', member_email.lower(), member.num) | |
| if (q.count() > 0): | |
| errors = errors + 1 | |
| member_email_error = 4 | |
| else: | |
| errors = errors + 1 | |
| member_email_error = 3 | |
| template_values['member_email'] = member_email | |
| template_values['member_email_error'] = member_email_error | |
| template_values['member_email_error_message'] = member_email_error_messages[member_email_error] | |
| # Verification: website | |
| member_website_error = 0 | |
| member_website_error_messages = ['', | |
| u'个人网站地址长度不能超过 200 个字符', | |
| u'这个网站地址不符合规则' | |
| ] | |
| member_website = self.request.get('website').strip() | |
| if (len(member_website) == 0): | |
| member_website = '' | |
| else: | |
| if (len(member_website) > 200): | |
| errors = errors + 1 | |
| member_website_error = 1 | |
| else: | |
| p = re.compile('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+') | |
| if (p.search(member_website)): | |
| errors = errors | |
| else: | |
| errors = errors + 1 | |
| member_website_error = 2 | |
| template_values['member_website'] = member_website | |
| template_values['member_website_error'] = member_website_error | |
| template_values['member_website_error_message'] = member_website_error_messages[member_website_error] | |
| # Verification: Twitter | |
| member_twitter_error = 0 | |
| member_twitter_error_messages = ['', | |
| u'Twitter 用户名长度不能超过 20 个字符', | |
| u'Twitter 用户名不符合规则' | |
| ] | |
| member_twitter = self.request.get('twitter').strip() | |
| if (len(member_twitter) == 0): | |
| member_twitter = '' | |
| else: | |
| if (len(member_twitter) > 20): | |
| errors = errors + 1 | |
| member_twitter_error = 1 | |
| else: | |
| p = re.compile('[a-zA-Z0-9\_]+') | |
| if (p.search(member_twitter)): | |
| errors = errors | |
| else: | |
| errors = errors + 1 | |
| member_twitter_error = 2 | |
| template_values['member_twitter'] = member_twitter | |
| template_values['member_twitter_error'] = member_twitter_error | |
| template_values['member_twitter_error_message'] = member_twitter_error_messages[member_twitter_error] | |
| # Verification: location | |
| member_location_error = 0 | |
| member_location_error_messages = ['', | |
| u'所在地长度不能超过 40 个字符' | |
| ] | |
| member_location = self.request.get('location').strip() | |
| if (len(member_location) == 0): | |
| member_location = '' | |
| else: | |
| if (len(member_location) > 40): | |
| errors = errors + 1 | |
| member_location_error = 1 | |
| template_values['member_location'] = member_location | |
| template_values['member_location_error'] = member_location_error | |
| template_values['member_location_error_message'] = member_location_error_messages[member_location_error] | |
| # Verification: tagline | |
| member_tagline_error = 0 | |
| member_tagline_error_messages = ['', | |
| u'个人签名长度不能超过 70 个字符' | |
| ] | |
| member_tagline = self.request.get('tagline').strip() | |
| if (len(member_tagline) == 0): | |
| member_tagline = '' | |
| else: | |
| if (len(member_tagline) > 70): | |
| errors = errors + 1 | |
| member_tagline_error = 1 | |
| template_values['member_tagline'] = member_tagline | |
| template_values['member_tagline_error'] = member_tagline_error | |
| template_values['member_tagline_error_message'] = member_tagline_error_messages[member_tagline_error] | |
| # Verification: bio | |
| member_bio_error = 0 | |
| member_bio_error_messages = ['', | |
| u'个人简介长度不能超过 2000 个字符' | |
| ] | |
| member_bio = self.request.get('bio').strip() | |
| if (len(member_bio) == 0): | |
| member_bio = '' | |
| else: | |
| if (len(member_bio) > 2000): | |
| errors = errors + 1 | |
| member_bio_error = 1 | |
| template_values['member_bio'] = member_bio | |
| template_values['member_bio_error'] = member_bio_error | |
| template_values['member_bio_error_message'] = member_bio_error_messages[member_bio_error] | |
| template_values['errors'] = errors | |
| # Verification: l10n | |
| member_l10n = self.request.get('l10n').strip() | |
| supported = GetSupportedLanguages() | |
| if member_l10n == '': | |
| member_l10n = site.l10n | |
| else: | |
| if member_l10n not in supported: | |
| member_l10n = site.l10n | |
| s = GetLanguageSelect(member_l10n) | |
| template_values['s'] = s | |
| template_values['member_l10n'] = member_l10n | |
| # Verification: twitter_sync | |
| if member.twitter_oauth == 1: | |
| member_twitter_sync = self.request.get('twitter_sync') | |
| if member_twitter_sync == 'on': | |
| member_twitter_sync = 1 | |
| else: | |
| member_twitter_sync = 0 | |
| template_values['member_twitter_sync'] = member_twitter_sync | |
| if (errors == 0): | |
| member.email = member_email.lower() | |
| member.website = member_website | |
| member.twitter = member_twitter | |
| member.location = member_location | |
| member.tagline = member_tagline | |
| if member.twitter_oauth == 1: | |
| member.twitter_sync = member_twitter_sync | |
| member.bio = member_bio | |
| member.l10n = member_l10n | |
| member.put() | |
| memcache.delete('Member_' + str(member.num)) | |
| memcache.delete('Member::' + str(member.username)) | |
| memcache.delete('Member::' + str(member.username_lower)) | |
| self.session['message'] = '个人设置成功更新' | |
| self.redirect('/settings') | |
| else: | |
| if browser['ios']: | |
| path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile', 'member_settings.html') | |
| else: | |
| path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop', 'member_settings.html') | |
| output = template.render(path, template_values) | |
| self.response.out.write(output) | |
| else: | |
| self.redirect('/signin') | |
| class SettingsPasswordHandler(webapp.RequestHandler): | |
| def post(self): | |
| site = GetSite() | |
| browser = detect(self.request) | |
| self.session = Session() | |
| template_values = {} | |
| template_values['site'] = site | |
| template_values['page_title'] = site.title + u' › 密码设置' | |
| template_values['system_version'] = SYSTEM_VERSION | |
| errors = 0 | |
| member = CheckAuth(self) | |
| l10n = GetMessages(self, member, site) | |
| template_values['l10n'] = l10n | |
| if (member): | |
| template_values['member'] = member | |
| template_values['member_username'] = member.username | |
| template_values['member_email'] = member.email | |
| # Verification: password | |
| password_error = 0 | |
| password_update = False | |
| password_error_messages = ['', | |
| '新密码长度不能超过 32 个字符', | |
| '请输入当前密码', | |
| '当前密码不正确' | |
| ] | |
| password_new = self.request.get('password_new').strip() | |
| if (len(password_new) > 0): | |
| password_update = True | |
| if (len(password_new) > 32): | |
| password_error = 1 | |
| else: | |
| password_current = self.request.get('password_current').strip() | |
| if (len(password_current) == 0): | |
| password_error = 2 | |
| else: | |
| password_current_sha1 = hashlib.sha1(password_current).hexdigest() | |
| if (password_current_sha1 != member.password): | |
| password_error = 3 | |
| template_values['password_error'] = password_error | |
| template_values['password_error_message'] = password_error_messages[password_error] | |
| if ((password_error == 0) and (password_update == True)): | |
| member.password = hashlib.sha1(password_new).hexdigest() | |
| member.auth = hashlib.sha1(str(member.num) + ':' + member.password).hexdigest() | |
| member.put() | |
| memcache.set(member.auth, member.num, 86400 * 365) | |
| memcache.set('Member_' + str(member.num), member, 86400 * 365) | |
| self.session['message'] = '密码已成功更新,下次请用新密码登录' | |
| self.response.headers['Set-Cookie'] = 'auth=' + member.auth + '; expires=' + (datetime.datetime.now() + datetime.timedelta(days=365)).strftime("%a, %d-%b-%Y %H:%M:%S GMT") + '; path=/' | |
| self.redirect('/settings') | |
| else: | |
| if browser['ios']: | |
| path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile', 'member_settings_password.html') | |
| else: | |
| path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop', 'member_settings_password.html') | |
| output = template.render(path, template_values) | |
| self.response.out.write(output) | |
| else: | |
| self.redirect('/signin') | |
| class SettingsAvatarHandler(webapp.RequestHandler): | |
| def get(self): | |
| site = GetSite() | |
| self.session = Session() | |
| browser = detect(self.request) | |
| template_values = {} | |
| template_values['site'] = site | |
| template_values['page_title'] = site.title + u' › 头像' | |
| template_values['system_version'] = SYSTEM_VERSION | |
| member = CheckAuth(self) | |
| l10n = GetMessages(self, member, site) | |
| template_values['l10n'] = l10n | |
| if (member): | |
| if 'message' in self.session: | |
| template_values['message'] = self.session['message'] | |
| del self.session['message'] | |
| template_values['member'] = member | |
| if browser['ios']: | |
| path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile', 'member_settings_avatar.html') | |
| else: | |
| path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop', 'member_settings_avatar.html') | |
| output = template.render(path, template_values) | |
| self.response.out.write(output) | |
| else: | |
| self.redirect('/signin') | |
| def post(self): | |
| site = GetSite() | |
| self.session = Session() | |
| browser = detect(self.request) | |
| template_values = {} | |
| template_values['site'] = site | |
| template_values['system_version'] = SYSTEM_VERSION | |
| member = CheckAuth(self) | |
| l10n = GetMessages(self, member, site) | |
| template_values['l10n'] = l10n | |
| if (member): | |
| timestamp = str(int(time.time())) | |
| avatar = self.request.get('avatar') | |
| avatar_73 = images.resize(avatar, 73, 73) | |
| avatar_48 = images.resize(avatar, 48, 48) | |
| avatar_24 = images.resize(avatar, 24, 24) | |
| # Large 73x73 | |
| q1 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", 'avatar_' + str(member.num) + '_large') | |
| if (q1.count() == 1): | |
| avatar_large = q1[0] | |
| avatar_large.content = db.Blob(avatar_73) | |
| avatar_large.put() | |
| else: | |
| qc1 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", 'avatar.max') | |
| if (qc1.count() == 1): | |
| counter1 = qc1[0] | |
| counter1.value = counter1.value + 1 | |
| else: | |
| counter1 = Counter() | |
| counter1.name = 'avatar.max' | |
| counter1.value = 1 | |
| counter1.put() | |
| avatar_large = Avatar() | |
| avatar_large.name = 'avatar_' + str(member.num) + '_large' | |
| avatar_large.content = db.Blob(avatar_73) | |
| avatar_large.num = counter1.value | |
| avatar_large.put() | |
| member.avatar_large_url = '/avatar/' + str(member.num) + '/large?r=' + timestamp | |
| member.put() | |
| # Normal 48x48 | |
| q2 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", 'avatar_' + str(member.num) + '_normal') | |
| if (q2.count() == 1): | |
| avatar_normal = q2[0] | |
| avatar_normal.content = db.Blob(avatar_48) | |
| avatar_normal.put() | |
| else: | |
| qc2 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", 'avatar.max') | |
| if (qc2.count() == 1): | |
| counter2 = qc2[0] | |
| counter2.value = counter2.value + 1 | |
| else: | |
| counter2 = Counter() | |
| counter2.name = 'avatar.max' | |
| counter2.value = 1 | |
| counter2.put() | |
| avatar_normal = Avatar() | |
| avatar_normal.name = 'avatar_' + str(member.num) + '_normal' | |
| avatar_normal.content = db.Blob(avatar_48) | |
| avatar_normal.num = counter2.value | |
| avatar_normal.put() | |
| member.avatar_normal_url = '/avatar/' + str(member.num) + '/normal?r=' + timestamp | |
| member.put() | |
| # Mini 24x24 | |
| q3 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", 'avatar_' + str(member.num) + '_mini') | |
| if (q3.count() == 1): | |
| avatar_mini = q3[0] | |
| avatar_mini.content = db.Blob(avatar_24) | |
| avatar_mini.put() | |
| else: | |
| qc3 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", 'avatar.max') | |
| if (qc3.count() == 1): | |
| counter3 = qc3[0] | |
| counter3.value = counter3.value + 1 | |
| else: | |
| counter3 = Counter() | |
| counter3.name = 'avatar.max' | |
| counter3.value = 1 | |
| counter3.put() | |
| avatar_mini = Avatar() | |
| avatar_mini.name = 'avatar_' + str(member.num) + '_mini' | |
| avatar_mini.content = db.Blob(avatar_24) | |
| avatar_mini.num = counter3.value | |
| avatar_mini.put() | |
| member.avatar_mini_url = '/avatar/' + str(member.num) + '/mini?r=' + timestamp | |
| member.put() | |
| # Upload to MobileMe | |
| if config.mobileme_enabled: | |
| headers = {'Authorization' : 'Basic ' + base64.b64encode(config.mobileme_username + ':' + config.mobileme_password)} | |
| host = 'idisk.me.com' | |
| # Sharding | |
| timestamp = str(int(time.time())) | |
| shard = member.num % 31 | |
| root = '/' + config.mobileme_username + '/Web/Sites/v2ex/avatars/' + str(shard) | |
| root_mini = root + '/mini' | |
| root_normal = root + '/normal' | |
| root_large = root + '/large' | |
| h = httplib.HTTPConnection(host) | |
| # Mini | |
| h.request('PUT', root_mini + '/' + str(member.num) + '.png', str(avatar_24), headers) | |
| response = h.getresponse() | |
| if response.status == 201 or response.status == 204: | |
| member.avatar_mini_url = 'http://web.me.com/' + config.mobileme_username + '/v2ex/avatars/' + str(shard) + '/mini/' + str(member.num) + '.png?r=' + timestamp | |
| # Normal | |
| h.request('PUT', root_normal + '/' + str(member.num) + '.png', str(avatar_48), headers) | |
| response = h.getresponse() | |
| if response.status == 201 or response.status == 204: | |
| member.avatar_normal_url = 'http://web.me.com/' + config.mobileme_username + '/v2ex/avatars/' + str(shard) + '/normal/' + str(member.num) + '.png?r=' + timestamp | |
| # Large | |
| h.request('PUT', root_large + '/' + str(member.num) + '.png', str(avatar_73), headers) | |
| response = h.getresponse() | |
| if response.status == 201 or response.status == 204: | |
| member.avatar_large_url = 'http://web.me.com/' + config.mobileme_username + '/v2ex/avatars/' + str(shard) + '/large/' + str(member.num) + '.png?r=' + timestamp | |
| member.put() | |
| memcache.set('Member_' + str(member.num), member, 86400 * 365) | |
| memcache.set('Member::' + member.username_lower, member, 86400 * 365) | |
| memcache.delete('Avatar::avatar_' + str(member.num) + '_large') | |
| memcache.delete('Avatar::avatar_' + str(member.num) + '_normal') | |
| memcache.delete('Avatar::avatar_' + str(member.num) + '_mini') | |
| self.session['message'] = '新头像设置成功' | |
| self.redirect('/settings/avatar') | |
| else: | |
| self.redirect('/signin') | |
| class MemberBlockHandler(webapp.RequestHandler): | |
| def get(self, key): | |
| go = '/' | |
| member = CheckAuth(self) | |
| if member: | |
| member = db.get(member.key()) | |
| one = db.get(db.Key(key)) | |
| if one: | |
| if one.num != member.num: | |
| try: | |
| blocked = pickle.loads(member.blocked.encode('utf-8')) | |
| except: | |
| blocked = [] | |
| if len(blocked) == 0: | |
| blocked = [] | |
| if one.num not in blocked: | |
| blocked.append(one.num) | |
| member.blocked = pickle.dumps(blocked) | |
| member.put() | |
| memcache.set('Member_' + str(member.num), member, 86400) | |
| self.redirect(go) | |
| class MemberUnblockHandler(webapp.RequestHandler): | |
| def get(self, key): | |
| go = '/' | |
| member = CheckAuth(self) | |
| if member: | |
| member = db.get(member.key()) | |
| one = db.get(db.Key(key)) | |
| if one: | |
| if one.num != member.num: | |
| try: | |
| blocked = pickle.loads(member.blocked.encode('utf-8')) | |
| except: | |
| blocked = [] | |
| if len(blocked) == 0: | |
| blocked = [] | |
| if one.num in blocked: | |
| blocked.remove(one.num) | |
| member.blocked = pickle.dumps(blocked) | |
| member.put() | |
| memcache.set('Member_' + str(member.num), member, 86400) | |
| self.redirect(go) | |
| def main(): | |
| application = webapp.WSGIApplication([ | |
| ('/member/([a-z0-9A-Z\_]+)', MemberHandler), | |
| ('/member/([a-z0-9A-Z\_]+).json', MemberApiHandler), | |
| ('/settings', SettingsHandler), | |
| ('/settings/password', SettingsPasswordHandler), | |
| ('/settings/avatar', SettingsAvatarHandler), | |
| ('/block/(.*)', MemberBlockHandler), | |
| ('/unblock/(.*)', MemberUnblockHandler) | |
| ], | |
| debug=True) | |
| util.run_wsgi_app(application) | |
| if __name__ == '__main__': | |
| main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment