Блок "популярное" в разделе публикаций

This commit is contained in:
mrmur 2022-04-18 15:04:07 +05:00
parent 2a40e3957a
commit 4c536e528a
7 changed files with 206 additions and 25 deletions

View File

@ -1 +1 @@
from . import users, diary_post, questions, answer_quest, like
from . import users, diary_post, questions, answer_quest, like, popularity

15
data/popularity.py Normal file
View File

@ -0,0 +1,15 @@
import sqlalchemy
from flask_login import UserMixin
from .db_session import SqlAlchemyBase
class Popularity(SqlAlchemyBase, UserMixin):
__tablename__ = 'popularity'
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True, autoincrement=True)
post = sqlalchemy.Column(sqlalchemy.Integer,
sqlalchemy.ForeignKey("posts.id"), nullable=True, default=None)
popularity = sqlalchemy.Column(sqlalchemy.Integer,
nullable=True, default=None)
edit_date = sqlalchemy.Column(sqlalchemy.DateTime, nullable=True, default=None)

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 MiB

98
main.py
View File

@ -11,6 +11,7 @@ from data import db_session
from data.answer_quest import Answer
from data.diary_post import DiaryPost
from data.like import Like
from data.popularity import Popularity
from data.questions import Quest
from data.users import User
from forms.add_question import AddQuest
@ -76,10 +77,28 @@ def new_like(user_id, post_id, ret_href):
session = db_session.create_session()
find = session.query(Like).filter(Like.post == post_id, Like.user == user_id).first()
if find:
if (find.date - datetime.datetime.now()).days <= 30:
pop = session.query(Popularity).filter(Popularity.post == post_id).first()
pop.popularity = 10 * sum(1 if (i.date - datetime.datetime.now()).days <= 30 else 0 for i in
session.query(Like).filter(Like.post == post_id).all()) - 10
if not pop.popularity:
session.delete(pop)
session.delete(find)
session.commit()
return redirect(f"/{ret_href}")
else:
popular = session.query(Popularity).filter(Popularity.post == post_id).first()
if not popular:
pop = Popularity()
pop.post = post_id
pop.popularity = 10
pop.edit_date = datetime.datetime.now()
session.add(pop)
else:
if (find.date - datetime.datetime.now()).day <= 30:
pop = session.query(Popularity).filter(Popularity.post == post_id).first()
pop.popularity = 10 * sum(1 if (i.date - datetime.datetime.now()).day <= 30 else 0 for i in
session.query(Like).filter(Like.post == post_id).all()) + 10
like = Like()
like.user = user_id
like.post = post_id
@ -107,29 +126,62 @@ def publications():
if abs((i.date - datetime.datetime.now()).days) <= day:
fresh_posts.append(copy_pos.pop(copy_pos.index(i)))
emotion_fresh = []
for i in fresh_posts:
emotion = {id: i.id, 'pos_emot': [], 'nig_emot': [], 'link': [],
'author': session.query(User).filter(User.id == i.author).first(), 'like': None, 'is_like': 0}
if i.pos_emot:
emotion['pos_emot'] = i.pos_emot.split()
else:
emotion['pos_emot'] = None
if i.nig_emot:
emotion['nig_emot'] = i.nig_emot.split()
else:
emotion['nig_emot'] = None
if i.link:
emotion['link'] = i.link.split()
else:
emotion['link'] = None
like = session.query(Like).filter(Like.post == i.id).all()
if like:
emotion['like'] = len(like)
if current_user.is_authenticated:
if session.query(Like).filter(Like.post == i.id, Like.user == current_user.id).first():
emotion['is_like'] = 1
emotion_fresh.append(emotion)
return render_template('publications.html', fresh_post=fresh_posts, emotion_fresh=emotion_fresh, title='moona')
if fresh_posts:
for i in fresh_posts:
emotion = {id: i.id, 'pos_emot': [], 'nig_emot': [], 'link': [],
'author': session.query(User).filter(User.id == i.author).first(), 'like': None, 'is_like': 0}
if i.pos_emot:
emotion['pos_emot'] = i.pos_emot.split()
else:
emotion['pos_emot'] = None
if i.nig_emot:
emotion['nig_emot'] = i.nig_emot.split()
else:
emotion['nig_emot'] = None
if i.link:
emotion['link'] = i.link.split()
else:
emotion['link'] = None
like = session.query(Like).filter(Like.post == i.id).all()
if like:
emotion['like'] = len(like)
if current_user.is_authenticated:
if session.query(Like).filter(Like.post == i.id, Like.user == current_user.id).first():
emotion['is_like'] = 1
emotion_fresh.append(emotion)
pop = sorted(session.query(Popularity).all(), key=lambda x: x.popularity, reverse=True)
if pop:
if len(pop) > 50:
pop = pop[:50]
pop_post = [session.query(DiaryPost).filter(DiaryPost.public == 1, DiaryPost.id == i.post).first() for i in pop]
emotion_pop = []
for i in pop_post:
emotion = {id: i.id, 'pos_emot': [], 'nig_emot': [], 'link': [],
'author': session.query(User).filter(User.id == i.author).first(), 'like': None, 'is_like': 0}
if i.pos_emot:
emotion['pos_emot'] = i.pos_emot.split()
else:
emotion['pos_emot'] = None
if i.nig_emot:
emotion['nig_emot'] = i.nig_emot.split()
else:
emotion['nig_emot'] = None
if i.link:
emotion['link'] = i.link.split()
else:
emotion['link'] = None
like = session.query(Like).filter(Like.post == i.id).all()
if like:
emotion['like'] = len(like)
if current_user.is_authenticated:
if session.query(Like).filter(Like.post == i.id, Like.user == current_user.id).first():
emotion['is_like'] = 1
emotion_pop.append(emotion)
else:
pop_post = []
emotion_pop = []
return render_template('publications.html', fresh_post=fresh_posts, emotion_fresh=emotion_fresh, title='moona',
pop_post=pop_post, emotion_pop=emotion_pop)
@app.route('/answer_quest/<int:id>', methods=['GET', 'POST'])

