Python之路,day22-BBS基础

Python之路,day22-BBS基础

多级评论

from  django.template import Library
from django.utils.safestring import mark_safe

register = Library()

@register.simple_tag
def truncate_upload_img(img_src):
    print(dir(img_src))
    print(img_src.name)
    return img_src.name.lstrip("/uploads/")


@register.simple_tag
def render_paginator_btn(articles,page):

    current_page = articles.number
    if abs(current_page - page) <= 5 :
        ele = """<li ><a href="?page={page}">{page}</a></li>""".format(page=page)
        return mark_safe(ele)

    return ''


def build_comment_tree(comment_dic,obj):
    """递归的去把每个评论放到合适的层级里面"""

    for k,v in comment_dic.items():
        if obj.p_node ==  k: #代表找他了它父节点,把自己加到k下面
            print("[%s]找到了父节点[%s]" %(obj,k))
            comment_dic[k][obj] = {}
        else: #开始进行深度查询
            print("没找到,进入下一层查找",obj)
            build_comment_tree(comment_dic[k], obj)

def build_comment_html(comment_dic,margin_arg):
    """循环评论的字典, 拼接html"""

    comment_eles = ''
    for k,v in comment_dic.items():
        comment_eles += '''<div style='border:1px dashed black;padding:10px;margin-left:{margin}px'>{user} ---- {date} --- {comment}</div>'''\
            .format(user=k.user,
                    date=k.date.strftime('%Y-%m-%d %H:%M:%S'),
                    comment=k.comment,
                    margin=margin_arg)
        if v:

            comment_eles += build_comment_html(comment_dic[k],margin_arg+20)

    return comment_eles

@register.simple_tag
def load_comments(article_obj):

    #1.先把数据库里所有的这篇文章的评论查出来,转成字典
    #2.递归的循环这个字典,生成html评论元素

    comment_dic = {
    }

    comment_objs = article_obj.comment_set.all().order_by('date') #列表

    for obj in comment_objs:

        if not obj.p_node:#判断obj有没有p_node,没有的话,那它自己就是顶级评论
            comment_dic[obj] = {}
        else: #有父亲节点
            build_comment_tree(comment_dic,obj)
    print(comment_dic)

    comment_list = sorted(comment_dic.items(),key=lambda x:x[0].date)
    print("comment objs:",comment_list)

    comment_html = """"""

    for comment_branch in comment_list:
        margin_arg=0
        branch_ele = """<div style='border:1px dashed black;padding:10px;margin-left:{margin}px'>{user} ---- {date} --- {comment}</div>""".\
            format(user=comment_branch[0].user,
                   date=comment_branch[0].date.strftime('%Y-%m-%d %H:%M:%S'),
                   comment=comment_branch[0].comment,
                   margin=margin_arg)
        comment_html += branch_ele

        #开始构建它的子级评论的元素
        comment_html +=  build_comment_html(comment_branch[1],margin_arg+20)

    return mark_safe(comment_html)

  

 

webqq

from django.shortcuts import render,HttpResponse
from django.views.decorators.csrf import csrf_exempt
from webqq.msg_handler import MsgHandler
import queue,json
# Create your views here.

MSG_QUEUES = {}



def dashboard(request):

    print("user--",request.user.userproifle)
    return render(request,"webqq/dashboard.html")

