SocialNetwork

Форк
0
/
app.py 
393 строки · 11.1 Кб
1
import datetime
2
import os
3
from pprint import pprint
4

5
import humanize
6
from flask import Flask, session, request, redirect, render_template, abort
7
import spotipy
8

9
from flask_restful import Api
10
from flask_uploads import configure_uploads, patch_request_class
11

12
import funcs_api
13
import music
14
import rest_api
15
import utils.some
16
import weather
17
from data import db_session
18

19
from flask_login import LoginManager, login_user, login_required, logout_user, current_user
20
from flask_session import Session
21

22
from data.posts import Post
23
from data.users import User
24
from forms.contacts import ContactInformation
25
from forms.personal_info import PersonalInformation
26
from forms.profile_settings import AccountSetting, SocialMedia, ChangePassword
27
from forms.upload import photos, UploadPhoto
28
from forms.user import RegisterUser, LoginUser
29

30
from PIL import Image
31
import random
32

33
from utils.spotify import spotify_login_required, SCOPE, get_followed_artists, get_all_artist_tracks
34

35
basedir = os.path.abspath(os.path.dirname(__file__))
36

37
app = Flask(__name__)
38
app.config['SECRET_KEY'] = os.urandom(64)
39
app.config['SESSION_TYPE'] = 'filesystem'
40
app.config['SESSION_FILE_DIR'] = './.flask_session/'
41
app.config['SECRET_KEY'] = 'spotify_project_secret_key'
42
app.config['UPLOADED_PHOTOS_DEST'] = os.path.join(basedir, 'static/uploaded_photos')
43
Session(app)
44

45
login_manager = LoginManager()
46
login_manager.init_app(app)
47

48
configure_uploads(app, photos)
49
patch_request_class(app)
50

51
api = Api(app)
52
post_resource = rest_api.PostResource()
53
post_list_resource = rest_api.PostListResource()
54

55

56
def crop_center(pil_img, crop_width: int, crop_height: int) -> Image:
57
    """
58
    Функция для обрезки изображения по центру.
59
    """
60
    img_width, img_height = pil_img.size
