def get(self, topic_num): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0].strip() if member: if member.username_lower_md5 == t: topic = GetKindByNum('Topic', int(topic_num)) if topic is not False: #q = db.GqlQuery("SELECT * FROM TopicBookmark WHERE topic = :1 AND member = :2", topic, member) q = TopicBookmark.selectBy(topic=topic,member=member) if q.count() > 0: bookmark = q[0] bookmark.delete() member = Member.get(member.id) member.favorited_topics = member.favorited_topics - 1 member.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400) n = 'r/t' + str(topic.num) + '/m' + str(member.num) memcache.delete(n) #taskqueue.add(url='/minus/star/topic/' + str(topic.id)) topic.stars = topic.stars - 1 topic.sync() store.commit() #jon add memcache.set('Topic_' + str(topic.num), topic, 86400) self.redirect(go)
def get(self, private_token): n = memcache.get('n_' + private_token) if n is not None: self.values['notification'] = n self.set_header('Content-type', 'application/xml;charset=UTF-8') self.values['member'] = self.member self.finalize(template_name='notifications', template_root='feed', template_type='xml') else: #q = db.GqlQuery("SELECT * FROM Member WHERE private_token = :1", private_token) q = Member.selectBy(private_token=private_token) count = q.count() if count > 0: member = q[0] #q = db.GqlQuery("SELECT * FROM Notification WHERE for_member_num = :1 ORDER BY num DESC LIMIT 20", member.num) q = Notification.selectBy(for_member_num=member.num).orderBy('-num').limit(20) notifications = [] i = 0 for n in q: if n.type == 'reply': n.title = u'' + n.member.username + u' 在 ' + self.escape(n.label1) + u' 里回复了你' n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在 <a href="' + n.link1 + '">' + self.escape(n.label1) + u'</a> 里回复了你' notifications.append(n) if n.type == 'mention_reply': n.title = u'' + n.member.username + u' 在回复 ' + self.escape(n.label1) + u' 时提到了你' n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在回复 <a href="' + n.link1 + '">' + self.escape(n.label1) + u'</a> 时提到了你' notifications.append(n) i = i + 1 self.values['notifications'] = notifications memcache.set('n_' + private_token, notifications, 600) self.set_header('Content-type', 'application/xml;charset=UTF-8') self.values['site'] = GetSite() self.values['member'] = member self.finalize(template_name='notifications', template_root='feed', template_type='xml')
def site(self): if not hasattr(self, "_site"): site = memcache.get('site') if site is not None: self._site = site else: #q = db.GqlQuery("SELECT * FROM Site WHERE num = 1") q = Site.selectBy(num=1) if q.count() == 1: site = q[0] if site.l10n is None: site.l10n = 'en' if site.meta is None: site.meta = '' memcache.set('site', site, 86400) self._site = site else: site = Site() site.num = 1 site.title = 'V2EX' site.domain = 'v2ex.appspot.com' site.slogan = 'way to explore' site.l10n = 'en' site.description = '' site.meta = '' site.sync() store.commit() #jon add memcache.set('site', site, 86400) self._site = site return self._site
def get(self, topic_key): topic = Topic.get(topic_key) if topic: topic.stars = topic.stars - 1 topic.sync() store.commit() #jon add memcache.set('Topic_' + str(topic.num), topic, 86400)
def get(self): output = memcache.get('feed_read_output') if output is None: self.values['site_domain'] = self.site.domain self.values['site_name'] = self.site.title self.values['site_slogan'] = self.site.slogan self.values['feed_url'] = 'http://' + self.values['site_domain'] + '/read.xml' self.values['site_updated'] = datetime.datetime.now(pytz.timezone('Asia/Shanghai')) topics = memcache.get('feed_home') if topics is None: #q = db.GqlQuery("SELECT * FROM Topic ORDER BY created DESC LIMIT 10") q = Topic.select(orderBy='-created').limit(10) topics = [] IGNORED = ['newbie', 'in', 'flamewar', 'pointless', 'tuan', '528491', 'chamber', 'autistic', 'blog', 'love', 'flood'] for topic in q: if topic.node.name not in IGNORED: topics.append(topic) memcache.set('feed_home', topics, 3600) self.values['topics'] = topics self.values['feed_title'] = self.site.title path = os.path.join(os.path.dirname(__file__), 'tpl', 'feed') t=self.get_template(path, 'read.xml') output = t.render(self.values) memcache.set('feed_read_output', output, 3600) self.set_header('Content-type', 'application/xml;charset=UTF-8') self.write(output)
def get(self, node_name): node_name = node_name.lower() site = GetSite() node = GetKindByName('Node', node_name) if node is False: return self.write('node not found') output = memcache.get('feed_node_' + node_name) if output is None: template_values = {} template_values['site'] = site template_values['site_domain'] = site.domain template_values['site_name'] = site.title template_values['site_slogan'] = site.slogan template_values['feed_url'] = 'http://' + template_values[ 'site_domain'] + '/index.xml' template_values['site_updated'] = datetime.datetime.now( pytz.timezone('Asia/Shanghai')) #q = db.GqlQuery("SELECT * FROM Topic WHERE node = :1 ORDER BY created DESC LIMIT 10", node) q = Topic.selectBy(node=node).orderBy('-created').limit(10) topics = [] for topic in q: topics.append(topic) template_values['topics'] = topics template_values['feed_title'] = site.title + u' › ' + node.title path = os.path.join(os.path.dirname(__file__), 'tpl', 'feed') t = self.get_template(template_values) output = t.render(self.values) memcache.set('feed_node_' + node.name, output, 7200) self.set_header('Content-type', 'application/xml;charset=UTF-8') self.write(output)
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.arguments['password_new'][0].strip() if (len(password_new) > 0): password_update = True if (len(password_new) > 32): password_error = 1 else: password_current = self.request.arguments['password_current'][0].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)): old_auth = member.auth memcache.delete(old_auth) member.password = hashlib.sha1(password_new).hexdigest() member.auth = hashlib.sha1(str(member.num) + ':' + member.password).hexdigest() member.sync() store.commit() #jon add memcache.set(member.auth, member.num, 86400 * 14) memcache.set('Member_' + str(member.num), member, 86400 * 14) self.session['message'] = '密码已成功更新,下次请用新密码登录' self.set_header('Set-Cookie', 'auth=' + member.auth + '; expires=' + (datetime.datetime.now(pytz.timezone('Asia/Shanghai')) + 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') else: path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop') t=self.get_template(path, 'member_settings_password.html') self.finish(t.render(template_values)) else: self.redirect('/signin')
def get(self, topic_num): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0].strip() if member: if member.username_lower_md5 == t: topic = GetKindByNum('Topic', int(topic_num)) if topic is not False: #q = db.GqlQuery("SELECT * FROM TopicBookmark WHERE topic = :1 AND member = :2", topic, member) q = TopicBookmark.selectBy(topic=topic, member=member) if q.count() > 0: bookmark = q[0] bookmark.delete() member = Member.get(member.id) member.favorited_topics = member.favorited_topics - 1 member.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400) n = 'r/t' + str(topic.num) + '/m' + str(member.num) memcache.delete(n) #taskqueue.add(url='/minus/star/topic/' + str(topic.id)) topic.stars = topic.stars - 1 topic.sync() store.commit() #jon add memcache.set('Topic_' + str(topic.num), topic, 86400) self.redirect(go)
def get(self): output = memcache.get('feed_read_output') if output is None: self.values['site_domain'] = self.site.domain self.values['site_name'] = self.site.title self.values['site_slogan'] = self.site.slogan self.values['feed_url'] = 'http://' + self.values[ 'site_domain'] + '/read.xml' self.values['site_updated'] = datetime.datetime.now( pytz.timezone('Asia/Shanghai')) topics = memcache.get('feed_home') if topics is None: #q = db.GqlQuery("SELECT * FROM Topic ORDER BY created DESC LIMIT 10") q = Topic.select(orderBy='-created').limit(10) topics = [] IGNORED = [ 'newbie', 'in', 'flamewar', 'pointless', 'tuan', '528491', 'chamber', 'autistic', 'blog', 'love', 'flood' ] for topic in q: if topic.node.name not in IGNORED: topics.append(topic) memcache.set('feed_home', topics, 3600) self.values['topics'] = topics self.values['feed_title'] = self.site.title path = os.path.join(os.path.dirname(__file__), 'tpl', 'feed') t = self.get_template(path, 'read.xml') output = t.render(self.values) memcache.set('feed_read_output', output, 3600) self.set_header('Content-type', 'application/xml;charset=UTF-8') self.write(output)
def get(self, node_name): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0] if member: if str(member.created_ts) == str(t): node = GetKindByName('Node', node_name) if node is not False: #q = db.GqlQuery("SELECT * FROM NodeBookmark WHERE node = :1 AND member = :2", node, member) q = NodeBookmark.selectBy(node=node, member=member) if q.count() == 0: bookmark = NodeBookmark(member=member) bookmark.node = node bookmark.member = member bookmark.sync() member = Member.get(member.id) member.favorited_nodes = member.favorited_nodes + 1 member.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400) n = 'r/n' + str(node.num) + '/m' + str(member.num) memcache.set(n, True, 86400 * 14) self.redirect(go)
def get(self, node_name): node_name = node_name.lower() site = GetSite() node = GetKindByName('Node', node_name) if node is False: return self.write('node not found') output = memcache.get('feed_node_' + node_name) if output is None: template_values = {} template_values['site'] = site template_values['site_domain'] = site.domain template_values['site_name'] = site.title template_values['site_slogan'] = site.slogan template_values['feed_url'] = 'http://' + template_values['site_domain'] + '/index.xml' template_values['site_updated'] = datetime.datetime.now(pytz.timezone('Asia/Shanghai')) #q = db.GqlQuery("SELECT * FROM Topic WHERE node = :1 ORDER BY created DESC LIMIT 10", node) q = Topic.selectBy(node=node).orderBy('-created').limit(10) topics = [] for topic in q: topics.append(topic) template_values['topics'] = topics template_values['feed_title'] = site.title + u' › ' + node.title path = os.path.join(os.path.dirname(__file__), 'tpl', 'feed') t=self.get_template(template_values) output = t.render(self.values) memcache.set('feed_node_' + node.name, output, 7200) self.set_header('Content-type', 'application/xml;charset=UTF-8') self.write(output)
def get(self, platform, soldier): ua = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13' referer = 'http://bfbcs.com/' + platform cache_tag = 'bfbcs::' + platform + '/' + soldier raw = memcache.get(cache_tag) url = 'http://bfbcs.com/stats_' + platform + '/' + soldier if raw is None: response = urlfetch.fetch(url, headers={'User-Agent' : ua, 'Referer' : referer }) raw = response.content memcache.set(cache_tag, raw, 600) pcode = re.findall('([a-z0-9]{32})', raw) self.response.out.write('<strong>PCODE</strong> ' + str(pcode[0]) + '<br />') if len(pcode) == 1: pcode = pcode[0] payload = 'request=addplayerqueue&pcode=' + pcode self.response.out.write('<strong>PAYLOAD</strong> ' + payload + ' (' + str(len(payload))+ ' bytes)<br />') headers = {'User-Agent' : ua, 'Referer' : url, 'X-Requested-With' : 'XMLHttpRequest', 'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8', 'Content-Length' : '61', 'Accept' : 'application/json, text/javascript, */*', 'Accept-Language' : 'en-us,en;q=0.5', 'Accept-Encoding' : 'gzip,deflate', 'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Keep-Alive' : 115, 'Host' : 'bfbcs.com', 'Pragma' : 'no-cache', 'Cache-Control' : 'no-cache', 'Cookie' : '__utma=7878317.1843709575.1297205447.1298572822.1298577848.12; __utmz=7878317.1297205447.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); sessid=enqd028n30d2tr4lv4ned04qi0; __utmb=7878317.21.10.1298577848; __utmc=7878317' } response = urlfetch.fetch(url, payload=payload, headers=headers, method='POST') if response.status_code == 500: response = urlfetch.fetch(url, payload=payload, headers=headers, method='POST') if response.status_code == 500: self.write('<strong>FAILED</strong>') else: self.write('<strong>RESULT</strong> OK ' + response.content) else: self.write('<strong>RESULT</strong> OK ' + response.content)
def get(self, node_name): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0] if member: if str(member.created_ts) == str(t): node = GetKindByName('Node', node_name) if node is not False: #q = db.GqlQuery("SELECT * FROM NodeBookmark WHERE node = :1 AND member = :2", node, member) q = NodeBookmark.selectBy(node=node, member=member) if q.count() > 0: bookmark = q[0] bookmark.delete() member = Member.get(member.id) member.favorited_nodes = member.favorited_nodes - 1 member.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400) n = 'r/n' + str(node.num) + '/m' + str(member.num) memcache.delete(n) self.redirect(go)
def get(self, topic_key): topic = Topic.get(topic_key) if topic: topic.stars = topic.stars - 1 topic.sync() store.commit() #jon add memcache.set('Topic_' + str(topic.num), topic, 86400)
def get(self, screen_name): site = GetSite() member = CheckAuth(self) if member: if member.twitter_oauth == 1: template_values = {} template_values['site'] = site template_values['rnd'] = random.randrange(1, 100) template_values['member'] = member l10n = GetMessages(self, member, site) template_values['l10n'] = l10n template_values[ 'page_title'] = site.title + u' › Twitter › ' + screen_name template_values['screen_name'] = screen_name access_token = OAuthToken.from_string( member.twitter_oauth_string) twitter = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token) rate_limit = memcache.get( str(member.twitter_id) + '::rate_limit') if rate_limit is None: try: rate_limit = twitter.GetRateLimit() memcache.set( str(member.twitter_id) + '::rate_limit', rate_limit, 60) except: logging.info('Failed to get rate limit for @' + member.twitter_screen_name) template_values['rate_limit'] = rate_limit cache_tag = 'twitter::' + screen_name + '::home' statuses = memcache.get(cache_tag) if statuses is None: statuses = twitter.GetUserTimeline(user=screen_name, count=50) i = 0 for status in statuses: statuses[i].source = statuses[i].source.replace( '<a', '<a class="dark"') statuses[i].datetime = datetime.datetime.fromtimestamp( time.mktime( time.strptime(status.created_at, '%a %b %d %H:%M:%S +0000 %Y'))) statuses[i].text = twitter.ConvertMentions(status.text) #statuses[i].text = twitter.ExpandBitly(status.text) i = i + 1 memcache.set(cache_tag, statuses, 120) template_values['statuses'] = statuses path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop') t = self.get_template(path, 'twitter_user.html') self.finish(t.render(template_values)) else: self.redirect('/settings') else: self.redirect('/')
def get(self): member = CheckAuth(self) site = GetSite() if member: if member.twitter_oauth == 1: template_values = {} template_values['site'] = site template_values['rnd'] = random.randrange(1, 100) template_values['member'] = member l10n = GetMessages(self, member, site) template_values['l10n'] = l10n template_values[ 'page_title'] = site.title + u' › Twitter › Direct Messages › Inbox' access_token = OAuthToken.from_string( member.twitter_oauth_string) twitter = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token) rate_limit = memcache.get( str(member.twitter_id) + '::rate_limit') if rate_limit is None: try: rate_limit = twitter.GetRateLimit() memcache.set( str(member.twitter_id) + '::rate_limit', rate_limit, 60) except: logging.info('Failed to get rate limit for @' + member.twitter_screen_name) template_values['rate_limit'] = rate_limit cache_tag = 'member::' + str( member.num) + '::twitter::dm::inbox' messages = memcache.get(cache_tag) if messages is None: messages = twitter.GetDirectMessages() i = 0 for message in messages: messages[i].datetime = datetime.datetime.fromtimestamp( time.mktime( time.strptime(message.created_at, '%a %b %d %H:%M:%S +0000 %Y'))) messages[i].text = twitter.ConvertMentions( message.text) #statuses[i].text = twitter.ExpandBitly(status.text) i = i + 1 memcache.set(cache_tag, messages, 120) template_values['messages'] = messages path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop') t = self.get_template(path, 'twitter_dm_inbox.html') self.finish(t.render(template_values)) else: self.redirect('/settings') else: self.redirect('/')
def GetMemberByUsername(name): one = memcache.get('Member::' + str(name).lower()) if one: return one else: #q = db.GqlQuery("SELECT * FROM Member WHERE username_lower = :1", str(name).lower()) q = Member.selectBy(username_lower=str(name).lower()) if q.count() == 1: one = q[0] memcache.set('Member::' + str(name).lower(), one, 86400) return one else: return False
def GetPlaceByIP(ip): cache = 'Place_' + ip place = memcache.get(cache) if place: return place else: #q = db.GqlQuery("SELECT * FROM Place WHERE ip = :1", ip) q = Place.selectBy(ip=ip) if q.count() == 1: place = q[0] memcache.set(cache, place, 86400) return place else: return False
def CheckAuth(handler): ip = GetIP(handler) cookies = handler.request.cookies if 'auth' in cookies: auth = cookies['auth'].value member_num = memcache.get(auth) if (member_num > 0): member = memcache.get('Member_' + str(member_num)) if member is None: #q = db.GqlQuery("SELECT * FROM Member WHERE num = :1", member_num) q = Member.selectBy(num=member_num) if q.count() == 1: member = q[0] memcache.set(auth, member.num) memcache.set('Member_' + str(member_num), member) else: member = False if member: member.ip = ip return member else: #q = db.GqlQuery("SELECT * FROM Member WHERE auth = :1", auth) q = Member.selectBy(auth=auth) if (q.count() == 1): member_num = q[0].num member = q[0] memcache.set(auth, member_num) memcache.set('Member_' + str(member_num), member) member.ip = ip return member else: return False else: return False
def CheckAuth(handler): ip = GetIP(handler) cookies = handler.request.cookies if 'auth' in cookies: auth = cookies['auth'].value member_num = memcache.get(auth) if (member_num > 0): member = memcache.get('Member_' + str(member_num)) if member is None: #q = db.GqlQuery("SELECT * FROM Member WHERE num = :1", member_num) q = Member.selectBy(num=member_num) if q.count() == 1: member = q[0] memcache.set(auth, member.num) memcache.set('Member_' + str(member_num), member) else: member = False if member: member.ip = ip return member else: #q = db.GqlQuery("SELECT * FROM Member WHERE auth = :1", auth) q = Member.selectBy(auth=auth) if (q.count() == 1): member_num = q[0].num member = q[0] memcache.set(auth, member_num) memcache.set('Member_' + str(member_num), member) member.ip = ip return member else: return False else: return False
def get(self): site = GetSite() template_values = {} template_values['site'] = site topics = memcache.get('api_topics_latest') if topics is None: #topics = db.GqlQuery("SELECT * FROM Topic ORDER BY created DESC LIMIT 20") topics = Topic.selectBy(orderBy='-created').limit(20) memcache.set('api_topics_latest', topics, 120) template_values['topics'] = topics template_values['topics_count'] = topics.count() path = os.path.join(os.path.dirname(__file__), 'tpl', 'api') t = self.get_template(path, 'topics_latest.json') self.finish(t.render(template_values))
def GetMemberByEmail(email): cache = 'Member::email::' + hashlib.md5(email.lower()).hexdigest() one = memcache.get(cache) if one: return one else: #q = db.GqlQuery("SELECT * FROM Member WHERE email = :1", str(email).lower()) q = Member.selectBy(email=str(email).lower()) if q.count() == 1: one = q[0] memcache.set(cache, one, 86400) return one else: return False
def get(self, member_key): member = Member.get(member_key) if member: if member.notification_position is None: member.notification_position = 0 #q = db.GqlQuery("SELECT __key__ FROM Notification WHERE for_member_num = :1 AND num > :2 ORDER BY num DESC", member.num, member.notification_position) q = Notification.select(AND(Notification.q.for_m==member.num, Notification.q.num>member.notification_position)).orderBy('-num') count = q.count() if count > 0: member.notifications = count member.sync() store.commit() #jon add memcache.delete('nn::' + member.username_lower) memcache.set('Member_' + str(member.num), member, 86400)
def GetKindByName(kind, name): K = str(kind.capitalize()) one = memcache.get(K + '::' + str(name)) if one: return one else: #q = db.GqlQuery("SELECT * FROM " + K + " WHERE name = :1", str(name)) selectBy = getattr(getObj(K), 'selectBy'); q = selectBy(name=name) if q.count() == 1: one = q[0] memcache.set(K + '::' + str(name), one, 86400) return one else: return False
def post(self, num): site = GetSite() browser = detect(self.request) template_values = {} template_values['site'] = site template_values['system_version'] = SYSTEM_VERSION template_values['page_title'] = site.title + u' › 记事本' member = CheckAuth(self) l10n = GetMessages(self, member, site) template_values['l10n'] = l10n if member: template_values['member'] = member # Verification: content note_content = self.request.arguments['content'][0].strip() note_content_length = len(note_content) if note_content_length > 0: #q = db.GqlQuery("SELECT * FROM Note WHERE num = :1", int(num)) q = Note.selectBy(num=int(num)) if q.count() > 0: note = q[0] template_values['page_title'] = site.title + u' › 记事本 › 编辑' if note.member.num == member.num: note.title = note_content.split("\n")[0][0:60].strip() note.content = note_content note.body = "\n".join( note_content.split("\n")[1:]).strip() note.length = len(note_content) note.edits = note.edits + 1 note.sync() store.commit() #jon add memcache.set('Note_' + str(note.num), note, 86400) self.redirect('/notes/' + str(note.num)) else: self.redirect('/notes') else: self.redirect('/notes') else: template_values['note_content'] = note_content if browser['ios']: path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile') else: path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop') t = self.get_template(path, 'notes_new.html') self.finish(t.render(template_values)) else: self.redirect('/signin')
def get(self): self.session = Session() member = CheckAuth(self) if member: memcache.delete('Member_' + str(member.num)) member = GetKindByNum('Member', member.num) member.twitter_oauth = 0 member.twitter_oauth_key = '' member.twitter_oauth_secret = '' member.twitter_sync = 0 member.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400) self.redirect('/settings') else: self.redirect('/signin')
def GetKindByNum(kind, num): K = str(kind.capitalize()) one = memcache.get(K + '_' + str(num)) if one: return one else: #q = db.GqlQuery("SELECT * FROM " + K + " WHERE num = :1", int(num)) #selectBy = getattr(globals()[K], 'selectBy'); selectBy = getattr(getObj(K), 'selectBy'); q = selectBy(num=num) if q.count() == 1: one = q[0] memcache.set(K + '_' + str(num), one, 86400) return one else: return False
def get(self, member_key): member = Member.get(member_key) if member: if member.notification_position is None: member.notification_position = 0 #q = db.GqlQuery("SELECT __key__ FROM Notification WHERE for_member_num = :1 AND num > :2 ORDER BY num DESC", member.num, member.notification_position) q = Notification.select( AND(Notification.q.for_m == member.num, Notification.q.num > member.notification_position)).orderBy('-num') count = q.count() if count > 0: member.notifications = count member.sync() store.commit() #jon add memcache.delete('nn::' + member.username_lower) memcache.set('Member_' + str(member.num), member, 86400)
def get(self): self.session = Session() member = CheckAuth(self) if member: memcache.delete('Member_' + str(member.num)) member = GetKindByNum('Member', member.num) member.twitter_oauth = 0 member.twitter_oauth_key = '' member.twitter_oauth_secret = '' member.twitter_sync = 0 member.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400) self.redirect('/settings') else: self.redirect('/signin')
def get(self): output = memcache.get('api_nodes_all') if output is None: site = GetSite() template_values = {} template_values['site'] = site nodes = memcache.get('api_nodes_all') if nodes is None: #nodes = db.GqlQuery("SELECT * FROM Node") nodes = Node.select() memcache.set('api_nodes_all', nodes, 3600) template_values['nodes'] = nodes path = os.path.join(os.path.dirname(__file__), 'tpl', 'api') t = self.get_template(path, 'nodes_all.json') output = t.render(template_values) memcache.set('api_nodes_all', output, 86400) self.write(output)
def post(self, num): site = GetSite() browser = detect(self.request) template_values = {} template_values['site'] = site template_values['system_version'] = SYSTEM_VERSION template_values['page_title'] = site.title + u' › 记事本' member = CheckAuth(self) l10n = GetMessages(self, member, site) template_values['l10n'] = l10n if member: template_values['member'] = member # Verification: content note_content = self.request.arguments['content'][0].strip() note_content_length = len(note_content) if note_content_length > 0: #q = db.GqlQuery("SELECT * FROM Note WHERE num = :1", int(num)) q = Note.selectBy(num=int(num)) if q.count() > 0: note = q[0] template_values['page_title'] = site.title + u' › 记事本 › 编辑' if note.member.num == member.num: note.title = note_content.split("\n")[0][0:60].strip() note.content = note_content note.body = "\n".join(note_content.split("\n")[1:]).strip() note.length = len(note_content) note.edits = note.edits + 1 note.sync() store.commit() #jon add memcache.set('Note_' + str(note.num), note, 86400) self.redirect('/notes/' + str(note.num)) else: self.redirect('/notes') else: self.redirect('/notes') else: template_values['note_content'] = note_content if browser['ios']: path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile') else: path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop') t=self.get_template(path,'notes_new.html') self.finish(t.render(template_values)) else: self.redirect('/signin')
def get(self): if self.member: if self.member.private_token is None: self.member.private_token = hashlib.sha256( str(self.member.num) + ';' + config.site_key).hexdigest() self.member.sync() store.commit() #jon add notifications = memcache.get('nn::' + self.member.username_lower) if notifications is None: #q = db.GqlQuery("SELECT * FROM Notification WHERE for_member_num = :1 ORDER BY num DESC LIMIT 20", self.member.num) q = Notification.selectBy( for_member_num=self.member_num).orderBy('-num').limit(20) notifications = [] i = 0 for n in q: if i == 0: if self.member.notification_position != n.num: self.member.notification_position = n.num self.member.sync() store.commit() #jon add if n.type == 'reply': n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在 <a href="' + n.link1 + '">' + self.escape( n.label1) + u'</a> 里回复了你' notifications.append(n) if n.type == 'mention_reply': n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在回复 <a href="' + n.link1 + '">' + self.escape( n.label1) + u'</a> 时提到了你' notifications.append(n) if n.type == 'mention_topic': n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在创建主题 <a href="' + n.link1 + '">' + self.escape( n.label1) + u'</a> 时提到了你' notifications.append(n) i = i + 1 self.member.notifications = 0 self.member.sync() store.commit() #jon add memcache.set('Member_' + str(self.member.num), self.member, 86400) memcache.set('nn::' + self.member.username_lower, notifications, 360) self.values['notifications'] = notifications self.set_title(u'提醒系统') self.finalize(template_name='notifications', mobile_optimized=True) else: self.redirect('/signin')
def get(self, private_token): n = memcache.get('n_' + private_token) if n is not None: self.values['notification'] = n self.set_header('Content-type', 'application/xml;charset=UTF-8') self.values['member'] = self.member self.finalize(template_name='notifications', template_root='feed', template_type='xml') else: #q = db.GqlQuery("SELECT * FROM Member WHERE private_token = :1", private_token) q = Member.selectBy(private_token=private_token) count = q.count() if count > 0: member = q[0] #q = db.GqlQuery("SELECT * FROM Notification WHERE for_member_num = :1 ORDER BY num DESC LIMIT 20", member.num) q = Notification.selectBy( for_member_num=member.num).orderBy('-num').limit(20) notifications = [] i = 0 for n in q: if n.type == 'reply': n.title = u'' + n.member.username + u' 在 ' + self.escape( n.label1) + u' 里回复了你' n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在 <a href="' + n.link1 + '">' + self.escape( n.label1) + u'</a> 里回复了你' notifications.append(n) if n.type == 'mention_reply': n.title = u'' + n.member.username + u' 在回复 ' + self.escape( n.label1) + u' 时提到了你' n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在回复 <a href="' + n.link1 + '">' + self.escape( n.label1) + u'</a> 时提到了你' notifications.append(n) i = i + 1 self.values['notifications'] = notifications memcache.set('n_' + private_token, notifications, 600) self.set_header('Content-type', 'application/xml;charset=UTF-8') self.values['site'] = GetSite() self.values['member'] = member self.finalize(template_name='notifications', template_root='feed', template_type='xml')
def get(self, screen_name): site = GetSite() member = CheckAuth(self) if member: if member.twitter_oauth == 1: template_values = {} template_values['site'] = site template_values['rnd'] = random.randrange(1, 100) template_values['member'] = member l10n = GetMessages(self, member, site) template_values['l10n'] = l10n template_values['page_title'] = site.title + u' › Twitter › ' + screen_name template_values['screen_name'] = screen_name access_token = OAuthToken.from_string(member.twitter_oauth_string) twitter = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token) rate_limit = memcache.get(str(member.twitter_id) + '::rate_limit') if rate_limit is None: try: rate_limit = twitter.GetRateLimit() memcache.set(str(member.twitter_id) + '::rate_limit', rate_limit, 60) except: logging.info('Failed to get rate limit for @' + member.twitter_screen_name) template_values['rate_limit'] = rate_limit cache_tag = 'twitter::' + screen_name + '::home' statuses = memcache.get(cache_tag) if statuses is None: statuses = twitter.GetUserTimeline(user=screen_name, count = 50) i = 0; for status in statuses: statuses[i].source = statuses[i].source.replace('<a', '<a class="dark"') statuses[i].datetime = datetime.datetime.fromtimestamp(time.mktime(time.strptime(status.created_at, '%a %b %d %H:%M:%S +0000 %Y'))) statuses[i].text = twitter.ConvertMentions(status.text) #statuses[i].text = twitter.ExpandBitly(status.text) i = i + 1 memcache.set(cache_tag, statuses, 120) template_values['statuses'] = statuses path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop') t=self.get_template(path,'twitter_user.html') self.finish(t.render(template_values)) else: self.redirect('/settings') else: self.redirect('/')
def get(self): member = CheckAuth(self) site = GetSite() if member: if member.twitter_oauth == 1: template_values = {} template_values['site'] = site template_values['rnd'] = random.randrange(1, 100) template_values['member'] = member l10n = GetMessages(self, member, site) template_values['l10n'] = l10n template_values['page_title'] = site.title + u' › Twitter › Direct Messages › Inbox' access_token = OAuthToken.from_string(member.twitter_oauth_string) twitter = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token) rate_limit = memcache.get(str(member.twitter_id) + '::rate_limit') if rate_limit is None: try: rate_limit = twitter.GetRateLimit() memcache.set(str(member.twitter_id) + '::rate_limit', rate_limit, 60) except: logging.info('Failed to get rate limit for @' + member.twitter_screen_name) template_values['rate_limit'] = rate_limit cache_tag = 'member::' + str(member.num) + '::twitter::dm::inbox' messages = memcache.get(cache_tag) if messages is None: messages = twitter.GetDirectMessages() i = 0; for message in messages: messages[i].datetime = datetime.datetime.fromtimestamp(time.mktime(time.strptime(message.created_at, '%a %b %d %H:%M:%S +0000 %Y'))) messages[i].text = twitter.ConvertMentions(message.text) #statuses[i].text = twitter.ExpandBitly(status.text) i = i + 1 memcache.set(cache_tag, messages, 120) template_values['messages'] = messages path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop') t=self.get_template(path,'twitter_dm_inbox.html') self.finish(t.render(template_values)) else: self.redirect('/settings') else: self.redirect('/')
def get(self, key): go = '/' member = CheckAuth(self) if member: member = Member.get(member.id) one = Member.get(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.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400) self.redirect(go)
def member(self): if not hasattr(self, "_member"): ip = False member = False if 'X-Real-IP' in self.request.headers: ip = self.request.headers['X-Real-IP'] else: ip = self.request.remote_ip #cookies = Cookies(self, max_age = 86400 * 14, path = '/') auth = self.get_cookie('auth') #if 'auth' in cookies: if auth is not None: #auth = cookies['auth'] member_num = memcache.get(auth) if member_num > 0: member = memcache.get('Member_' + str(member_num)) if member is None: #q = db.GqlQuery("SELECT * FROM Member WHERE num = :1", member_num) q = Member.selectBy(num=member_num) if q.count() == 1: member = q[0] memcache.set('Member_' + str(member_num), member, 86400 * 14) if member: member.ip = ip else: #q = db.GqlQuery("SELECT * FROM Member WHERE auth = :1", auth) q = Member.selectBy(auth=auth) if (q.count() == 1): member_num = q[0].num member = q[0] memcache.set(auth, member_num, 86400 * 14) memcache.set('Member_' + str(member_num), member, 86400 * 14) member.ip = ip self._member = member return self._member
def get(self, one_num): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0] if member: if str(member.created_ts) == str(t): one = GetKindByNum('Member', int(one_num)) if one is not False: if one.num != member.num: #q = db.GqlQuery("SELECT * FROM MemberBookmark WHERE one = :1 AND member_num = :2", one, member.num) q = MemberBookmark.selectBy(one=one, member_num=member.num) if q.count() > 0: bookmark = q[0] bookmark.delete() member = Member.get(member.id) member.favorited_members = member.favorited_members - 1 member.sync() memcache.set('Member_' + str(member.num), member, 86400) n = 'r/m' + str(one.num) + '/m' + str(member.num) memcache.delete(n) one = Member.get(one.id) one.followers_count = one.followers_count - 1 one.sync() store.commit() #jon add memcache.set('Member_' + str(one.num), one, 86400) memcache.set('Member::' + str(one.username_lower), one, 86400) self.redirect(go)
def get(self, one_num): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0] if member: if str(member.created_ts) == str(t): one = GetKindByNum('Member', int(one_num)) if one is not False: if one.num != member.num: #q = db.GqlQuery("SELECT * FROM MemberBookmark WHERE one = :1 AND member_num = :2", one, member.num) q = MemberBookmark.selectBy(one=one, member_num=member.num) if q.count() > 0: bookmark = q[0] bookmark.delete() member = Member.get(member.id) member.favorited_members = member.favorited_members - 1 member.sync() memcache.set('Member_' + str(member.num), member, 86400) n = 'r/m' + str(one.num) + '/m' + str(member.num) memcache.delete(n) one = Member.get(one.id) one.followers_count = one.followers_count - 1 one.sync() store.commit() #jon add memcache.set('Member_' + str(one.num), one, 86400) memcache.set('Member::' + str(one.username_lower), one, 86400) self.redirect(go)
def get(self): if self.member: if self.member.private_token is None: self.member.private_token = hashlib.sha256(str(self.member.num) + ';' + config.site_key).hexdigest() self.member.sync() store.commit() #jon add notifications = memcache.get('nn::' + self.member.username_lower) if notifications is None: #q = db.GqlQuery("SELECT * FROM Notification WHERE for_member_num = :1 ORDER BY num DESC LIMIT 20", self.member.num) q = Notification.selectBy(for_member_num=self.member_num).orderBy('-num').limit(20) notifications = [] i = 0 for n in q: if i == 0: if self.member.notification_position != n.num: self.member.notification_position = n.num self.member.sync() store.commit() #jon add if n.type == 'reply': n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在 <a href="' + n.link1 + '">' + self.escape(n.label1) + u'</a> 里回复了你' notifications.append(n) if n.type == 'mention_reply': n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在回复 <a href="' + n.link1 + '">' + self.escape(n.label1) + u'</a> 时提到了你' notifications.append(n) if n.type == 'mention_topic': n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在创建主题 <a href="' + n.link1 + '">' + self.escape(n.label1) + u'</a> 时提到了你' notifications.append(n) i = i + 1 self.member.notifications = 0 self.member.sync() store.commit() #jon add memcache.set('Member_' + str(self.member.num), self.member, 86400) memcache.set('nn::' + self.member.username_lower, notifications, 360) self.values['notifications'] = notifications self.set_title(u'提醒系统') self.finalize(template_name='notifications', mobile_optimized=True) else: self.redirect('/signin')
def get(self, one_num): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0] if member: if str(member.created_ts) == str(t): one = GetKindByNum('Member', int(one_num)) if one is not False: if one.num != member.num: #q = db.GqlQuery("SELECT * FROM MemberBookmark WHERE one = :1 AND member_num = :2", one, member.num) q = MemberBookmark.selectBy(one=one, member_num=member.num) if q.count() == 0: member = Member.get(member.id) member.favorited_members = member.favorited_members + 1 if member.favorited_members > 30: self.session = Session() self.session['message'] = '最多只能添加 30 位特别关注' else: bookmark = MemberBookmark(member=member) bookmark.one = one bookmark.member_num = member.num bookmark.sync() member.sync() memcache.set('Member_' + str(member.num), member, 86400) n = 'r/m' + str(one.num) + '/m' + str( member.num) memcache.set(n, True, 86400 * 14) one = Member.get(one.id) one.followers_count = one.followers_count + 1 one.sync() store.commit() #jon add memcache.set('Member_' + str(one.num), one, 86400) memcache.set( 'Member::' + str(one.username_lower), one, 86400) self.session = Session() self.session[ 'message'] = '特别关注添加成功,还可以添加 ' + str( 30 - member.favorited_members) + ' 位' self.redirect(go)
def get(self): codes = [ 'EUR', 'JPY', 'CNY', 'CHF', 'AUD', 'TWD', 'CAD', 'GBP', 'HKD', 'MYR', 'NZD', 'PHP', 'SGD', 'THB' ] template_values = {} o = memcache.get('currency.json') if o is not None: pass else: for code in codes: url = 'http://www.google.com/ig/calculator?hl=en&q=1USD=?' + code response = urlfetch.fetch(url) m = re.findall('rhs: "([0-9\.]+)', response.content) if len(m) > 0: value = m[0].strip().replace(' ', '') else: value = 0 template_values[code.lower()] = value path = os.path.join(os.path.dirname(__file__), 'tpl', 'api') t = self.get_template(path, 'currency.json') o = t.render(template_values) memcache.set('currency.json', o, 86400) self.write(o)
def get(self, one_num): if 'Referer' in self.request.headers: go = self.request.headers['Referer'] else: go = '/' member = CheckAuth(self) t = self.request.argument['t'][0] if member: if str(member.created_ts) == str(t): one = GetKindByNum('Member', int(one_num)) if one is not False: if one.num != member.num: #q = db.GqlQuery("SELECT * FROM MemberBookmark WHERE one = :1 AND member_num = :2", one, member.num) q = MemberBookmark.selectBy(one=one, member_num=member.num) if q.count() == 0: member = Member.get(member.id) member.favorited_members = member.favorited_members + 1 if member.favorited_members > 30: self.session = Session() self.session['message'] = '最多只能添加 30 位特别关注' else: bookmark = MemberBookmark(member=member) bookmark.one = one bookmark.member_num = member.num bookmark.sync() member.sync() memcache.set('Member_' + str(member.num), member, 86400) n = 'r/m' + str(one.num) + '/m' + str(member.num) memcache.set(n, True, 86400 * 14) one = Member.get(one.id) one.followers_count = one.followers_count + 1 one.sync() store.commit() #jon add memcache.set('Member_' + str(one.num), one, 86400) memcache.set('Member::' + str(one.username_lower), one, 86400) self.session = Session() self.session['message'] = '特别关注添加成功,还可以添加 ' + str(30 - member.favorited_members) + ' 位' self.redirect(go)
def hasFavorited(self, something): if type(something).__name__ == 'Node': n = 'r/n' + str(something.num) + '/m' + str(self.num) r = memcache.get(n) if r: return r else: #q = db.GqlQuery("SELECT * FROM NodeBookmark WHERE node =:1 AND member = :2", something, self) q = NodeBookmark.selectBy(node=something, member=self) if q.count() > 0: memcache.set(n, True, 86400 * 14) return True else: memcache.set(n, False, 86400 * 14) return False else: if type(something).__name__ == 'Topic': n = 'r/t' + str(something.num) + '/m' + str(self.num) r = memcache.get(n) if r: return r else: #q = db.GqlQuery("SELECT * FROM TopicBookmark WHERE topic =:1 AND member = :2", something, self) q = TopicBookmark.selectBy(topic=something, member=self) if q.count() > 0: memcache.set(n, True, 86400 * 14) return True else: memcache.set(n, False, 86400 * 14) return False else: if type(something).__name__ == 'Member': n = 'r/m' + str(something.num) + '/m' + str(self.num) r = memcache.get(n) if r: return r else: #q = db.GqlQuery("SELECT * FROM MemberBookmark WHERE one =:1 AND member_num = :2", something, self.num) q = MemberBookmark.selectBy(member=something, member_num=self.num) if q.count() > 0: memcache.set(n, True, 86400 * 14) return True else: memcache.set(n, False, 86400 * 14) return False else: return False
def get(self): self.session = Session() member = CheckAuth(self) host = self.request.headers['Host'] if host == 'localhost:10000' or host == '127.0.0.1:10000': # Local debugging logic if member: request_token = self.session['request_token'] twitter = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, request_token) access_token = twitter.getAccessToken() twitter = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token) user = twitter.GetUserInfo() memcache.delete('Member_' + str(member.num)) member = member.id member.twitter_oauth = 1 member.twitter_oauth_key = access_token.key member.twitter_oauth_secret = access_token.secret member.twitter_oauth_string = access_token.to_string() member.twitter_sync = 0 member.twitter_id = user.id member.twitter_name = user.name member.twitter_screen_name = user.screen_name member.twitter_location = user.location member.twitter_description = user.description member.twitter_profile_image_url = user.profile_image_url member.twitter_url = user.url member.twitter_statuses_count = user.statuses_count member.twitter_followers_count = user.followers_count member.twitter_friends_count = user.friends_count member.twitter_favourites_count = user.favourites_count member.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400) self.redirect('/settings') else: self.redirect('/signin') else: # Remote production logic if member and 'request_token' in self.session: request_token = self.session['request_token'] twitter = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, request_token) access_token = twitter.getAccessToken() twitter = OAuthApi(CONSUMER_KEY, CONSUMER_SECRET, access_token) user = twitter.GetUserInfo() memcache.delete('Member_' + str(member.num)) member = member.id member.twitter_oauth = 1 member.twitter_oauth_key = access_token.key member.twitter_oauth_secret = access_token.secret member.twitter_oauth_string = access_token.to_string() member.twitter_sync = 0 member.twitter_id = user.id member.twitter_name = user.name member.twitter_screen_name = user.screen_name member.twitter_location = user.location member.twitter_description = user.description member.twitter_profile_image_url = user.profile_image_url member.twitter_url = user.url member.twitter_statuses_count = user.statuses_count member.twitter_followers_count = user.followers_count member.twitter_friends_count = user.friends_count member.twitter_favourites_count = user.favourites_count member.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400) self.redirect('/settings') else: oauth_token = self.request.arguments['oauth_token'][0] if host == 'v2ex.appspot.com': self.redirect('http://www.v2ex.com/twitter/oauth?oauth_token=' + oauth_token) else: self.redirect('http://v2ex.appspot.com/twitter/oauth?oauth_token=' + oauth_token)
def get(self, platform, soldier): ua = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13' referer = 'http://bfbcs.com/' + platform cache_tag = 'bfbcs::' + platform + '/' + soldier raw = memcache.get(cache_tag) url = 'http://bfbcs.com/stats_' + platform + '/' + soldier if raw is None: response = urlfetch.fetch(url, headers={ 'User-Agent': ua, 'Referer': referer }) raw = response.content memcache.set(cache_tag, raw, 600) pcode = re.findall('([a-z0-9]{32})', raw) self.response.out.write('<strong>PCODE</strong> ' + str(pcode[0]) + '<br />') if len(pcode) == 1: pcode = pcode[0] payload = 'request=addplayerqueue&pcode=' + pcode self.response.out.write('<strong>PAYLOAD</strong> ' + payload + ' (' + str(len(payload)) + ' bytes)<br />') headers = { 'User-Agent': ua, 'Referer': url, 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Content-Length': '61', 'Accept': 'application/json, text/javascript, */*', 'Accept-Language': 'en-us,en;q=0.5', 'Accept-Encoding': 'gzip,deflate', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Keep-Alive': 115, 'Host': 'bfbcs.com', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'Cookie': '__utma=7878317.1843709575.1297205447.1298572822.1298577848.12; __utmz=7878317.1297205447.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); sessid=enqd028n30d2tr4lv4ned04qi0; __utmb=7878317.21.10.1298577848; __utmc=7878317' } response = urlfetch.fetch(url, payload=payload, headers=headers, method='POST') if response.status_code == 500: response = urlfetch.fetch(url, payload=payload, headers=headers, method='POST') if response.status_code == 500: self.write('<strong>FAILED</strong>') else: self.write('<strong>RESULT</strong> OK ' + response.content) else: self.write('<strong>RESULT</strong> OK ' + response.content)
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 #template_values['xsrf'] = self.xsrf_form_html() if (member): dest = '/settings/avatar' timestamp = str(int(time.time())) try: avatar = self.request.arguments['avatar'][0] except: return self.redirect(dest) if avatar is None: return self.redirect(dest) avatar_len = len(avatar) if avatar_len == 0: return self.redirect(dest) s = StringIO.StringIO() s.write(avatar) images = Image.open(s) avatar_73 = images.resize(73, 73) avatar_48 = images.resize(48, 48) avatar_24 = images.resize(24, 24) # Large 73x73 #q1 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", 'avatar_' + str(member.num) + '_large') q1 = Avatar.selectBy(name='avatar_' + str(member.num) + '_large') if (q1.count() == 1): avatar_large = q1[0] avatar_large.content = avatar_73 avatar_large.sync() store.commit() #jon add else: #qc1 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", 'avatar.max') qc1 =Counter.selectBy(name='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.sync() store.commit() #jon add avatar_large = Avatar() avatar_large.name = 'avatar_' + str(member.num) + '_large' avatar_large.content = avatar_73 avatar_large.num = counter1.value avatar_large.sync() store.commit() #jon add member.avatar_large_url = '/avatar/' + str(member.num) + '/large?r=' + timestamp member.sync() store.commit() #jon add # Normal 48x48 #q2 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", 'avatar_' + str(member.num) + '_normal') q2 = Avatar.selectBy(name='avatar_' + str(member.num) + '_normal') if (q2.count() == 1): avatar_normal = q2[0] avatar_normal.content = avatar_48 avatar_normal.sync() store.commit() #jon add else: #qc2 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", 'avatar.max') qc2 = Counter.selectBy(name='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.sync() avatar_normal = Avatar() avatar_normal.name = 'avatar_' + str(member.num) + '_normal' avatar_normal.content = avatar_48 avatar_normal.num = counter2.value avatar_normal.sync() store.commit() #jon add member.avatar_normal_url = '/avatar/' + str(member.num) + '/normal?r=' + timestamp member.sync() store.commit() #jon add # Mini 24x24 #q3 = db.GqlQuery("SELECT * FROM Avatar WHERE name = :1", 'avatar_' + str(member.num) + '_mini') q3 = Avatar.selectBy(name='avatar_' + str(member.num) + '_mini') if (q3.count() == 1): avatar_mini = q3[0] avatar_mini.content = avatar_24 avatar_mini.sync() else: #qc3 = db.GqlQuery("SELECT * FROM Counter WHERE name = :1", 'avatar.max') qc3 = Counter.selectBy(name='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.sync() avatar_mini = Avatar() avatar_mini.name = 'avatar_' + str(member.num) + '_mini' avatar_mini.content = avatar_24 avatar_mini.num = counter3.value avatar_mini.sync() store.commit() #jon add member.avatar_mini_url = '/avatar/' + str(member.num) + '/mini?r=' + timestamp member.sync() store.commit() #jon add # 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.sync() store.commit() #jon add # Upload to UpYun if config.upyun_enabled: u = UpYun(config.upyun_bucket, config.upyun_username, config.upyun_password) # Mini mini = avatar_24 u.setContentMD5(md5(mini)) mini_suffix = '/avatars/mini/' + str(member.num) + '.png' r = u.writeFile(mini_suffix, mini, True) if r == True: member.avatar_mini_url = 'http://' + config.upyun_bucket + '.b0.upaiyun.com' + mini_suffix + '?r=' + timestamp # Normal normal = avatar_48 u.setContentMD5(md5(normal)) normal_suffix = '/avatars/normal/' + str(member.num) + '.png' r = u.writeFile(normal_suffix, normal, True) if r == True: member.avatar_normal_url = 'http://' + config.upyun_bucket + '.b0.upaiyun.com' + normal_suffix + '?r=' + timestamp # Large large = avatar_73 u.setContentMD5(md5(large)) large_suffix = '/avatars/large/' + str(member.num) + '.png' r = u.writeFile(large_suffix, large, True) if r == True: member.avatar_large_url = 'http://' + config.upyun_bucket + '.b0.upaiyun.com' + large_suffix + '?r=' + timestamp member.sync() store.commit() #jon add memcache.set('Member_' + str(member.num), member, 86400 * 14) memcache.set('Member::' + member.username_lower, member, 86400 * 14) 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')
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.github: github = memcache.get('Member::' + one.username_lower + '::github') if github is None: response = urlfetch.fetch("https://api.github.com/users/" + one.github + "/repos") if response.status_code == 200: github = response.content memcache.set('Member::' + one.username_lower + '::github', github, 86400) if github is not None: template_values['github_repos'] = sorted(json.loads(github), key=lambda x:x['stargazers_count'], reverse=True) if one is not False: member_blog = memcache.get('member::' + str(one.num) + '::blog') if member_blog == None: #blog = db.GqlQuery("SELECT * FROM Topic WHERE node_name = :1 AND member_num = :2 ORDER BY created DESC LIMIT 1", 'blog', one.num) blog = Topic.selectBy(member_num=one.num, node_name='blog').orderBy('-created').limit(1) if blog.count() > 0: template_values['blog'] = blog[0] memcache.set('member::' + str(one.num) + '::blog', blog[0], 7200) else: template_values['blog'] = member_blog member_topics = memcache.get('member::' + str(one.num) + '::topics') if member_topics != None: template_values['topics'] = member_topics else: #q2 = db.GqlQuery("SELECT * FROM Topic WHERE member_num = :1 ORDER BY created DESC LIMIT 10", one.num) q2 = Topic.selectBy(member_num=one.num).orderBy('-created').limit(10) template_values['topics'] = q2 memcache.set('member::' + str(one.num) + '::topics', q2, 7200) 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 10", one.num) q3 = Reply.selectBy(member_num=one.num).orderBy('-created').limit(10) 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' ) filename = 'member_home.html' else: path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop') filename = 'member_home.html' else: if browser['ios']: path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile') filename = 'member_not_found.html' else: path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop') filename = 'member_not_found.html' print one.created t=self.get_template(path, filename) self.finish(t.render(template_values))
def post(self): self.session = Session() site = GetSite() browser = detect(self.request) template_values = {} template_values['site'] = site 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.arguments['password_new'][0].strip() if (len(password_new) > 0): password_update = True if (len(password_new) > 32): password_error = 1 else: password_current = self.request.arguments['password_current'][0].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.sync() store.commit() #jon add self.response.headers['Set-Cookie'] = 'auth=' + member.auth + '; expires=' + (datetime.datetime.now(pytz.timezone('Asia/Shanghai')) + 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.arguments['email'][0].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) q = Member.select(AND(Member.q.email==member_email.lower(), Member.q.num!=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.arguments['website'][0].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.arguments['twitter'][0].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: psn member_psn_error = 0 member_psn_error_messages = ['', u'PSN ID 长度不能超过 20 个字符', u'PSN ID 不符合规则' ] member_psn = self.request.arguments['psn'][0].strip() if (len(member_psn) == 0): member_psn = '' else: if (len(member_psn) > 20): errors = errors + 1 member_psn_error = 1 else: p = re.compile('^[a-zA-Z0-9\-\_]+$') if (p.search(member_psn)): errors = errors else: errors = errors + 1 member_psn_error = 2 template_values['member_psn'] = member_psn template_values['member_psn_error'] = member_psn_error template_values['member_psn_error_message'] = member_psn_error_messages[member_psn_error] # Verification: my_home member_my_home_error = 0 member_my_home_error_messages = ['', u'不是一个合法的自定义首页跳转位置', u'自定义首页跳转位置长度不能超过 32 个字符', u'自定义首页跳转位置必须以 / 开头' ] member_my_home = self.request.arguments['my_home'][0].strip() if len(member_my_home) > 0: if member_my_home == '/' or member_my_home.startswith('/signout'): member_my_home_error = 1 errors = errors + 1 else: if len(member_my_home) > 32: member_my_home_error = 2 errors = errors + 1 else: if member_my_home.startswith('/') is not True: member_my_home_error = 3 errors = errors + 1 template_values['member_my_home'] = member_my_home template_values['member_my_home_error'] = member_my_home_error template_values['member_my_home_error_message'] = member_my_home_error_messages[member_my_home_error] # Verification: btc member_btc_error = 0 member_btc_error_messages = ['', u'BTC 收款地址长度不能超过 40 个字符', u'BTC 收款地址不符合规则' ] member_btc = self.request.arguments['btc'][0].strip() if (len(member_btc) == 0): member_btc = '' else: if (len(member_btc) > 40): errors = errors + 1 member_btc_error = 1 else: p = re.compile('^[a-zA-Z0-9]+$') if (p.search(member_btc)): errors = errors else: errors = errors + 1 member_btc_error = 2 template_values['member_btc'] = member_btc template_values['member_btc_error'] = member_btc_error template_values['member_btc_error_message'] = member_btc_error_messages[member_btc_error] # Verification: github member_github_error = 0 member_github_error_messages = ['', u'GitHub 用户名长度不能超过 40 个字符', u'GitHub 用户名不符合规则' ] member_github = self.request.arguments['github'][0].strip() if (len(member_github) == 0): member_github = '' else: if (len(member_github) > 40): errors = errors + 1 member_github_error = 1 else: p = re.compile('^[a-zA-Z0-9\_]+$') if (p.search(member_github)): errors = errors else: errors = errors + 1 member_github_error = 2 template_values['member_github'] = member_github template_values['member_github_error'] = member_github_error template_values['member_github_error_message'] = member_github_error_messages[member_github_error] # Verification: location member_location_error = 0 member_location_error_messages = ['', u'所在地长度不能超过 40 个字符' ] member_location = self.request.arguments['location'][0].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.arguments['tagline'][0].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.arguments['bio'][0].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] # Verification: show_home_top and show_quick_post try: member_show_home_top = int(self.request.arguments['show_home_top'][0]) except: member_show_home_top = 1 try: member_show_quick_post = int(self.request.arguments['show_quick_post'][0]) except: member_show_quick_post = 0 if member_show_home_top not in [0, 1]: member_show_home_top = 1 if member_show_quick_post not in [0, 1]: member_show_quick_post = 0 # Verification: l10n member_l10n = self.request.arguments['l10n'][0].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.arguments['twitter_sync'][0] if member_twitter_sync == 'on': member_twitter_sync = 1 else: member_twitter_sync = 0 template_values['member_twitter_sync'] = member_twitter_sync # Verification: use_my_css member_use_my_css = self.request.arguments['use_my_css'][0] if member_use_my_css == 'on': member_use_my_css = 1 else: member_use_my_css = 0 template_values['member_use_my_css'] = member_use_my_css # Verification: my_css member_my_css_error = 0 member_my_css_error_messages = ['', u'CSS Hack cannot be longer than 2000 characters' ] member_my_css = self.request.arguments['my_css'][0].strip() if (len(member_my_css) == 0): member_my_css = '' else: if (len(member_my_css) > 2000): errors = errors + 1 member_my_css_error = 1 template_values['member_my_css'] = member_my_css template_values['member_my_css_error'] = member_my_css_error template_values['member_my_css_error_message'] = member_my_css_error_messages[member_my_css_error] template_values['errors'] = errors if (errors == 0): member.email = member_email.lower() member.website = member_website member.twitter = member_twitter member.psn = member_psn member.btc = member_btc member.github = member_github member.location = member_location member.tagline = member_tagline if member.twitter_oauth == 1: member.twitter_sync = member_twitter_sync member.use_my_css = member_use_my_css member.my_css = member_my_css if member_my_home_error == 0 and len(member_my_home) > 0: member.my_home = member_my_home else: if member_my_home_error == 0: member.my_home = None member.bio = member_bio member.show_home_top = member_show_home_top member.show_quick_post = member_show_quick_post member.l10n = member_l10n member.sync() store.commit() #jon add memcache.delete('Member::' + str(member.username)) memcache.delete('Member::' + str(member.username_lower)) memcache.set('Member_' + str(member.num), member, 86400) self.session['message'] = '个人设置成功更新' self.redirect('/settings') else: if browser['ios']: path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile') else: path = os.path.join(os.path.dirname(__file__), 'tpl', 'desktop') t=self.get_template(path, 'member_settings.html') self.finish(t.render(template_values)) else: self.redirect('/signin')