Exemple #1
0
def UnfollowMemberHandler(request, one_num):
    if request.method == 'GET':
        if 'HTTP_REFERER' in request.META:
            go = request.META['HTTP_REFERER']
        else:
            go = '/'
        member = CheckAuth(request)
        if member:
            one = GetKindByNum('Member', int(one_num))
            if one is not False:
                if one.num != member.num:
                    q = MemberBookmark.objects.filter(one=one, member_num=member.num)
                    if len(q) > 0:
                        bookmark = q[0]
                        bookmark.delete()
                        member = Member.objects.get(id=member.id)
                        member.favorited_members = member.favorited_members - 1
                        member.save()
                        memcache.set('Member_' + str(member.num), member, 86400)
                        n = 'r/m' + str(one.num) + '/m' + str(member.num)
                        memcache.delete(n)
                        one = Member.objects.get(id=one.id)
                        one.followers_count = one.followers_count - 1
                        one.save()
                        memcache.set('Member_' + str(one.num), one, 86400)
                        memcache.set('Member::' + str(one.username_lower), one, 86400)
        return HttpResponseRedirect(go)
Exemple #2
0
def UnfollowMemberHandler(request, one_num):
    if request.method == 'GET':
        if 'HTTP_REFERER' in request.META:
            go = request.META['HTTP_REFERER']
        else:
            go = '/'
        member = CheckAuth(request)
        if member:
            one = GetKindByNum('Member', int(one_num))
            if one is not False:
                if one.num != member.num:
                    q = MemberBookmark.objects.filter(one=one,
                                                      member_num=member.num)
                    if len(q) > 0:
                        bookmark = q[0]
                        bookmark.delete()
                        member = Member.objects.get(id=member.id)
                        member.favorited_members = member.favorited_members - 1
                        member.save()
                        memcache.set('Member_' + str(member.num), member,
                                     86400)
                        n = 'r/m' + str(one.num) + '/m' + str(member.num)
                        memcache.delete(n)
                        one = Member.objects.get(id=one.id)
                        one.followers_count = one.followers_count - 1
                        one.save()
                        memcache.set('Member_' + str(one.num), one, 86400)
                        memcache.set('Member::' + str(one.username_lower), one,
                                     86400)
        return HttpResponseRedirect(go)
Exemple #3
0
def SettingsPasswordHandler(request):
    if request.method == 'POST':
        site = GetSite()
        browser = detect(request)
        session = request.session
        template_values = {}
        template_values['site'] = site
        template_values['page_title'] = site.title + u' › 密码设置'
        template_values['system_version'] = SYSTEM_VERSION
        errors = 0
        member = CheckAuth(request)
        l10n = GetMessages(member, site)
        template_values['l10n'] = l10n
        if (member):
            template_values['member'] = member
            template_values['member_username'] = member.user.username
            template_values['member_email'] = member.user.email
            # Verification: password
            password_error = 0
            password_update = False
            password_error_messages = ['',
                '新密码长度不能超过 32 个字符',
                '请输入当前密码',
                '当前密码不正确'
            ]
            password_new = request.POST['password_new'].strip()
            if (len(password_new) > 0):
                password_update = True
                if (len(password_new) > 32):
                    password_error = 1
                else:
                    password_current = request.POST['password_current'].strip()
                    if (len(password_current) == 0):
                        password_error = 2
                    else:
                        if not member.user.check_password(password_current):
                            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.user.set_password(password_new)
                member.user.save()
                member.auth = hashlib.sha1(str(member.num) + ':' + member.user.password).hexdigest()
                member.save()
                memcache.set(member.auth, member.num, 86400 * 365)
                memcache.set('Member_' + str(member.num), member, 86400 * 365)
                session['message'] = '密码已成功更新,下次请用新密码登录'
                #self.response.headers['Set-Cookie'] = 'auth=' + member.auth + '; expires=' + (datetime.datetime.now() + datetime.timedelta(days=365)).strftime("%a, %d-%b-%Y %H:%M:%S GMT") + '; path=/'
                #self.redirect('/settings')
                return HttpResponseRedirect('/settings')
            else:
                if browser['ios']:
                    path = os.path.join('mobile', 'member_settings_password.html')
                else:
                    path = os.path.join('desktop', 'member_settings_password.html')
                return render_to_response(path, template_values)
        else:
            return HttpResponseRedirect('/signin')
Exemple #4
0
def NotificationsHandler(request):
    if request.method == 'GET':
        site = GetSite()
        browser = detect(request)
        template_values = {}
        template_values['site'] = site
        template_values['system_version'] = SYSTEM_VERSION
        member = CheckAuth(request)
        l10n = GetMessages(member, site)
        template_values['l10n'] = l10n
        template_values['page_title'] = site.title + u' › ' + l10n.create_new_topic.decode('utf-8')
        if member:
            template_values['member'] = member
            if member.private_token is None:
                member.private_token = hashlib.sha256(str(member.num) + ';' + config.site_key).hexdigest()
                member.save()
            notifications = memcache.get('nn::' + member.username_lower)
            if notifications is None:
                q = Notification.objects.filter(for_member_num=member.num).order_by('-num')[:50]
                notifications = []
                i = 0
                for n in q:
                    if i == 0:
                        if member.notification_position != n.num:
                            member.notification_position = n.num
                            member.save()
                    if n.type == 'reply':
                        n.text = u'<a href="/member/' + n.member.user.username + u'"><strong>' + n.member.user.username + u'</strong></a> 在 <a href="' + n.link1 + '">' + escape(n.label1) + u'</a> 里回复了你'
                        notifications.append(n)
                    if n.type == 'mention_reply':
                        n.text = u'<a href="/member/' + n.member.user.username + u'"><strong>' + n.member.user.username + u'</strong></a> 在回复 <a href="' + n.link1 + '">' + escape(n.label1) + u'</a> 时提到了你'
                        notifications.append(n)
                    if n.type == 'mention_topic':
                        n.text = u'<a href="/member/' + n.member.user.username + u'"><strong>' + n.member.user.username + u'</strong></a> 在创建主题 <a href="' + n.link1 + '">' + escape(n.label1) + u'</a> 时提到了你'
                        notifications.append(n)
                    if n.type == 'follow':
                        n.text = u'<a href="/member/' + n.member.user.username + u'"><strong>' + n.member.user.username + u'</strong></a> 关注了你'
                        notifications.append(n)
                    i = i + 1
                member.notifications = 0
                member.save()
                memcache.set('Member_' + str(member.num), member, 86400)
                memcache.set('nn::' + member.username_lower, notifications, 360)
            template_values['notifications'] = notifications
            template_values['title'] = u'提醒系统'
            path = os.path.join('desktop', 'notifications.html')
            return render_to_response(path, template_values)
        else:
            return HttpResponseRedirect('/signin')
Exemple #5
0
def TwitterTweetHandler(request):
    if request.method == 'POST':
        if 'HTTP_REFERER' in request.META:
            go = request.META['HTTP_REFERER']
        else:
            go = '/'
        member = CheckAuth(request)
        if member:
            if member.twitter_oauth == 1:
                status = request.POST['status']
                if len(status) > 140:
                    status = status[0:140]
                access_token = OAuthToken.from_string(
                    member.twitter_oauth_string)
                twitter = OAuthApi(config.twitter_consumer_key,
                                   config.twitter_consumer_secret,
                                   access_token)
                try:
                    twitter.PostUpdate(status.encode('utf-8'))
                    memcache.delete('member::' + str(member.num) +
                                    '::twitter::home')
                except:
                    logging.error('Failed to tweet: ' + status)
                return HttpResponseRedirect(go)
            else:
                return HttpResponseRedirect('/twitter/link/')
        else:
            return HttpResponseRedirect('/')
Exemple #6
0
def MyNodesHandler(request):
    if request.method == 'GET':
        member = CheckAuth(request)
        if member:
            site = GetSite()
            l10n = GetMessages(member, site)
            template_values = {}
            template_values['site'] = site
            template_values['member'] = member
            template_values['l10n'] = l10n
            template_values['page_title'] = site.title + u' › 我收藏的节点'
            template_values['rnd'] = random.randrange(1, 100)
            if member.favorited_nodes > 0:
                template_values['has_nodes'] = True
                q = NodeBookmark.objects.filter(member=member).order_by('-created')[:10]
                template_values['column_1'] = q
                if member.favorited_nodes > 10:
                    q2 = NodeBookmark.objects.filter(member=member).order_by('-created')[10:10]
                    template_values['column_2'] = q2
            else:
                template_values['has_nodes'] = False
            path = os.path.join('desktop', 'my_nodes.html')
            return render_to_response(path, template_values)
        else:
            return HttpResponseRedirect('/')
