|
|
- # -*- coding: utf-8 -*-
- """
- :author: Grey Li (李辉)
- :url: http://greyli.com
- :copyright: © 2018 Grey Li <withlihui@gmail.com>
- :license: MIT, see LICENSE for more details.
- """
- from flask import render_template, jsonify, Blueprint
- from flask_login import current_user
-
- from albumy.models import User, Photo, Notification
- from albumy.notifications import push_collect_notification, push_follow_notification
-
- ajax_bp = Blueprint('ajax', __name__)
-
-
- @ajax_bp.route('/notifications-count')
- def notifications_count():
- if not current_user.is_authenticated:
- return jsonify(message='Login required.'), 403
-
- count = Notification.query.with_parent(current_user).filter_by(is_read=False).count()
- return jsonify(count=count)
-
-
- @ajax_bp.route('/profile/<int:user_id>')
- def get_profile(user_id):
- user = User.query.get_or_404(user_id)
- return render_template('main/profile_popup.html', user=user)
-
-
- @ajax_bp.route('/followers-count/<int:user_id>')
- def followers_count(user_id):
- user = User.query.get_or_404(user_id)
- count = user.followers.count() - 1 # minus user self
- return jsonify(count=count)
-
-
- @ajax_bp.route('/<int:photo_id>/followers-count')
- def collectors_count(photo_id):
- photo = Photo.query.get_or_404(photo_id)
- count = len(photo.collectors)
- return jsonify(count=count)
-
-
- @ajax_bp.route('/collect/<int:photo_id>', methods=['POST'])
- def collect(photo_id):
- if not current_user.is_authenticated:
- return jsonify(message='Login required.'), 403
- if not current_user.confirmed:
- return jsonify(message='Confirm account required.'), 400
- if not current_user.can('COLLECT'):
- return jsonify(message='No permission.'), 403
-
- photo = Photo.query.get_or_404(photo_id)
- if current_user.is_collecting(photo):
- return jsonify(message='Already collected.'), 400
-
- current_user.collect(photo)
- if current_user != photo.author and photo.author.receive_collect_notification:
- push_collect_notification(collector=current_user, photo_id=photo_id, receiver=photo.author)
- return jsonify(message='Photo collected.')
-
-
- @ajax_bp.route('/uncollect/<int:photo_id>', methods=['POST'])
- def uncollect(photo_id):
- if not current_user.is_authenticated:
- return jsonify(message='Login required.'), 403
-
- photo = Photo.query.get_or_404(photo_id)
- if not current_user.is_collecting(photo):
- return jsonify(message='Not collect yet.'), 400
-
- current_user.uncollect(photo)
- return jsonify(message='Collect canceled.')
-
-
- @ajax_bp.route('/follow/<username>', methods=['POST'])
- def follow(username):
- if not current_user.is_authenticated:
- return jsonify(message='Login required.'), 403
- if not current_user.confirmed:
- return jsonify(message='Confirm account required.'), 400
- if not current_user.can('FOLLOW'):
- return jsonify(message='No permission.'), 403
-
- user = User.query.filter_by(username=username).first_or_404()
- if current_user.is_following(user):
- return jsonify(message='Already followed.'), 400
-
- current_user.follow(user)
- if user.receive_collect_notification:
- push_follow_notification(follower=current_user, receiver=user)
- return jsonify(message='User followed.')
-
-
- @ajax_bp.route('/unfollow/<username>', methods=['POST'])
- def unfollow(username):
- if not current_user.is_authenticated:
- return jsonify(message='Login required.'), 403
-
- user = User.query.filter_by(username=username).first_or_404()
- if not current_user.is_following(user):
- return jsonify(message='Not follow yet.'), 400
-
- current_user.unfollow(user)
- return jsonify(message='Follow canceled.')
|