#3 树形候选的相关处理

Merged
namasikanam merged 2 commits from tree into master 3 years ago
  1. +53
    -7
      app.py
  2. +13
    -5
      templates/story.html

+ 53
- 7
app.py View File

@ -98,7 +98,7 @@ class Reaction(db.Model):
def choose_new_next(min_like_num=MIN_LIKE_NUM): def choose_new_next(min_like_num=MIN_LIKE_NUM):
for story in Story.query.filter_by(is_tree=False).all(): for story in Story.query.filter_by(is_tree=False).all():
last_paragraph_id = story.tail last_paragraph_id = story.tail
next_one = Paragraph.query.filter_by(parent_id=last_paragraph_id, is_hidden=False)\
next_one = Paragraph.query.filter_by(story_id=story.id, parent_id=last_paragraph_id, is_hidden=False)\
.order_by(Paragraph.like_num.desc()).first() .order_by(Paragraph.like_num.desc()).first()
if next_one and next_one.like_num >= min_like_num: if next_one and next_one.like_num >= min_like_num:
story.text += next_one.text story.text += next_one.text
@ -106,7 +106,35 @@ def choose_new_next(min_like_num=MIN_LIKE_NUM):
story.tail = next_one.id story.tail = next_one.id
next_one.is_chosen = True next_one.is_chosen = True
db.session.commit()
for story in Story.query.filter_by(is_tree=True).all():
_max = story.total_like_num
_tail = story.tail
_sum_dict = {}
def _get_like_sum(p):
if p.id in _sum_dict:
return _sum_dict[p.id]
s = p.like_num + (p.parent_id and _get_like_sum(Paragraph.query.get(p.parent_id)))
_sum_dict[p.id] = s
return s
for p in Paragraph.query.filter(Paragraph.like_num >= min_like_num)\
.filter_by(story_id=story.id, is_hidden=False).all():
if _get_like_sum(p) > _max:
_max = _get_like_sum(p)
_tail = p.id
p = Paragraph.query.get(_tail)
_text = p.text
while p.parent_id:
p = Paragraph.query.get(p.parent_id)
_text = p.text + _text
story.total_like_num = _max
story.tail = _tail
story.text = _text
db.session.commit()
def sample_question(qs, n=3): def sample_question(qs, n=3):
@ -185,13 +213,26 @@ def story(story_id):
story = Story.query.get_or_404(story_id) story = Story.query.get_or_404(story_id)
is_tree = story.is_tree is_tree = story.is_tree
paragraph_part = Paragraph.query.filter_by(
story_id=story_id, is_chosen=True, is_hidden=False
).all()
if is_tree:
tail = request.args.get('tail', story.tail, type=int)
p_tail = Paragraph.query.get_or_404(tail)
if p_tail.story_id != story_id:
abort(404)
paragraph_part = [p_tail]
p = p_tail
while p.parent_id:
p = Paragraph.query.get_or_404(p.parent_id)
paragraph_part.insert(0, p)
else:
tail = story.tail
paragraph_part = Paragraph.query.filter_by(
story_id=story_id, is_chosen=True, is_hidden=False
).all()
sort_by = request.args.get('sort_by', 'time') sort_by = request.args.get('sort_by', 'time')
q = Paragraph.query.filter_by(parent_id=story.tail, is_hidden=False)
q = Paragraph.query.filter_by(story_id=story_id, parent_id=tail, is_hidden=False)
q = q.order_by(Paragraph.like_num.desc() if sort_by == 'like' else q = q.order_by(Paragraph.like_num.desc() if sort_by == 'like' else
Paragraph.id.desc()) Paragraph.id.desc())
pagination = q.paginate(max_per_page=100) pagination = q.paginate(max_per_page=100)
@ -217,9 +258,14 @@ def create():
if not text or len(text) > 140: if not text or len(text) > 140:
abort(422) abort(422)
story = Story.query.get_or_404(story_id) story = Story.query.get_or_404(story_id)
if story.is_tree:
parent_id = request.form.get('tail', type=int)
else:
parent_id = story.tail
p = Paragraph( p = Paragraph(
parent_id=story.tail,
parent_id=parent_id,
story_id=story_id, story_id=story_id,
text=text, text=text,
author=session['username'] author=session['username']

+ 13
- 5
templates/story.html View File

@ -38,18 +38,22 @@
<div class="part1 col-md-6"> <div class="part1 col-md-6">
<div class="story-box qbox part-box"> <div class="story-box qbox part-box">
<h1>{{story.title}}</h1> <h1>{{story.title}}</h1>
<p class="story-text" title="{{paragraph_part[0].author}}, {{paragraph_part[0].create_at}}, {{paragraph_part[0].like_num}}">{{paragraph_part[0].text}}</p>
<img src="{{story.avatar}}" style="width: 80%"> <img src="{{story.avatar}}" style="width: 80%">
<hr> <hr>
{% for p in paragraph_part[1:] %}
<p class="story-text" title="{{p.author}}, {{p.create_at}}, {{p.like_num}}">{{p.text}}</p>
{% for p in paragraph_part %}
<p class="story-text" title="{{p.author}}, {{p.create_at}}, {{p.like_num}}">
{{p.text}}
{% if is_tree and p.id != tail %}
<small><a href="?tail={{p.id}}"> ← 回到这里</a></small>
{% endif %}
</p>
{% endfor %} {% endfor %}
</div> </div>
<div style="font-size:90%;"> <div style="font-size:90%;">
<ul> <ul>
<li>点击“续!”进行创作。</li> <li>点击“续!”进行创作。</li>
{% if story.is_tree %}
{% if is_tree %}
<li>从第二天开始,在每天的10:00/16:00/22:00,对应故事线赞数总和最高且自身赞数不小于{{min_like_num}}的续写将入选,成为这个角色默认展示故事的一部分。</li> <li>从第二天开始,在每天的10:00/16:00/22:00,对应故事线赞数总和最高且自身赞数不小于{{min_like_num}}的续写将入选,成为这个角色默认展示故事的一部分。</li>
{% else %} {% else %}
<li>在每天的10:00/16:00/22:00,赞数最高且不小于{{min_like_num}}的续写将入选,成为这个角色最终故事的一部分。如果没有,所有都会被保留进入下一时段。</li> <li>在每天的10:00/16:00/22:00,赞数最高且不小于{{min_like_num}}的续写将入选,成为这个角色最终故事的一部分。如果没有,所有都会被保留进入下一时段。</li>
@ -61,7 +65,7 @@
</div> </div>
<div class="part2" id="part2"> <div class="part2" id="part2">
<div class="paragraph-list twin front part-box">
<div class="paragraph-list twin front part-box">
<h1 style="margin: -8px -5px 20px">备选后续</h1> <h1 style="margin: -8px -5px 20px">备选后续</h1>
<span style="margin:8px" class="sort-by"> <span style="margin:8px" class="sort-by">
{% if sort_by == 'like' %} {% if sort_by == 'like' %}
@ -74,6 +78,9 @@
{% for p in pagination.items %} {% for p in pagination.items %}
<div class="qbox"> <div class="qbox">
<small>No. {{p.id}}</small> <small>No. {{p.id}}</small>
{% if is_tree %}
<small><a href="?tail={{p.id}}"> ← 查看后续</a></small>
{% endif %}
<p class="story-text">{{p.text}}</p> <p class="story-text">{{p.text}}</p>
<div class="text-end" title="{{p.create_at}}"> <div class="text-end" title="{{p.create_at}}">
{% for emoji, num, reacted, kind in p.reaction_status() %} {% for emoji, num, reacted, kind in p.reaction_status() %}
@ -109,6 +116,7 @@
<h1 style="text-align:right;margin:-8px -8px 16px">续!</h1> <h1 style="text-align:right;margin:-8px -8px 16px">续!</h1>
<form action="create" method="post"> <form action="create" method="post">
<input type="hidden" name="story-id" value={{story_id}}> <input type="hidden" name="story-id" value={{story_id}}>
<input type="hidden" name="tail" value={{tail}}>
<div class="form-group"> <div class="form-group">
<textarea class="form-control" name="text" rows="11" placeholder="来续写{{story.title}}的故事吧!(不超过 140 字)" required maxLength="140"></textarea> <textarea class="form-control" name="text" rows="11" placeholder="来续写{{story.title}}的故事吧!(不超过 140 字)" required maxLength="140"></textarea>
</div> </div>

Loading…
Cancel
Save