Пример #1
0
 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)
Пример #2
0
 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')
Пример #3
0
    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
Пример #4
0
 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)
Пример #5
0
 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)
Пример #6
0
 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)
Пример #7
0
 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')
Пример #8
0
 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)
Пример #9
0
 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)
Пример #10
0
 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)
Пример #11
0
 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)
Пример #12
0
 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)
Пример #13
0
 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)
Пример #14
0
 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)
Пример #15
0
 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('/')
Пример #16
0
 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('/')
Пример #17
0
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
Пример #18
0
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
Пример #19
0
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
Пример #20
0
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
Пример #21
0
 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))
Пример #22
0
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
Пример #23
0
 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)
Пример #24
0
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
Пример #25
0
 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')
Пример #26
0
 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')
Пример #27
0
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
Пример #28
0
 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)
Пример #29
0
 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')
Пример #30
0
 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)
Пример #31
0
 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')
Пример #32
0
 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')
Пример #33
0
 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')
Пример #34
0
 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('/')
Пример #35
0
 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('/')
Пример #36
0
 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)
Пример #37
0
 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
Пример #38
0
 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)
Пример #39
0
 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)
Пример #40
0
 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')
Пример #41
0
 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)
Пример #42
0
 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)
Пример #43
0
 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)
Пример #44
0
 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
Пример #45
0
 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)        
Пример #46
0
 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)
Пример #47
0
    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')
Пример #48
0
    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))
Пример #49
0
    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')