#@csrf_exempt
def msg_api(request):


    msg_obj = MsgHandler(request, MSG_QUEUES)
    if request.method == "POST":

        msg_obj.msg_send()
        return HttpResponse(json.dumps({"msg_send_status": 1}))
    else:
        msg_data = msg_obj.msg_recv()
        return HttpResponse(json.dumps(msg_data))

  

  1 {% extends 'index.html' %}
  2 
  3 {% block extra-head-resources %}
  4     <link href="/static/css/webqq_style.css" rel="stylesheet">
  5 
  6 {% endblock %}
  7 
  8 
  9 {% block container %}
 10 <div  class="row" style="margin-top: 50px;height: 100%;">
 11 {% csrf_token %}
 12     <div class="col-lg-2 contact_list">
 13 
 14         <ul class="nav nav-tabs" role="tablist">
 15           <li role="presentation"><a href="#contacts" aria-controls="contacts" role="tab" data-toggle="tab">c</a></li>
 16           <li role="presentation"><a href="#groups" aria-controls="groups" role="tab" data-toggle="tab">g</a></li>
 17 
 18         </ul>
 19 
 20 
 21          <div class="tab-content">
 22             <div role="tabpanel" class="tab-pane active" id="contacts">
 23 
 24                 <div class="list-group">
 25                     {% for contact in request.user.userproifle.friends.all %}
 26 
 27                         <a href="#" class="list-group-item" contact_id="{{ contact.id }}" contact_name="{{ contact.name }}" onclick="OpenSession(this)">{{ contact }}
 28 {#                            <span class="badge">14</span>#}
 29                         </a>
 30 
 31                     {% endfor %}
 32 
 33                 </div>
 34 
 35             </div>
 36             <div role="tabpanel" class="tab-pane" id="groups">groups</div>
 37           </div>
 38 
 39 
 40 
 41     </div>
 42     <div class="col-lg-8  chat_panel">
 43 
 44         <div class="row chat_panel_header">
 45 
 46             <div class="hidden" style="color: green">
 47                 正在与<span contact_id="" id="chat_panel_header_text"></span>聊天
 48             </div>
 49         </div>
 50 
 51         <div class="row chat_panel_body">
 52             body
 53         </div>
 54 
 55         <div class="row chat_panel_input_box">
 56 
 57             <textarea id="msg_input_box" class="msg_input_box">
 58 
 59 
 60 
 61             </textarea>
 62 
 63         </div>
 64 
 65     </div>
 66 
 67 
 68 </div>
 69 
 70 
 71 {% endblock %}
 72 
 73 
 74 {% block bottom-js %}
 75 
 76 <script>
 77 
 78     $(document).ready(function () {
 79 
 80          csrfmiddlewaretoken  = $("input[name='csrfmiddlewaretoken']").val();
 81 
 82 
 83          $("body").delegate("textarea", "keydown",function(e){
 84                 if(e.which == 13) {//Enter key down
 85                     //send msg button clicked
 86                     var msg_text = $("textarea").val();
 87                     if ($.trim(msg_text).length > 0){
 88                         //console.log(msg_text);
 89                         SendMsg(msg_text);
 90                     }
 91                     //no wait the send_msg's call confirm msg
 92                     AddSentMsgIntoBox(msg_text);
 93                     $("textarea").val('');
 94                 }
 95          });//end body
 96 
 97 
 98 
 99 
100          /*setInterval(function () {
101              LoadNewMsgs();
102          },1000)*/
103 
104           LoadNewMsgs();
105 
106 
107 
108 
109     });//end doc ready
110 
111 
112     function LoadNewMsgs() {
113 
114 
115 
116         $.get("{% url 'get_msg' %}",function(callback){
117             console.log("get_msg callback:",callback);
118             return LoadNewMsgs();
119         });//end get
120     }
121 
122     function SendMsg(msg) {
123         console.log("going tosend msg" + msg);
124 
125 
126 
127         var msg_data = {
128             'csrfmiddlewaretoken':csrfmiddlewaretoken,
129             'from':"{{ request.user.userproifle.id }}",
130             'to': $("#chat_panel_header_text").attr("contact_id"),
131             'data':msg
132         }
133         $.post("{% url 'msg_api' %}", msg_data ,function(callback){
134 
135             var callback = JSON.parse(callback); //json反序列化
136             console.log("msg_send_status:",callback.msg_send_status);
137             if ( callback.msg_send_status != 1){
138                 alert("消息发送失败:"+ msg);
139             }
140         });//end post
141 
142 
143     }
144     function AddSentMsgIntoBox(msg_text) {
145         var d = new Date();
146         var msg_ele = "<div>   <div>{{ request.user.userproifle.name }}  "+ d.getHours() + ":" +d.getMinutes() + ":" + d.getSeconds() + "</div>";
147         msg_ele += "<div>" + msg_text +"</div> </div>";
148         $(".chat_panel_body").append(msg_ele);
149 
150 
151         $('.chat_panel_body').animate({
152             scrollTop: $('.chat_panel_body')[0].scrollHeight}, 500)
153 
154     }
155     function  OpenSession(ele) {
156         var contact_id = $(ele).attr("contact_id");
157         var contact_name = $(ele).attr("contact_name");
158         $(ele).addClass("active");
159         $(ele).siblings().removeClass("active");
160         $("#chat_panel_header_text").text(contact_name);
161         $("#chat_panel_header_text").parent().removeClass("hidden");
162         $("#chat_panel_header_text").attr("contact_id",contact_id);
163 
164     }
165 
166 
167 
168 
169 
170 
171 </script>
172 
173 
174 {% endblock %}

 

posted on 2017-04-08 11:09  灵魂与梦想  阅读(228)  评论(0编辑  收藏  举报

导航