BIN
static/img/MoonCcircl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 KiB

View File

@ -3,7 +3,104 @@
{% block content %}
<table>
<td id="row1"></td>
<td id="row1">
<h1 class="post_zag">Популярное</h1>
<div class="fresh_block" id="pop">
{% if pop_post != [] %}
{% for item in pop_post %}
<div class="card-body post">
<details>
<summary>
{% if item.name != None %}
<h2 class="card-title post_zag" style="color:#c5f1ff">{{item.name}}</h2>
{% endif %}
</summary>
{% if item.text != None %}
<strong class="card-text" style="color:#ffffff">{{item.text}}</strong>
{% endif %}
</details>
{% if emotion_pop[loop.index0]['pos_emot'] != None %}
<div class="pos_emot">
<details>
<summary class="emot_block">
<strong class="emot_block">Позитивные эмоции</strong>
</summary>
<p></p>
{% for item2 in emotion_pop[loop.index0]['pos_emot'] %}
<strong class="alert alert-success" role="alert" style="border-radius: 22px;">{{item2}}</strong>
{% endfor %}
</details>
</div>
<p></p>
{% endif %}
{% if emotion_pop[loop.index0]['nig_emot'] != None %}
<div class="nig_emot">
<details>
<summary class="emot_block">
<strong class="emot_block">Негативные эмоции</strong>
</summary>
<p></p>
{% for item2 in emotion_pop[loop.index0]['nig_emot'] %}
<strong class="alert alert-danger" role="alert" style="border-radius: 22px;">{{item2}}</strong>
{% endfor %}
</details>
</div>
<p></p>
{% endif %}
{% if item.photo != None %}
<p></p>
<div class="photo">
<img width="90%" src="{{ item.photo }}"
style="border-radius: 22px;">
</div>
<p></p>
{% endif %}
{% if current_user.is_authenticated %}
<div class="like">
<a type="button"
href="/new_like/{{current_user.id}}/{{item.id}}/publications">
{% if emotion_pop[loop.index0]['is_like'] %}
<img src="../static/img/like_add.png" width="117" height="100">
{% else %}
<img src="../static/img/like.png" width="94" height="80">
{% endif %}
</a>
{% if emotion_pop[loop.index0]['like'] != None %}
<p style="color:#ffffff">{{emotion_pop[loop.index0]['like']}}</p>
{% endif %}
</div>
{% endif %}
{% if emotion_pop[loop.index0]['link'] != None %}
<details>
<summary class="emot_block">
<strong class="emot_block">Ссылки</strong>
</summary>
<p></p>
{% for item2 in emotion_pop[loop.index0]['link'] %}
<div class="link">
<a class="alert alert-light" role="alert" href="{{ item2 }}" style="border-radius: 22px;">Ссылка
{{ loop.index }}</a>
</div>
<p></p>
{% endfor %}
</details>
{% endif %}
<div class="author" style="style=position:absolute; width:148px; height:44px; left:255px; -webkit-border-radius:
22px;-moz-border-radius: 22px;border-radius: 22px; border:2px solid #FFFFFF; background-color:#1daff0; top:
98px;"><img src="../{{ emotion_pop[loop.index0]['author'].photo }}" width="40" height="40"
style="border-radius: 22px">
<strong style="color: #ffffff">{{ emotion_pop[loop.index0]['author'].name }}</strong>
</div>
<strong style="color:#ffffff">{{item.date}}</strong>
</div>
{% endfor %}
</div>
{% else %}
<div class="bad_centre" style="background-color:#1daff0; border-radius: 22px;color:#ffffff">
<h1 class="hz1">Ничего не нашлось :с</h1>
</div>
{% endif %}
</td>
<td id="row2">
<h1 class="post_zag">Свежее</h1>
<div class="fresh_block" id="fresh">