-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patharticles.py
127 lines (115 loc) · 3.95 KB
/
articles.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
from sqlalchemy.orm.session import Session
from sqlalchemy import desc
from fastapi import Depends
from datetime import datetime
from typing import List, Tuple
from main import app, get_db, manager
import schemas
import exceptions
import models
from mailer_functions import send_briefs
@app.post(
"/api/v1/add_article",
response_model=schemas.RequestResult,
tags=["Article manipulation"],
)
async def add_article(
article_model: schemas.ArticleForAdd,
categories_list: List[int],
db_session: Session = Depends(get_db),
user: models.User = Depends(manager),
):
article = models.Article()
article.header = article_model.header
article.content = article_model.content
article.author_id = user.id
article.image = article_model.image
if user.type.value >= models.UserType.moderator.value:
article.status = models.ModerationStatus.published
article.publication_date = datetime.now()
db_session.add(article)
article_id = article.id
for cat_id in categories_list:
category = (
db_session.query(models.Category)
.filter(models.Category.id == cat_id)
.one_or_none()
)
if category is None:
raise exceptions.InvalidCategory
db_session.add(
models.article_category_association_table(
article_id=article_id, category_id=cat_id
)
)
db_session.commit()
db_session.flush()
return {"result": "success"}
@app.post(
"/api/v1/change_article/{article_id}",
response_model=schemas.RequestResult,
tags=["Article manipulation"],
)
async def change_the_article(
changing_props: schemas.Article,
article_id: int,
user: models.User = Depends(manager),
db_session: Session = Depends(get_db),
):
if user.type.value < models.UserType.moderator.value:
raise exceptions.PermissionDenied
article = (
db_session.query(models.Article)
.filter(models.Article.id == article_id)
.one_or_none()
)
if article is None:
raise exceptions.ArticleDoesNotExists
# for i in changing_props.__fields_set__:
# if i == "status":
# article.status = models.ModerationStatus(changing_props[i])
# if changing_props[i] == models.ModerationStatus.published.value:
# article.publication_date = datetime.now()
# else:
# setattr(article, i, changing_props[i])
article.image = changing_props.image
article.header = changing_props.header
article.content = changing_props.content
article.status = changing_props.status
if changing_props.status.value == models.ModerationStatus.published.value:
article.publication_date = datetime.now()
db_session.commit()
db_session.flush()
return {"result": "success"}
@app.get(
"/api/v1/send_briefs",
response_model=schemas.RequestResult,
tags=["Article manipulation"],
)
async def send_briefs_to_subscribed_users(
user: models.User = Depends(manager), db_session: Session = Depends(get_db)
):
if user.type.value < models.UserType.moderator.value:
raise exceptions.PermissionDenied
users_for_sending = (
db_session.query(models.User).filter(models.User.subscribed).all()
)
if len(users_for_sending) == 0:
return {"result": "success"}
emails_for_sending: List[Tuple[str, str]] = [
(user.email, user.first_name + " " + user.last_name)
for user in users_for_sending
]
articles = (
db_session.query(models.Article)
.filter(models.Article.status == models.ModerationStatus.published)
.order_by(desc(models.Article.publication_date))
.limit(10)
.offset(0)
.all()
)
text = "Check our new exciting news\n"
for article in articles:
text += f'<a href="https://news.asap-it.tech/new/{article.id}">{article.header}</a><br/>'
send_briefs(emails_for_sending, text)
return {"result": "success"}