61
    return pil_img.crop(((img_width - crop_width) // 2,
62
                         (img_height - crop_height) // 2,
63
                         (img_width + crop_width) // 2,
64
                         (img_height + crop_height) // 2))
65

66

67
def crop_max_square(pil_img):
68
    return crop_center(pil_img, min(pil_img.size), min(pil_img.size))
69

70

71
@login_manager.user_loader
72
def load_user(user_id):
73
    db_sess = db_session.create_session()
74
    return db_sess.query(User).get(user_id)
75

76

77
@app.route('/')
78
@app.route('/index')
79
@app.route('/news')
80
@app.route('/newsfeed')
81
@login_required
82
def index():
83
    return redirect('/newsfeed/page1')
84

85

86
@app.route('/newsfeed/page<int:page_num>')
87
@login_required
88
@spotify_login_required
89
def newsfeed(page_num: int, spotify: spotipy.Spotify):
90
    db_sess = db_session.create_session()
91

92
    def format_date(date):
93
        date = date.split('-')
94
        year = int(date[0])
95
        month = int(date[1])
96
        day = int(date[2])
97
        return humanize.naturaltime(
98
            datetime.datetime.now() - datetime.datetime(year=year, month=month, day=day))
99

100
    params = {
101
        'spotify': spotify,
102
        'current_user': db_sess.query(User).get(current_user.id),
103
        'new_releases':
104
            spotify.new_releases(country='RU', limit=20, offset=20 * (page_num - 1))['albums'][
105
                'items'],
106
        'followed_artists': sorted(get_followed_artists(spotify), key=lambda x: x['popularity'],
107
                                   reverse=True)[:8:],
108
        'format_date': format_date,
109
        'page': page_num
110
    }
111

112
    return render_template('newsfeed.html', **params)
113

114

115
@app.route('/anecdotes')
116
@login_required
117
def anecdotes():
118
    db_sess = db_session.create_session()
119
    user = db_sess.query(User).get(current_user.id)
120

121
    anec = funcs_api.get_anec().json['anecdote']
122

123
    params = {
124
        'current_user': user,
125
        'anec':anec
126
    }
127

128

129
    return render_template('anecs.html', **params)
130

131

132
@app.route('/register', methods=['GET', 'POST'])
133
def register():
134
    if current_user.is_authenticated:
135
        return redirect('/profile')
136
    db_sess = db_session.create_session()
137

138
    form = RegisterUser()
139

140
    if form.validate_on_submit():
141
        user = User()
142
        user.name = form.name.data
143
        user.surname = form.surname.data
144
        user.email = form.email.data
145
        user.set_password(form.password.data)
146

147
        db_sess.add(user)
148
        db_sess.commit()
149

150
        login_user(user, remember=form.remember_me.data)
151
        return redirect("/")
152

153
    params = {
154

155
    }
156

157
    return render_template('register.html', form=form, **params)
158

159

160
@app.route('/login', methods=['GET', 'POST'])
161
def login():
162
    if current_user.is_authenticated:
163
        return redirect('/profile')
164
    db_sess = db_session.create_session()
165
    form = LoginUser()
166
    if form.validate_on_submit():
167
        user = db_sess.query(User).filter(User.email == form.email.data).first()
168
        if user and user.check_password(form.password.data):
169
            login_user(user, remember=form.remember_me.data)
170
            return redirect("/profile")
171
        return render_template('login.html',
172
                               message="Неправильный логин или пароль",
173
                               form=form)
174

175
    params = {
176

177
    }
178

179
    return render_template('login.html', form=form, **params)
180

181

182
@app.route('/logout')
183
@login_required
184
def logout():
185
    logout_user()
186
    return redirect("/login")
187

188

189
@app.route('/profile', methods=['GET', 'POST'])
190
@login_required
191
def profile():
192
    db_sess = db_session.create_session()
193
    user = db_sess.query(User).get(current_user.id)
194

195
    posts = list(db_sess.query(Post).filter(Post.user_id == user.id))
196

197
    params = {
198
        'current_user': user,
199
    }
200

201
    return render_template('profile.html', posts=posts, **params)
202

203

204
@app.route('/id<id>')
205
@login_required
206
def user(id, ):
207
    db_sess = db_session.create_session()
208
    user = db_sess.query(User).get(id)
209
    posts = db_sess.query(Post).filter(Post.user_id == user.id)
210

211
    curr_user = db_sess.query(User).get(current_user.id)
212

213
    params = {
214
        'current_user': curr_user,
215
    }
216

217
    return render_template('user.html', user=user, posts=list(posts), **params)
218

219

220
@app.route('/friends')
221
@login_required
222
def friends():
223
    db_sess = db_session.create_session()
224

225
    params = {
226
        'current_user': db_sess.query(User).get(current_user.id),
227
    }
228

229
    return render_template('friends.html', **params)
230

231

232
@app.route('/profile/edit', methods=['GET', 'POST'])
233
@login_required
234
def profile_edit():
235
    db_sess = db_session.create_session()
236

237
    params = {'current_user': db_sess.query(User).get(current_user.id),
238
              'messages': {}}
239

240
    user = db_sess.query(User).filter(User.id == current_user.id).first()
241

242
    personal_info = PersonalInformation()
243
    params['form'] = personal_info
244

245
    if personal_info.validate_on_submit():
246

247
        user.name = personal_info.name.data
248
        user.surname = personal_info.surname.data
249
        user.gender = personal_info.gender.data
250
        user.age = personal_info.age.data
251
        user.marital_status = personal_info.marital_status.data
252
        user.city = personal_info.city.data
253
        user.address = personal_info.address.data
254

255
        if personal_info.photo.data:
256
            filename = photos.save(personal_info.photo.data)
257
            file_url = photos.url(filename)
258

259
            os.chdir('static')
260
            os.chdir('uploaded_photos')
261

262
            fname = f'id{current_user.id}_avatar.jpg'
263

264
            if os.path.exists(fname):
265
                os.remove(fname)
266
            os.rename(filename, fname)
267

268
            crop_max_square(Image.open(fname)).save(fname)
269

270
            os.chdir('..')
271
            os.chdir('..')
272

273
            user.avatar = f'/static/uploaded_photos/{fname}'
274

275
    change_password = ChangePassword()
276
    params['change_password'] = change_password
277

278
    if change_password.validate_on_submit():
279
        if user.check_password(
280
                change_password.old_pass.data) and change_password.new_pass.data == change_password.new_pass_again.data:
281
            user.set_password(change_password.new_pass.data)
282
            db_sess.commit()
283
            return redirect('/logout')
284
        if not user.check_password(change_password.old_pass.data):
285
            params['messages']['old_pass'] = 'Wrong old password'
286
        if not change_password.new_pass.data == change_password.new_pass_again.data:
287
            params['messages']['new_pass_again'] = 'New passwords do not match'
288

289
    contact_info = ContactInformation()
290
    params['contact_info'] = contact_info
291
    if contact_info.validate_on_submit():
292
        if contact_info.email.data == current_user.email and contact_info.new_email.data == contact_info.new_email_again.data:
293
            if contact_info.new_email.data:
294
                user.email = contact_info.new_email_again.data
295
        if contact_info.email.data != current_user.email:
296
            params['messages']['email'] = 'Wrong old Email'
297
        if contact_info.new_email.data != contact_info.new_email_again.data:
298
            params['messages']['new_email_again'] = 'New Emails do not match'
299

300
        if contact_info.phone.data:
301
            user.phone = contact_info.phone.data
302
        if contact_info.url:
303
            user.url = contact_info.url.data
304

305
        if contact_info.vk.data:
306
            user.vk = contact_info.vk.data
307
        user.show_vk = contact_info.show_vk.data
308

309
        if contact_info.facebook.data:
310
            user.facebook = contact_info.facebook.data
311
        user.show_facebook = contact_info.show_facebook.data
312

313
        if contact_info.twitter.data:
314
            user.twitter = contact_info.twitter.data
315
        user.show_twitter = contact_info.show_twitter.data
316

317
        if contact_info.instagram.data:
318
            user.instagram = contact_info.instagram.data
319
        user.show_instagram = contact_info.show_instagram.data
320

321
        if contact_info.youtube.data:
322
            user.youtube = contact_info.youtube.data
323
        user.show_youtube = contact_info.show_youtube.data
324

325
    db_sess.commit()
326

327
    return render_template('edit_profile.html', **params)
328

329

330
@app.route('/profile/privacy')
331
@login_required
332
def privacy_settings():
333
    db_sess = db_session.create_session()
334

335
    params = {
336
        'current_user': db_sess.query(User).get(current_user.id),
337
    }
338

339
    return render_template('comingsoon.html', **params)
340

341
@app.route('/messages/<int:peer>')
342
@login_required
343
def chat(peer:int):
344
    db_sess = db_session.create_session()
345
    curr_user = db_sess.query(User).get(current_user.id)
346

347

348

349
    params = {
350
        'current_user': curr_user,
351

352
    }
353

354

355
@app.errorhandler(404)
356
def page_not_found(e):
357
    return render_template('404.html'), 404
358

359

360
@app.errorhandler(401)
361
def unauthorized(e):
362
    return redirect('/login')
363

364

365
@app.route('/test')
366
@login_required
367
def test():
368
    db_sess = db_session.create_session()
369

370
    params = {
371
        'current_user': db_sess.query(User).get(current_user.id),
372
    }
373

374
    return render_template('test_page.html', **params)
375

376
@app.route('/about')
377
def about():
378
    return render_template('about.html')
379

380

381

382
if __name__ == '__main__':
383
    db_session.global_init("db/database.db")
384

385
    app.register_blueprint(funcs_api.blueprint)
386
    app.register_blueprint(music.blueprint)
387
    app.register_blueprint(weather.blueprint)
388

389
    api.add_resource(rest_api.PostListResource, '/api/posts/<int:user_id>')
390
    api.add_resource(rest_api.PostResource, '/api/post/<int:post_id>')
391
    api.add_resource(rest_api.FriendsResource, '/api/friends/<int:user_id>/<int:friend_id>')
392

393
    app.run(threaded=True, port=8080, debug=True)
394

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.