Exemple #7
0
def MyTopicsHandler(request):
    if request.method == 'GET':
        member = CheckAuth(request)
        if member:
            site = GetSite()
            l10n = GetMessages(member, site)
            template_values = {}
            template_values['site'] = site
            template_values['member'] = member
            template_values['l10n'] = l10n
            template_values['page_title'] = site.title + u' › 我收藏的主题'
            template_values['rnd'] = random.randrange(1, 100)
            if member.favorited_topics > 0:
                template_values['has_topics'] = True
                q = TopicBookmark.objects.filter(member=member).order_by('-created')
                bookmarks = []
                for bookmark in q:
                    try:
                        topic = bookmark.topic
                        bookmarks.append(bookmark)
                    except:
                        bookmark.delete()
                template_values['bookmarks'] = bookmarks
            else:
                template_values['has_topics'] = False
            path = os.path.join('desktop', 'my_topics.html')
            return render_to_response(path, template_values)
        else:
            return HttpResponseRedirect('/')
Exemple #8
0
def TwitterUnlinkHandler(request):
    if request.method == 'GET':
        member = CheckAuth(request)
        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.save()
            memcache.set('Member_' + str(member.num), member, 86400)
            return HttpResponseRedirect('/settings')
        else:
            return HttpResponseRedirect('/signin')
Exemple #9
0
def TwitterUserTimelineHandler(request, screen_name):
    if request.method == 'GET':
        site = GetSite()
        member = CheckAuth(request)
        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(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(config.twitter_consumer_key,
                                   config.twitter_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 def="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('desktop', 'twitter_user.html')
                return render_to_response(path, template_values)
            else:
                return HttpResponseRedirect('/settings/')
        else:
            return HttpResponseRedirect('/')
Exemple #10
0
def TwitterDMInboxHandler(request):
    if request.method == 'GET':
        member = CheckAuth(request)
        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(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(config.twitter_consumer_key,
                                   config.twitter_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('desktop', 'twitter_dm_inbox.html')
                return render_to_response(path, template_values)
            else:
                return HttpResponseRedirect('/settings')
        else:
            return HttpResponseRedirect('/')
Exemple #11
0
 def get(self, key):
     go = '/'
     member = CheckAuth(request)
     if member:
         member = db.get(member.key())
         one = db.get(db.Key(key))
         if one:
             if one.num != member.num:
                 try:
                     blocked = pickle.loads(member.blocked.encode('utf-8'))
                 except:
                     blocked = []
                 if len(blocked) == 0:
                     blocked = []
                 if one.num not in blocked:
                     blocked.append(one.num)
                 member.blocked = pickle.dumps(blocked)
                 member.put()
                 memcache.set('Member_' + str(member.num), member, 86400)
     self.redirect(go)
Exemple #12
0
def TwitterLinkHandler(request):
    if request.method == 'GET':
        session = request.session
        member = CheckAuth(request)
        if member:
            twitter = OAuthApi(config.twitter_consumer_key,
                               config.twitter_consumer_secret)
            request_token = twitter.getRequestToken()
            authorization_url = twitter.getAuthorizationURL(request_token)
            session['request_token'] = request_token
            return HttpResponseRedirect(authorization_url)
        else:
            return HttpResponseRedirect('/signin')
Exemple #13
0
def UnfavoriteNodeHandler(request, node_name):
    print node_name
    if request.method == 'GET':
        if 'HTTP_REFERER' in request.META:
            go = request.META['HTTP_REFERER']
        else:
            go = '/'
        member = CheckAuth(request)
        if member:
            node = GetKindByName('Node', node_name)
            if node is not False:
                q = NodeBookmark.objects.filter(node=node, member=member)
                if len(q) > 0:
                    bookmark = q[0]
                    bookmark.delete()
                    member = Member.objects.get(id=member.id)
                    member.favorited_nodes = member.favorited_nodes - 1
                    member.save()
                    memcache.set('Member_' + str(member.num), member, 86400)
                    n = 'r/n' + str(node.num) + '/m' + str(member.num)
                    memcache.delete(n)
        return HttpResponseRedirect(go)
Exemple #14
0
def UnfavoriteTopicHandler(request, topic_num):
    if request.method == 'GET':
        if 'HTTP_REFERER' in request.META:
            go = request.META['HTTP_REFERER']
        else:
            go = '/'
        member = CheckAuth(request)
        if member:
            topic = GetKindByNum('Topic', int(topic_num))
            if topic is not False:
                q = TopicBookmark.objects.filter(topic=topic, member=member)
                if len(q) > 0:
                    bookmark = q[0]
                    bookmark.delete()
                    member = Member.objects.get(id=member.id)
                    member.favorited_topics = member.favorited_topics - 1
                    member.save()
                    memcache.set('Member_' + str(member.num), member, 86400)
                    n = 'r/t' + str(topic.num) + '/m' + str(member.num)
                    memcache.delete(n)
                    MinusStarTopicHandler(topic.id)
        return HttpResponseRedirect(go)
Exemple #15
0
def UnfavoriteNodeHandler(request, node_name):
    print node_name
    if request.method == 'GET':
        if 'HTTP_REFERER' in request.META:
            go = request.META['HTTP_REFERER']
        else:
            go = '/'
        member = CheckAuth(request)
        if member:
            node = GetKindByName('Node', node_name)
            if node is not False:
                q = NodeBookmark.objects.filter(node=node, member=member)
                if len(q) > 0:
                    bookmark = q[0]
                    bookmark.delete()
                    member = Member.objects.get(id=member.id)
                    member.favorited_nodes = member.favorited_nodes - 1
                    member.save()
                    memcache.set('Member_' + str(member.num), member, 86400)
                    n = 'r/n' + str(node.num) + '/m' + str(member.num)
                    memcache.delete(n)
        return HttpResponseRedirect(go)
Exemple #16
0
def UnfavoriteTopicHandler(request, topic_num):
    if request.method == 'GET':
        if 'HTTP_REFERER' in request.META:
            go = request.META['HTTP_REFERER']
        else:
            go = '/'
        member = CheckAuth(request)
        if member:
            topic = GetKindByNum('Topic', int(topic_num))
            if topic is not False:
                q = TopicBookmark.objects.filter(topic=topic, member=member)
                if len(q) > 0:
                    bookmark = q[0]
                    bookmark.delete()
                    member = Member.objects.get(id=member.id)
                    member.favorited_topics = member.favorited_topics - 1
                    member.save()
                    memcache.set('Member_' + str(member.num), member, 86400)
                    n = 'r/t' + str(topic.num) + '/m' + str(member.num)
                    memcache.delete(n)
                    MinusStarTopicHandler(topic.id)
        return HttpResponseRedirect(go)
Exemple #17
0
def TwitterUnlinkHandler(request):
    if request.method == "GET":
        member = CheckAuth(request)
        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.save()
            memcache.set("Member_" + str(member.num), member, 86400)
            return HttpResponseRedirect("/settings")
        else:
            return HttpResponseRedirect("/signin")
Exemple #18
0
    def get(self, key):
        go = '/'
        member = CheckAuth(request)
        if member:
            member = db.get(member.key())
            one = db.get(db.Key(key))
            if one:
                if one.num != member.num:
                    try:
                        blocked = pickle.loads(member.blocked.encode('utf-8'))
                    except:
                        blocked = []
                    if len(blocked) == 0:
                        blocked = []
                    if one.num  in blocked:
                        blocked.remove(one.num)
                    member.blocked = pickle.dumps(blocked)
                    member.put()
                    memcache.set('Member_' + str(member.num), member, 86400)
        self.redirect(go)

#def main():
#    application = webapp.WSGIApplication([
#    ('/member/([a-z0-9A-Z\_\-]+)', MemberHandler),
#    ('/member/([a-z0-9A-Z\_\-]+).json', MemberApiHandler),
#    ('/settings', SettingsHandler),
#    ('/settings/password', SettingsPasswordHandler),
#    ('/settings/avatar', SettingsAvatarHandler),
#    ('/block/(.*)', MemberBlockHandler),
#    ('/unblock/(.*)', MemberUnblockHandler)
#    ],
#                                         debug=True)
#    util.run_wsgi_app(application)
#
#
#if __name__ == '__main__':
#    main()
Exemple #19
0
def PlaceMessageRemoveHandler(request, message_num):
    if request.method == 'GET':
        site = GetSite()
        if 'HTTP_REFERER' in request.META:
            go = request.META['HTTP_REFERER']
        else:
            go = '/place/'
        member = CheckAuth(request)
        if member:
            message = PlaceMessage.objects.filter(num=int(message_num))
            if message and len(message) == 1:
                if message[0].member.num == member.num:
                    message.delete()
                    q = Counter.objects.filter(name='place_message.total')
                    if (q.count() == 1):
                        counter = q[0]
                        counter.value = counter.value - 1
                        counter.save()
        return HttpResponseRedirect(go)
Exemple #20
0
def MyFollowingHandler(request):
    if request.method == 'GET':
        member = CheckAuth(request)
        if member:
            site = GetSite()
            l10n = GetMessages(member, site)
            template_values = {}
            template_values['site'] = site
            template_values['member'] = member
            template_values['l10n'] = l10n
            template_values['page_title'] = site.title + u' › 我的特别关注'
            template_values['rnd'] = random.randrange(1, 100)
            if member.favorited_members > 0:
                template_values['has_following'] = True
                q = MemberBookmark.objects.filter(member_num=member.num).order_by('-created')
                template_values['following'] = q
                following = []
                for bookmark in q:
                    following.append(bookmark.one.num)
                q2 = Topic.objects.filter(member_num__in=following).order_by('-created')[:20]
                template_values['latest'] = q2
            else:
                template_values['has_following'] = False
            path = os.path.join('desktop', 'my_following.html')
            return render_to_response(path, template_values)
        else:
            return HttpResponseRedirect('/')

#def main():
#    application = webapp.WSGIApplication([
#    ('/my/nodes', MyNodesHandler),
#    ('/my/topics', MyTopicsHandler),
#    ('/my/following', MyFollowingHandler)
#    ],
#                                         debug=True)
#    util.run_wsgi_app(application)
#
#
#if __name__ == '__main__':
#    main()
Exemple #21
0
 def get(self, key):
     go = '/'
     member = CheckAuth(request)
     if member:
         member = db.get(member.key())
         one = db.get(db.Key(key))
         if one:
             if one.num != member.num:
                 try:
                     blocked = pickle.loads(member.blocked.encode('utf-8'))
                 except:
                     blocked = []
                 if len(blocked) == 0:
                     blocked = []
                 if one.num not in blocked:
                     blocked.append(one.num)
                 member.blocked = pickle.dumps(blocked)
                 member.put()
                 memcache.set('Member_' + str(member.num), member, 86400)
     self.redirect(go)
Exemple #22
0
    def get(self, key):
        go = '/'
        member = CheckAuth(request)
        if member:
            member = db.get(member.key())
            one = db.get(db.Key(key))
            if one:
                if one.num != member.num:
                    try:
                        blocked = pickle.loads(member.blocked.encode('utf-8'))
                    except:
                        blocked = []
                    if len(blocked) == 0:
                        blocked = []
                    if one.num in blocked:
                        blocked.remove(one.num)
                    member.blocked = pickle.dumps(blocked)
                    member.put()
                    memcache.set('Member_' + str(member.num), member, 86400)
        self.redirect(go)


#def main():
#    application = webapp.WSGIApplication([
#    ('/member/([a-z0-9A-Z\_\-]+)', MemberHandler),
#    ('/member/([a-z0-9A-Z\_\-]+).json', MemberApiHandler),
#    ('/settings', SettingsHandler),
#    ('/settings/password', SettingsPasswordHandler),
#    ('/settings/avatar', SettingsAvatarHandler),
#    ('/block/(.*)', MemberBlockHandler),
#    ('/unblock/(.*)', MemberUnblockHandler)
#    ],
#                                         debug=True)
#    util.run_wsgi_app(application)
#
#
#if __name__ == '__main__':
#    main()
Exemple #23
0
def TwitterCallbackHandler(request):
    if request.method == 'GET':
        session = request.session
        member = CheckAuth(request)
        host = request.META['HTTP_HOST']
        if host == 'localhost:8000' or host == '127.0.0.1:8000':
            # Local debugging logic
            if member:
                request_token = session['request_token']
                twitter = OAuthApi(config.twitter_consumer_key,
                                   config.twitter_consumer_secret,
                                   request_token)
                access_token = twitter.getAccessToken()
                twitter = OAuthApi(config.twitter_consumer_key,
                                   config.twitter_consumer_secret,
                                   access_token)
                user = twitter.GetUserInfo()
                memcache.delete('Member_' + str(member.num))
                member = Member.objects.filter(num=member.num)[0]
                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.save()
                memcache.set('Member_' + str(member.num), member, 86400)
                return HttpResponseRedirect('/settings')
            else:
                return HttpResponseRedirect('/signin')
        else:
            # Remote production logic
            if member and 'request_token' in session:
                request_token = session['request_token']
                twitter = OAuthApi(config.twitter_consumer_key,
                                   config.twitter_consumer_secret,
                                   request_token)
                access_token = twitter.getAccessToken()
                twitter = OAuthApi(config.twitter_consumer_key,
                                   config.twitter_consumer_secret,
                                   access_token)
                user = twitter.GetUserInfo()
                memcache.delete('Member_' + str(member.num))
                member = Member.objects.filter(num=member.num)[0]
                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
                if not user.location or len(user.location) == 0:
                    member.twitter_location = ''
                else:
                    member.twitter_location = user.location
                if not user.description or len(user.description) == 0:
                    member.twitter_description = ''
                else:
                    member.twitter_description = user.description
                member.twitter_profile_image_url = user.profile_image_url
                if not user.url or len(user.url) == 0:
                    member.twitter_url = ''
                else:
                    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.save()
                memcache.set('Member_' + str(member.num), member, 86400)
                return HttpResponseRedirect('/settings')
            else:
                oauth_token = request.GET['oauth_token']
                if host == 'www.woosuko.com':
                    return HttpResponseRedirect(
                        'http://www.woosuko.com/twitter-oauth?oauth_token=' +
                        oauth_token)
                else:
                    return HttpResponseRedirect(
                        'http://localhost:8000/twitter-oauth?oauth_token=' +
                        oauth_token)
Exemple #24
0
def MemberHandler(request, member_username):
    if request.method == 'GET':
        site = GetSite()
        browser = detect(request)
        session = request.session
        template_values = {}
        template_values['site'] = site
        template_values['system_version'] = SYSTEM_VERSION
        member = CheckAuth(request)
        template_values['member'] = member
        template_values['show_extra_options'] = False
        if member:
            if member.num == 1:
                template_values['show_extra_options'] = True
        l10n = GetMessages(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.user.username
            template_values[
                'canonical'] = 'http://' + site.domain + '/member/' + one.user.username
        if one is not False:
            blog = Topic.objects.filter(
                node_name='blog', member_num=one.num).order_by('-created')
            if len(blog) > 0:
                template_values['blog'] = blog[0]
            q2 = Topic.objects.filter(
                member_num=one.num).order_by('-created')[:10]
            template_values['topics'] = q2
            replies = memcache.get('member::' + str(one.num) +
                                   '::participated')
            if replies is None:
                q3 = Reply.objects.filter(
                    member_num=one.num).order_by('-created')[0:100]
                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 session:
            template_values['message'] = session['message']
            del session['message']
        if one is not False:
            if browser['ios']:
                path = os.path.join('mobile', 'member_home.html')
            else:
                path = os.path.join('desktop', 'member_home.html')
        else:
            if browser['ios']:
                path = os.path.join('mobile', 'member_not_found.html')
            else:
                path = os.path.join('desktop', 'member_not_found.html')
        return render_to_response(path, template_values)
Exemple #25
0
def SettingsPasswordHandler(request):
    if request.method == 'POST':
        site = GetSite()
        browser = detect(request)
        session = request.session
        template_values = {}
        template_values['site'] = site
        template_values['page_title'] = site.title + u' › 密码设置'
        template_values['system_version'] = SYSTEM_VERSION
        errors = 0
        member = CheckAuth(request)
        l10n = GetMessages(member, site)
        template_values['l10n'] = l10n
        if (member):
            template_values['member'] = member
            template_values['member_username'] = member.user.username
            template_values['member_email'] = member.user.email
            # Verification: password
            password_error = 0
            password_update = False
            password_error_messages = [
                '', '新密码长度不能超过 32 个字符', '请输入当前密码', '当前密码不正确'
            ]
            password_new = request.POST['password_new'].strip()
            if (len(password_new) > 0):
                password_update = True
                if (len(password_new) > 32):
                    password_error = 1
                else:
                    password_current = request.POST['password_current'].strip()
                    if (len(password_current) == 0):
                        password_error = 2
                    else:
                        if not member.user.check_password(password_current):
                            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.user.set_password(password_new)
                member.user.save()
                member.auth = hashlib.sha1(
                    str(member.num) + ':' + member.user.password).hexdigest()
                member.save()
                memcache.set(member.auth, member.num, 86400 * 365)
                memcache.set('Member_' + str(member.num), member, 86400 * 365)
                session['message'] = '密码已成功更新,下次请用新密码登录'
                #self.response.headers['Set-Cookie'] = 'auth=' + member.auth + '; expires=' + (datetime.datetime.now() + datetime.timedelta(days=365)).strftime("%a, %d-%b-%Y %H:%M:%S GMT") + '; path=/'
                #self.redirect('/settings')
                return HttpResponseRedirect('/settings')
            else:
                if browser['ios']:
                    path = os.path.join('mobile',
                                        'member_settings_password.html')
                else:
                    path = os.path.join('desktop',
                                        'member_settings_password.html')
                return render_to_response(path, template_values)
        else:
            return HttpResponseRedirect('/signin')
Exemple #26
0
def SettingsAvatarHandler(request):
    if request.method == 'GET':
        site = GetSite()
        session = request.session
        browser = detect(request)
        template_values = {}
        template_values['site'] = site
        template_values['page_title'] = site.title + u' › 头像'
        template_values['system_version'] = SYSTEM_VERSION
        member = CheckAuth(request)
        l10n = GetMessages(member, site)
        template_values['l10n'] = l10n
        if (member):
            if 'message' in session:
                template_values['message'] = session['message']
                del session['message']
            template_values['member'] = member
            if browser['ios']:
                path = os.path.join('mobile', 'member_settings_avatar.html')
            else:
                path = os.path.join('desktop', 'member_settings_avatar.html')
            return render_to_response(path, template_values)
        else:
            return HttpResponseRedirect('/signin')

    else:
        site = GetSite()
        session = request.session
        browser = detect(request)
        template_values = {}
        template_values['site'] = site
        template_values['system_version'] = SYSTEM_VERSION
        member = CheckAuth(request)
        l10n = GetMessages(member, site)
        template_values['l10n'] = l10n
        if (member):
            dest = '/settings-avatar/'
            timestamp = str(int(time.time()))
            try:
                image_req = request.FILES['avatar']
                if image_req is None:
                    return HttpResponseRedirect(dest)
                ext = str(image_req).split('.')
                # 图片文件格式,并且文件大小不能超过2MB
                if len(ext) == 2 and image_req.size < 1024 * 1024 * 2:
                    ext = ext[1].lower()
                    if ext == "jpg" or ext == "jpeg" or ext == "bmp" or ext == 'png':
                        timestamp = str(
                            int(
                                time.mktime(
                                    datetime.datetime.now().timetuple())))
                        datetoday = str(
                            datetime.datetime.today())[0:10].replace('-', '')
                        new_name_src = timestamp + "." + ext
                        new_name_large = timestamp + "_l." + ext
                        new_name_normal = timestamp + "_n." + ext
                        new_name_small = timestamp + "_s." + ext
                        save_path = settings.STATIC_UPLOAD + "/" + member.user.username + "/" + datetoday
                        if not os.path.exists(save_path):
                            os.makedirs(save_path)
                        # Source image
                        image = Image.open(image_req)
                        image.save(save_path + "/" + new_name_src, 'jpeg')
                        # Large 73x73
                        image.thumbnail((73, 73), Image.ANTIALIAS)
                        image.save(save_path + "/" + new_name_large, 'jpeg')
                        member.avatar_large_url = settings.STATIC_UPLOAD_WEB + member.user.username + "/" + datetoday + "/" + new_name_large
                        # Normal 48x48
                        image.thumbnail((48, 48), Image.ANTIALIAS)
                        image.save(save_path + "/" + new_name_normal, 'jpeg')
                        member.avatar_normal_url = settings.STATIC_UPLOAD_WEB + member.user.username + "/" + datetoday + "/" + new_name_normal
                        # Small 24x24
                        image.thumbnail((24, 24), Image.ANTIALIAS)
                        image.save(save_path + "/" + new_name_small, 'jpeg')
                        member.avatar_mini_url = settings.STATIC_UPLOAD_WEB + member.user.username + "/" + datetoday + "/" + new_name_small
                        # Save avatar info
                        member.save()
                    else:
                        return HttpResponseRedirect(dest)
                else:
                    return HttpResponseRedirect(dest)
            except:
                print "Unexpected error:", sys.exc_info()
                return HttpResponseRedirect(dest)
            memcache.set('Member_' + str(member.num), member, 86400 * 365)
            memcache.set('Member::' + member.username_lower, member,
                         86400 * 365)
            memcache.delete('Avatar::avatar_' + str(member.num) + '_large')
            memcache.delete('Avatar::avatar_' + str(member.num) + '_normal')
            memcache.delete('Avatar::avatar_' + str(member.num) + '_mini')
            session['message'] = '新头像设置成功'
            return HttpResponseRedirect('/settings-avatar/')
        else:
            return HttpResponseRedirect('/signin')
Exemple #27
0
def SettingsAvatarHandler(request):
    if request.method == 'GET':
        site = GetSite()
        session = request.session
        browser = detect(request)
        template_values = {}
        template_values['site'] = site
        template_values['page_title'] = site.title + u' › 头像'
        template_values['system_version'] = SYSTEM_VERSION
        member = CheckAuth(request)
        l10n = GetMessages(member, site)
        template_values['l10n'] = l10n
        if (member):
            if 'message' in session:
                template_values['message'] = session['message']
                del session['message']
            template_values['member'] = member
            if browser['ios']:
                path = os.path.join('mobile', 'member_settings_avatar.html')
            else:
                path = os.path.join('desktop', 'member_settings_avatar.html')
            return render_to_response(path, template_values)
        else:
            return HttpResponseRedirect('/signin')

    else:
        site = GetSite()
        session = request.session
        browser = detect(request)
        template_values = {}
        template_values['site'] = site
        template_values['system_version'] = SYSTEM_VERSION
        member = CheckAuth(request)
        l10n = GetMessages(member, site)
        template_values['l10n'] = l10n
        if (member):
            dest = '/settings-avatar/'
            timestamp = str(int(time.time()))
            try:
                image_req = request.FILES['avatar']
                if image_req is None:
                    return HttpResponseRedirect(dest)
                ext = str(image_req).split('.');
                # 图片文件格式,并且文件大小不能超过2MB
                if len(ext) == 2 and image_req.size<1024*1024*2:
                    ext = ext[1].lower()
                    if ext=="jpg" or ext=="jpeg" or ext=="bmp" or  ext=='png':
                        timestamp = str(int(time.mktime(datetime.datetime.now().timetuple())))
                        datetoday= str(datetime.datetime.today())[0:10].replace('-', '')
                        new_name_src = timestamp + "." + ext
                        new_name_large = timestamp + "_l." + ext
                        new_name_normal = timestamp + "_n." + ext
                        new_name_small = timestamp + "_s." + ext
                        save_path = settings.STATIC_UPLOAD + "/" + member.user.username + "/" + datetoday
                        if not os.path.exists(save_path):
                            os.makedirs(save_path)
                        # Source image
                        image = Image.open(image_req)
                        image.save(save_path + "/" + new_name_src, 'jpeg')
                        # Large 73x73
                        image.thumbnail((73,73),Image.ANTIALIAS)
                        image.save(save_path + "/" + new_name_large, 'jpeg')
                        member.avatar_large_url = settings.STATIC_UPLOAD_WEB + member.user.username + "/" + datetoday + "/" + new_name_large
                        # Normal 48x48
                        image.thumbnail((48,48),Image.ANTIALIAS)
                        image.save(save_path + "/" + new_name_normal, 'jpeg')
                        member.avatar_normal_url = settings.STATIC_UPLOAD_WEB + member.user.username + "/" + datetoday + "/" + new_name_normal
                        # Small 24x24
                        image.thumbnail((24,24),Image.ANTIALIAS)
                        image.save(save_path + "/" + new_name_small, 'jpeg')
                        member.avatar_mini_url = settings.STATIC_UPLOAD_WEB + member.user.username + "/" + datetoday + "/" + new_name_small
                        # Save avatar info
                        member.save()
                    else:
                        return HttpResponseRedirect(dest)
                else:
                    return HttpResponseRedirect(dest)
            except:
                print "Unexpected error:", sys.exc_info()
                return HttpResponseRedirect(dest)
            memcache.set('Member_' + str(member.num), member, 86400 * 365)
            memcache.set('Member::' + member.username_lower, member, 86400 * 365)
            memcache.delete('Avatar::avatar_' + str(member.num) + '_large')
            memcache.delete('Avatar::avatar_' + str(member.num) + '_normal')
            memcache.delete('Avatar::avatar_' + str(member.num) + '_mini')
            session['message'] = '新头像设置成功'
            return HttpResponseRedirect('/settings-avatar/')
        else:
            return HttpResponseRedirect('/signin')
Exemple #28
0
def FollowMemberHandler(request, one_num):
    if request.method == 'GET':
        if 'HTTP_REFERER' in request.META:
            go = request.META['HTTP_REFERER']
        else:
            go = '/'
        member = CheckAuth(request)
        if member:
            one = GetKindByNum('Member', int(one_num))
            if one is not False:
                if one.num != member.num:
                    q = MemberBookmark.objects.filter(one=one, member_num=member.num)
                    if len(q) == 0:
                        member = Member.objects.get(id=member.id)
                        member.favorited_members = member.favorited_members + 1
                        if member.favorited_members > 30:
                            session = request.session
                            session['message'] = '最多只能添加 30 位特别关注'
                        else:
                            bookmark = MemberBookmark()
                            bookmark.one = one
                            bookmark.member_num = member.num
                            bookmark.save()
                            member.save()
                            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.objects.get(id=one.id)
                            one.followers_count = one.followers_count + 1
                            memcache.set('Member_' + str(one.num), one, 86400)
                            memcache.set('Member::' + str(one.username_lower), one, 86400)
                            session = request.session
                            session['message'] = '特别关注添加成功,还可以添加 ' + str(30 - member.favorited_members) + ' 位'
                            # Send notification to following
                            q = Counter.objects.filter(name='notification.max')
                            if (len(q) == 1):
                                counter = q[0]
                                counter.value = counter.value + 1
                            else:
                                counter = Counter()
                                counter.name = 'notification.max'
                                counter.value = 1
                            q2 = Counter.objects.filter(name='notification.total')
                            if (len(q2) == 1):
                                counter2 = q2[0]
                                counter2.value = counter2.value + 1
                            else:
                                counter2 = Counter()
                                counter2.name = 'notification.total'
                                counter2.value = 1

                            notification = Notification()
                            notification.num = counter.value
                            notification.type = 'follow'
                            notification.payload = ''
                            notification.label1 = ''
                            notification.link1 = ''
                            notification.member = member
                            notification.for_member_num = one.num

                            one.notifications = one.notifications + 1

                            one.save()
                            counter.save()
                            counter2.save()
                            notification.save()
        return HttpResponseRedirect(go)
Exemple #29
0
def NotificationsHandler(request):
    if request.method == 'GET':
        site = GetSite()
        browser = detect(request)
        template_values = {}
        template_values['site'] = site
        template_values['system_version'] = SYSTEM_VERSION
        member = CheckAuth(request)
        l10n = GetMessages(member, site)
        template_values['l10n'] = l10n
        template_values[
            'page_title'] = site.title + u' › ' + l10n.create_new_topic.decode(
                'utf-8')
        if member:
            template_values['member'] = member
            if member.private_token is None:
                member.private_token = hashlib.sha256(
                    str(member.num) + ';' + config.site_key).hexdigest()
                member.save()
            notifications = memcache.get('nn::' + member.username_lower)
            if notifications is None:
                q = Notification.objects.filter(
                    for_member_num=member.num).order_by('-num')[:50]
                notifications = []
                i = 0
                for n in q:
                    if i == 0:
                        if member.notification_position != n.num:
                            member.notification_position = n.num
                            member.save()
                    if n.type == 'reply':
                        n.text = u'<a href="/member/' + n.member.user.username + u'"><strong>' + n.member.user.username + u'</strong></a> 在 <a href="' + n.link1 + '">' + escape(
                            n.label1) + u'</a> 里回复了你'
                        notifications.append(n)
                    if n.type == 'mention_reply':
                        n.text = u'<a href="/member/' + n.member.user.username + u'"><strong>' + n.member.user.username + u'</strong></a> 在回复 <a href="' + n.link1 + '">' + escape(
                            n.label1) + u'</a> 时提到了你'
                        notifications.append(n)
                    if n.type == 'mention_topic':
                        n.text = u'<a href="/member/' + n.member.user.username + u'"><strong>' + n.member.user.username + u'</strong></a> 在创建主题 <a href="' + n.link1 + '">' + escape(
                            n.label1) + u'</a> 时提到了你'
                        notifications.append(n)
                    if n.type == 'follow':
                        n.text = u'<a href="/member/' + n.member.user.username + u'"><strong>' + n.member.user.username + u'</strong></a> 关注了你'
                        notifications.append(n)
                    i = i + 1
                member.notifications = 0
                member.save()
                memcache.set('Member_' + str(member.num), member, 86400)
                memcache.set('nn::' + member.username_lower, notifications,
                             360)
            template_values['notifications'] = notifications
            template_values['title'] = u'提醒系统'
            path = os.path.join('desktop', 'notifications.html')
            return render_to_response(path, template_values)
        else:
            return HttpResponseRedirect('/signin')
Exemple #30
0
def PlaceHandler(request, ip):
    if request.method == 'GET':
        site = GetSite()
        template_values = {}
        template_values['site'] = site
        template_values['rnd'] = random.randrange(1, 100)
        member = CheckAuth(request)
        if member:
            template_values['member'] = member
        l10n = GetMessages(member, site)
        template_values['l10n'] = l10n
        template_values['ip'] = ip
        substance = GetPlaceByIP(ip)
        if substance:
            template_values['substance'] = substance
            template_values['messages'] = PlaceMessage.objects.filter(
                place=substance).order_by('-created')[:30]
        else:
            if member:
                if member.ip == ip:
                    substance = CreatePlaceByIP(ip)
                    template_values['substance'] = substance
        can_post = False
        can_see = True
        if member:
            if member.ip == ip:
                can_post = True
                can_see = True
            else:
                can_see = False
        else:
            if 'X-Real-IP' in request.META:
                ip_guest = request.META['X-Real-IP']
            else:
                ip_guest = request.META['REMOTE_ADDR']
            if ip_guest == ip:
                can_see = True
            else:
                can_see = False
        template_values['can_post'] = can_post
        template_values['can_see'] = can_see
        if member:
            template_values['ip_guest'] = member.ip
        else:
            template_values['ip_guest'] = ip_guest
        template_values['page_title'] = site.title + u' › ' + ip
        path = os.path.join('desktop', 'place.html')
        return render_to_response(path, template_values)
    else:
        site = GetSite()
        if 'HTTP_REFERER' in request.META:
            go = request.META['HTTP_REFERER']
        else:
            go = '/place/'
        member = CheckAuth(request)
        place = GetPlaceByIP(ip)
        say = request.POST['say'].strip()
        if len(say) > 0 and len(say) < 280 and member and place:
            if member.ip == ip:
                message = PlaceMessage()
                q = Counter.objects.filter(name='place_message.max')
                if (q.count() == 1):
                    counter = q[0]
                    counter.value = counter.value + 1
                else:
                    counter = Counter()
                    counter.name = 'place_message.max'
                    counter.value = 1
                q2 = Counter.objects.filter(name='place_message.total')
                if (q2.count() == 1):
                    counter2 = q2[0]
                    counter2.value = counter2.value + 1
                else:
                    counter2 = Counter()
                    counter2.name = 'place_message.total'
                    counter2.value = 1
                message.num = counter.value
                message.place = place
                message.place_num = place.num
                message.member = member
                message.content = say
                message.save()
                counter.save()
                counter2.save()
        return HttpResponseRedirect(go)
Exemple #31
0
def FollowMemberHandler(request, one_num):
    if request.method == 'GET':
        if 'HTTP_REFERER' in request.META:
            go = request.META['HTTP_REFERER']
        else:
            go = '/'
        member = CheckAuth(request)
        if member:
            one = GetKindByNum('Member', int(one_num))
            if one is not False:
                if one.num != member.num:
                    q = MemberBookmark.objects.filter(one=one,
                                                      member_num=member.num)
                    if len(q) == 0:
                        member = Member.objects.get(id=member.id)
                        member.favorited_members = member.favorited_members + 1
                        if member.favorited_members > 30:
                            session = request.session
                            session['message'] = '最多只能添加 30 位特别关注'
                        else:
                            bookmark = MemberBookmark()
                            bookmark.one = one
                            bookmark.member_num = member.num
                            bookmark.save()
                            member.save()
                            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.objects.get(id=one.id)
                            one.followers_count = one.followers_count + 1
                            memcache.set('Member_' + str(one.num), one, 86400)
                            memcache.set('Member::' + str(one.username_lower),
                                         one, 86400)
                            session = request.session
                            session['message'] = '特别关注添加成功,还可以添加 ' + str(
                                30 - member.favorited_members) + ' 位'
                            # Send notification to following
                            q = Counter.objects.filter(name='notification.max')
                            if (len(q) == 1):
                                counter = q[0]
                                counter.value = counter.value + 1
                            else:
                                counter = Counter()
                                counter.name = 'notification.max'
                                counter.value = 1
                            q2 = Counter.objects.filter(
                                name='notification.total')
                            if (len(q2) == 1):
                                counter2 = q2[0]
                                counter2.value = counter2.value + 1
                            else:
                                counter2 = Counter()
                                counter2.name = 'notification.total'
                                counter2.value = 1

                            notification = Notification()
                            notification.num = counter.value
                            notification.type = 'follow'
                            notification.payload = ''
                            notification.label1 = ''
                            notification.link1 = ''
                            notification.member = member
                            notification.for_member_num = one.num

                            one.notifications = one.notifications + 1

                            one.save()
                            counter.save()
                            counter2.save()
                            notification.save()
        return HttpResponseRedirect(go)
Exemple #32
0
def SettingsHandler(request):
    if request.method == 'GET':
        site = GetSite()
        browser = detect(request)
        session = request.session
        template_values = {}
        template_values['site'] = site
        template_values['system_version'] = SYSTEM_VERSION
        member = CheckAuth(request)
        l10n = GetMessages(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_realname'] = member.truename
            template_values['member_sex'] = member.sex
            template_values['member_username'] = member.user.username
            template_values['member_email'] = member.user.email
            if (member.website == None):
                member.website = ''
            template_values['member_website'] = member.website
            if (member.twitter == None):
                member.twitter = ''
            template_values['member_twitter'] = member.twitter
            if (member.location == None):
                member.location = ''
            if member.psn is None:
                member.psn = ''
            template_values['member_psn'] = member.psn
            if (member.my_home == None):
                member.my_home = ''
            template_values['member_my_home'] = member.my_home
            template_values['member_btc'] = member.btc
            template_values['member_location'] = member.location
            if (member.tagline == None):
                member.tagline = ''
            template_values['member_tagline'] = member.tagline
            if (member.bio == None):
                member.bio = ''
            template_values['member_bio'] = member.bio
            template_values['member_show_home_top'] = member.show_home_top
            template_values['member_show_quick_post'] = member.show_quick_post
            if member.l10n is None:
                member.l10n = 'en'
            template_values['member_l10n'] = member.l10n
            s = GetLanguageSelect(member.l10n)
            template_values['s'] = s
            if member.twitter_sync == 1:
                template_values['member_twitter_sync'] = 1
            if member.use_my_css == 1:
                template_values['member_use_my_css'] = 1
            if (member.my_css == None):
                member.my_css = ''
            template_values['member_my_css'] = member.my_css
            if 'message' in session:
                message = session['message']
                del session['message']
            else:
                message = None
            template_values['message'] = message
            try:
                blocked = pickle.loads(member.blocked.encode('utf-8'))
            except:
                blocked = []
            template_values['member_stats_blocks'] = len(blocked)
            if browser['ios']:
                path = os.path.join('mobile', 'member_settings.html')
            else:
                path = os.path.join('desktop', 'member_settings.html')
            return render_to_response(path, template_values)
        else:
            return HttpResponseRedirect('/signin')

    else:
        session = request.session
        site = GetSite()
        browser = detect(request)
        template_values = {}
        template_values['site'] = site
        template_values['system_version'] = SYSTEM_VERSION
        errors = 0
        member = CheckAuth(request)
        l10n = GetMessages(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_realname'] = member.truename
            template_values['member_sex'] = member.sex
            template_values['member_username'] = member.user.username
            template_values['member_email'] = member.user.email
            template_values['member_website'] = member.website
            template_values['member_twitter'] = member.twitter
            # Verification: realname
            member_realname_error = 0
            member_realname_error_messages = [
                '',
                l10n.realname_empty,
                l10n.realname_too_long,
            ]
            member_realname = request.POST['realname'].strip()
            if (len(member_realname) == 0):
                errors = errors + 1
                member_realname_error = 1
            else:
                if (len(member_realname) > 20):
                    errors = errors + 1
                    member_realname_error = 2
            template_values['member_realname'] = member_realname
            template_values['member_realname_error'] = member_realname_error
            template_values[
                'member_realname_error_message'] = member_realname_error_messages[
                    member_realname_error]
            # Verification: sex
            member_sex_error = 0
            member_sex_error_messages = [
                '',
                l10n.sex_empty,
            ]
            if 'sex' in request.POST:
                member_sex = request.POST['sex'].strip()
            else:
                member_sex = ''
            if (len(member_sex) == 0):
                errors = errors + 1
                member_sex_error = 1
            template_values['member_sex'] = member_sex
            template_values['member_sex_error'] = member_sex_error
            template_values[
                'member_sex_error_message'] = member_sex_error_messages[
                    member_sex_error]
            # Verification: username
            member_username_error = 0
            member_username_error_messages = [
                '', l10n.username_empty, l10n.username_too_long,
                l10n.username_too_short, l10n.username_invalid,
                l10n.username_taken, '你已经更改过一次账户'
            ]
            member_username = request.POST['username'].strip()
            if (len(member_username) == 0):
                errors = errors + 1
                member_username_error = 1
            else:
                if (len(member_username) > 16):
                    errors = errors + 1
                    member_username_error = 2
                else:
                    if (len(member_username) < 3):
                        errors = errors + 1
                        member_username_error = 3
                    else:
                        if (re.search('^[a-zA-Z0-9\_]+$', member_username)):
                            q = Member.objects.filter(
                                username_lower=member_username.lower(
                                )).exclude(id=member.id)
                            if len(q) > 0:
                                errors = errors + 1
                                member_username_error = 5
                            else:
                                if request.user.username != member_username and member.username_editable == 0:
                                    errors = errors + 1
                                    member_username_error = 6
                        else:
                            errors = errors + 1
                            member_username_error = 4
            template_values['member_username'] = member_username
            template_values['member_username_error'] = member_username_error
            template_values[
                'member_username_error_message'] = member_username_error_messages[
                    member_username_error]
            # Verification: email
            member_email_error = 0
            member_email_error_messages = [
                '', u'请输入你的电子邮件地址', u'电子邮件地址长度不能超过 32 个字符', u'你输入的电子邮件地址不符合规则',
                u'抱歉这个电子邮件地址已经有人注册过了'
            ]
            if 'email' in request.POST:
                member_email = request.POST['email'].strip()
            else:
                member_email = ''
            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 = User.objects.filter(
                            email=member_email.lower()).exclude(
                                id=request.user.id)
                        if (len(q) > 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 = request.POST['website'].strip()
            if (len(member_website) == 0):
                member_website = ''
            else:
                if (len(member_website) > 200):
                    errors = errors + 1
                    member_website_error = 1
                else:
                    p = re.compile(
                        'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
                    )
                    if (p.search(member_website)):
                        errors = errors
                    else:
                        errors = errors + 1
                        member_website_error = 2
            template_values['member_website'] = member_website
            template_values['member_website_error'] = member_website_error
            template_values[
                'member_website_error_message'] = member_website_error_messages[
                    member_website_error]
            # Verification: Twitter
            member_twitter_error = 0
            member_twitter_error_messages = [
                '', u'Twitter 用户名长度不能超过 20 个字符', u'Twitter 用户名不符合规则'
            ]
            member_twitter = request.POST['twitter'].strip()
            if (len(member_twitter) == 0):
                member_twitter = ''
            else:
                if (len(member_twitter) > 20):
                    errors = errors + 1
                    member_twitter_error = 1
                else:
                    p = re.compile('[a-zA-Z0-9\_]+')
                    if (p.search(member_twitter)):
                        errors = errors
                    else:
                        errors = errors + 1
                        member_twitter_error = 2
            template_values['member_twitter'] = member_twitter
            template_values['member_twitter_error'] = member_twitter_error
            template_values[
                'member_twitter_error_message'] = member_twitter_error_messages[
                    member_twitter_error]
            # Verification: psn
            member_psn_error = 0
            member_psn_error_messages = [
                '', u'PSN ID 长度不能超过 20 个字符', u'PSN ID 不符合规则'
            ]
            member_psn = request.POST['psn'].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 = request.POST['my_home'].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 = request.POST['btc'].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: location
            member_location_error = 0
            member_location_error_messages = ['', u'所在地长度不能超过 40 个字符']
            member_location = request.POST['location'].strip()
            if (len(member_location) == 0):
                member_location = ''
            else:
                if (len(member_location) > 40):
                    errors = errors + 1
                    member_location_error = 1
            template_values['member_location'] = member_location
            template_values['member_location_error'] = member_location_error
            template_values[
                'member_location_error_message'] = member_location_error_messages[
                    member_location_error]
            # Verification: tagline
            member_tagline_error = 0
            member_tagline_error_messages = ['', u'个人签名长度不能超过 70 个字符']
            member_tagline = request.POST['tagline'].strip()
            if (len(member_tagline) == 0):
                member_tagline = ''
            else:
                if (len(member_tagline) > 70):
                    errors = errors + 1
                    member_tagline_error = 1
            template_values['member_tagline'] = member_tagline
            template_values['member_tagline_error'] = member_tagline_error
            template_values[
                'member_tagline_error_message'] = member_tagline_error_messages[
                    member_tagline_error]
            # Verification: bio
            member_bio_error = 0
            member_bio_error_messages = ['', u'个人简介长度不能超过 2000 个字符']
            member_bio = request.POST['bio'].strip()
            if (len(member_bio) == 0):
                member_bio = ''
            else:
                if (len(member_bio) > 2000):
                    errors = errors + 1
                    member_bio_error = 1
            template_values['member_bio'] = member_bio
            template_values['member_bio_error'] = member_bio_error
            template_values[
                'member_bio_error_message'] = member_bio_error_messages[
                    member_bio_error]
            # Verification: show_home_top and show_quick_post
            try:
                member_show_home_top = int(request.POST['show_home_top'])
            except:
                member_show_home_top = 1
            template_values['member_show_home_top'] = member_show_home_top
            try:
                member_show_quick_post = int(request.POST['show_quick_post'])
            except:
                member_show_quick_post = 0
            template_values['member_show_quick_post'] = member_show_quick_post
            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 = request.POST['l10n'].strip()
            supported = GetSupportedLanguages()
            if member_l10n == '':
                member_l10n = site.l10n
            else:
                if member_l10n not in supported:
                    member_l10n = site.l10n
            s = GetLanguageSelect(member_l10n)
            template_values['s'] = s
            template_values['member_l10n'] = member_l10n
            # Verification: twitter_sync
            if member.twitter_oauth == 1:
                if 'twitter_sync' in request.POST:
                    member_twitter_sync = request.POST['twitter_sync']
                else:
                    member_twitter_sync = ''
                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 = None
            if 'use_my_css' in request.POST:
                member_use_my_css = request.POST['use_my_css']
            else:
                member_use_my_css = ''
            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 = request.POST['my_css'].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):
                user = request.user
                member.truename = member_realname
                member.sex = member_sex
                # 如果用户更改了账户,则editable置为0
                if user.username != member_username:
                    user.username = member_username
                    member.username_editable = 0
                    member.username_lower = member_username.lower()
                user.email = member_email.lower()
                member.website = member_website
                member.twitter = member_twitter
                member.psn = member_psn
                member.btc = member_btc
                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 = ''
                member.bio = member_bio
                member.show_home_top = member_show_home_top
                member.show_quick_post = member_show_quick_post
                member.l10n = member_l10n
                user.save()
                member.save()
                memcache.delete('Member::' + str(member.user.username))
                memcache.delete('Member::' + str(member.username_lower))
                memcache.set('Member_' + str(member.num), member, 86400)
                session['message'] = '个人设置成功更新'
                return HttpResponseRedirect('/settings')
            else:
                if browser['ios']:
                    path = os.path.join('mobile', 'member_settings.html')
                else:
                    path = os.path.join('desktop', 'member_settings.html')
            return render_to_response(path, template_values)
        else:
            return HttpResponseRedirect('/signin')
Exemple #33
0
def MemberHandler(request, member_username):
    if request.method == 'GET':
        site = GetSite()
        browser = detect(request)
        session = request.session
        template_values = {}
        template_values['site'] = site
        template_values['system_version'] = SYSTEM_VERSION
        member = CheckAuth(request)
        template_values['member'] = member
        template_values['show_extra_options'] = False
        if member:
            if member.num == 1:
                template_values['show_extra_options'] = True
        l10n = GetMessages(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.user.username
            template_values['canonical'] = 'http://' + site.domain + '/member/' + one.user.username
        if one is not False:
            blog = Topic.objects.filter(node_name='blog',member_num=one.num).order_by('-created')
            if len(blog) > 0:
                template_values['blog'] = blog[0]
            q2 = Topic.objects.filter(member_num=one.num).order_by('-created')[:10]
            template_values['topics'] = q2
            replies = memcache.get('member::' + str(one.num) + '::participated')
            if replies is None:
                q3 = Reply.objects.filter(member_num=one.num).order_by('-created')[0:100]
                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 session:
            template_values['message'] = session['message']
            del session['message']
        if one is not False:
            if browser['ios']:
                path = os.path.join('mobile', 'member_home.html')
            else:
                path = os.path.join('desktop', 'member_home.html')
        else:
            if browser['ios']:
                path = os.path.join('mobile', 'member_not_found.html')
            else:
                path = os.path.join('desktop', 'member_not_found.html')
        return render_to_response(path, template_values)
Exemple #34
0
def TwitterCallbackHandler(request):
    if request.method == "GET":
        session = request.session
        member = CheckAuth(request)
        host = request.META["HTTP_HOST"]
        if host == "localhost:8000" or host == "127.0.0.1:8000":
            # Local debugging logic
            if member:
                request_token = session["request_token"]
                twitter = OAuthApi(config.twitter_consumer_key, config.twitter_consumer_secret, request_token)
                access_token = twitter.getAccessToken()
                twitter = OAuthApi(config.twitter_consumer_key, config.twitter_consumer_secret, access_token)
                user = twitter.GetUserInfo()
                memcache.delete("Member_" + str(member.num))
                member = Member.objects.filter(num=member.num)[0]
                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.save()
                memcache.set("Member_" + str(member.num), member, 86400)
                return HttpResponseRedirect("/settings")
            else:
                return HttpResponseRedirect("/signin")
        else:
            # Remote production logic
            if member and "request_token" in session:
                request_token = session["request_token"]
                twitter = OAuthApi(config.twitter_consumer_key, config.twitter_consumer_secret, request_token)
                access_token = twitter.getAccessToken()
                twitter = OAuthApi(config.twitter_consumer_key, config.twitter_consumer_secret, access_token)
                user = twitter.GetUserInfo()
                memcache.delete("Member_" + str(member.num))
                member = Member.objects.filter(num=member.num)[0]
                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
                if not user.location or len(user.location) == 0:
                    member.twitter_location = ""
                else:
                    member.twitter_location = user.location
                if not user.description or len(user.description) == 0:
                    member.twitter_description = ""
                else:
                    member.twitter_description = user.description
                member.twitter_profile_image_url = user.profile_image_url
                if not user.url or len(user.url) == 0:
                    member.twitter_url = ""
                else:
                    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.save()
                memcache.set("Member_" + str(member.num), member, 86400)
                return HttpResponseRedirect("/settings")
            else:
                oauth_token = request.GET["oauth_token"]
                if host == "www.woosuko.com":
                    return HttpResponseRedirect("http://www.woosuko.com/twitter-oauth?oauth_token=" + oauth_token)
                else:
                    return HttpResponseRedirect("http://localhost:8000/twitter-oauth?oauth_token=" + oauth_token)
Exemple #35
0
def SettingsHandler(request):
    if request.method == 'GET':
        site = GetSite()
        browser = detect(request)
        session = request.session
        template_values = {}
        template_values['site'] = site
        template_values['system_version'] = SYSTEM_VERSION
        member = CheckAuth(request)
        l10n = GetMessages(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_realname'] = member.truename
            template_values['member_sex'] = member.sex
            template_values['member_username'] = member.user.username
            template_values['member_email'] = member.user.email
            if (member.website == None):
                member.website = ''
            template_values['member_website'] = member.website
            if (member.twitter == None):
                member.twitter = ''
            template_values['member_twitter'] = member.twitter
            if (member.location == None):
                member.location = ''
            if member.psn is None:
                member.psn = ''
            template_values['member_psn'] = member.psn
            if (member.my_home == None):
                member.my_home = ''
            template_values['member_my_home'] = member.my_home
            template_values['member_btc'] = member.btc
            template_values['member_location'] = member.location
            if (member.tagline == None):
                member.tagline = ''
            template_values['member_tagline'] = member.tagline
            if (member.bio == None):
                member.bio = ''
            template_values['member_bio'] = member.bio
            template_values['member_show_home_top'] = member.show_home_top
            template_values['member_show_quick_post'] = member.show_quick_post
            if member.l10n is None:
                member.l10n = 'en'
            template_values['member_l10n'] = member.l10n
            s = GetLanguageSelect(member.l10n)
            template_values['s'] = s
            if member.twitter_sync == 1:
                template_values['member_twitter_sync'] = 1
            if member.use_my_css == 1:
                template_values['member_use_my_css'] = 1
            if (member.my_css == None):
                member.my_css = ''
            template_values['member_my_css'] = member.my_css
            if 'message' in session:
                message = session['message']
                del session['message']
            else:
                message = None
            template_values['message'] = message
            try:
                blocked = pickle.loads(member.blocked.encode('utf-8'))
            except:
                blocked = []
            template_values['member_stats_blocks'] = len(blocked)
            if browser['ios']:
                path = os.path.join('mobile', 'member_settings.html')
            else:
                path = os.path.join('desktop', 'member_settings.html')
            return render_to_response(path, template_values)
        else:
            return HttpResponseRedirect('/signin')

    else:
        session = request.session
        site = GetSite()
        browser = detect(request)
        template_values = {}
        template_values['site'] = site
        template_values['system_version'] = SYSTEM_VERSION
        errors = 0
        member = CheckAuth(request)
        l10n = GetMessages(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_realname'] = member.truename
            template_values['member_sex'] = member.sex
            template_values['member_username'] = member.user.username
            template_values['member_email'] = member.user.email
            template_values['member_website'] = member.website
            template_values['member_twitter'] = member.twitter
            # Verification: realname
            member_realname_error = 0
            member_realname_error_messages = ['',
                l10n.realname_empty,
                l10n.realname_too_long,]
            member_realname = request.POST['realname'].strip()
            if (len(member_realname) == 0):
                errors = errors + 1
                member_realname_error = 1
            else:
                if (len(member_realname) > 20):
                    errors = errors + 1
                    member_realname_error = 2
            template_values['member_realname'] = member_realname
            template_values['member_realname_error'] = member_realname_error
            template_values['member_realname_error_message'] = member_realname_error_messages[member_realname_error]
            # Verification: sex
            member_sex_error = 0
            member_sex_error_messages = ['',
                l10n.sex_empty,]
            if 'sex' in request.POST:
                member_sex = request.POST['sex'].strip()
            else:
                member_sex = ''
            if (len(member_sex) == 0):
                errors = errors + 1
                member_sex_error = 1
            template_values['member_sex'] = member_sex
            template_values['member_sex_error'] = member_sex_error
            template_values['member_sex_error_message'] = member_sex_error_messages[member_sex_error]
            # Verification: username
            member_username_error = 0
            member_username_error_messages = ['',
                l10n.username_empty,
                l10n.username_too_long,
                l10n.username_too_short,
                l10n.username_invalid,
                l10n.username_taken,
                '你已经更改过一次账户']
            member_username = request.POST['username'].strip()
            if (len(member_username) == 0):
                errors = errors + 1
                member_username_error = 1
            else:
                if (len(member_username) > 16):
                    errors = errors + 1
                    member_username_error = 2
                else:
                    if (len(member_username) < 3):
                        errors = errors + 1
                        member_username_error = 3
                    else:
                        if (re.search('^[a-zA-Z0-9\_]+$', member_username)):
                            q = Member.objects.filter(username_lower=member_username.lower()).exclude(id=member.id)
                            if len(q) > 0:
                                errors = errors + 1
                                member_username_error = 5
                            else:
                                if request.user.username != member_username and member.username_editable == 0:
                                    errors = errors + 1
                                    member_username_error = 6
                        else:
                            errors = errors + 1
                            member_username_error = 4
            template_values['member_username'] = member_username
            template_values['member_username_error'] = member_username_error
            template_values['member_username_error_message'] = member_username_error_messages[member_username_error]
            # Verification: email
            member_email_error = 0
            member_email_error_messages = ['',
                u'请输入你的电子邮件地址',
                u'电子邮件地址长度不能超过 32 个字符',
                u'你输入的电子邮件地址不符合规则',
                u'抱歉这个电子邮件地址已经有人注册过了']
            if 'email' in request.POST:
                member_email = request.POST['email'].strip()
            else:
                member_email = ''
            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 = User.objects.filter(email=member_email.lower()).exclude(id=request.user.id)
                        if (len(q) > 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 = request.POST['website'].strip()
            if (len(member_website) == 0):
                member_website = ''
            else:
                if (len(member_website) > 200):
                    errors = errors + 1
                    member_website_error = 1
                else:
                    p = re.compile('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+')
                    if (p.search(member_website)):
                        errors = errors
                    else:
                        errors = errors + 1
                        member_website_error = 2
            template_values['member_website'] = member_website
            template_values['member_website_error'] = member_website_error
            template_values['member_website_error_message'] = member_website_error_messages[member_website_error]
            # Verification: Twitter
            member_twitter_error = 0
            member_twitter_error_messages = ['',
                u'Twitter 用户名长度不能超过 20 个字符',
                u'Twitter 用户名不符合规则'
            ]
            member_twitter = request.POST['twitter'].strip()
            if (len(member_twitter) == 0):
                member_twitter = ''
            else:
                if (len(member_twitter) > 20):
                    errors = errors + 1
                    member_twitter_error = 1
                else:
                    p = re.compile('[a-zA-Z0-9\_]+')
                    if (p.search(member_twitter)):
                        errors = errors
                    else:
                        errors = errors + 1
                        member_twitter_error = 2
            template_values['member_twitter'] = member_twitter
            template_values['member_twitter_error'] = member_twitter_error
            template_values['member_twitter_error_message'] = member_twitter_error_messages[member_twitter_error]
            # Verification: psn
            member_psn_error = 0
            member_psn_error_messages = ['',
                u'PSN ID 长度不能超过 20 个字符',
                u'PSN ID 不符合规则'
            ]
            member_psn = request.POST['psn'].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 = request.POST['my_home'].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 = request.POST['btc'].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: location
            member_location_error = 0
            member_location_error_messages = ['',
                u'所在地长度不能超过 40 个字符'
            ]
            member_location = request.POST['location'].strip()
            if (len(member_location) == 0):
                member_location = ''
            else:
                if (len(member_location) > 40):
                    errors = errors + 1
                    member_location_error = 1
            template_values['member_location'] = member_location
            template_values['member_location_error'] = member_location_error
            template_values['member_location_error_message'] = member_location_error_messages[member_location_error]
            # Verification: tagline
            member_tagline_error = 0
            member_tagline_error_messages = ['',
                u'个人签名长度不能超过 70 个字符'
            ]
            member_tagline = request.POST['tagline'].strip()
            if (len(member_tagline) == 0):
                member_tagline = ''
            else:
                if (len(member_tagline) > 70):
                    errors = errors + 1
                    member_tagline_error = 1
            template_values['member_tagline'] = member_tagline
            template_values['member_tagline_error'] = member_tagline_error
            template_values['member_tagline_error_message'] = member_tagline_error_messages[member_tagline_error]
            # Verification: bio
            member_bio_error = 0
            member_bio_error_messages = ['',
                u'个人简介长度不能超过 2000 个字符'
            ]
            member_bio = request.POST['bio'].strip()
            if (len(member_bio) == 0):
                member_bio = ''
            else:
                if (len(member_bio) > 2000):
                    errors = errors + 1
                    member_bio_error = 1
            template_values['member_bio'] = member_bio
            template_values['member_bio_error'] = member_bio_error
            template_values['member_bio_error_message'] = member_bio_error_messages[member_bio_error]
            # Verification: show_home_top and show_quick_post
            try:
                member_show_home_top = int(request.POST['show_home_top'])
            except:
                member_show_home_top = 1
            template_values['member_show_home_top'] = member_show_home_top
            try:
                member_show_quick_post = int(request.POST['show_quick_post'])
            except:
                member_show_quick_post = 0
            template_values['member_show_quick_post'] = member_show_quick_post
            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 = request.POST['l10n'].strip()
            supported = GetSupportedLanguages()
            if member_l10n == '':
                member_l10n = site.l10n
            else:
                if member_l10n not in supported:
                    member_l10n = site.l10n
            s = GetLanguageSelect(member_l10n)
            template_values['s'] = s
            template_values['member_l10n'] = member_l10n
            # Verification: twitter_sync
            if member.twitter_oauth == 1:
                if 'twitter_sync' in request.POST:
                    member_twitter_sync = request.POST['twitter_sync']
                else:
                    member_twitter_sync = ''
                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 = None
            if 'use_my_css' in request.POST:
                member_use_my_css = request.POST['use_my_css']
            else:
                member_use_my_css = ''
            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 = request.POST['my_css'].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):
                user = request.user
                member.truename = member_realname
                member.sex = member_sex
                # 如果用户更改了账户,则editable置为0
                if user.username != member_username:
                    user.username = member_username
                    member.username_editable = 0
                    member.username_lower = member_username.lower()
                user.email = member_email.lower()
                member.website = member_website
                member.twitter = member_twitter
                member.psn = member_psn
                member.btc = member_btc
                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 = ''
                member.bio = member_bio
                member.show_home_top = member_show_home_top
                member.show_quick_post = member_show_quick_post
                member.l10n = member_l10n
                user.save()
                member.save()
                memcache.delete('Member::' + str(member.user.username))
                memcache.delete('Member::' + str(member.username_lower))
                memcache.set('Member_' + str(member.num), member, 86400)
                session['message'] = '个人设置成功更新'
                return HttpResponseRedirect('/settings')
            else:
                if browser['ios']:
                    path = os.path.join('mobile', 'member_settings.html')
                else:
                    path = os.path.join('desktop', 'member_settings.html')
            return render_to_response(path, template_values)
        else:
            return HttpResponseRedirect('/signin')