def add_favorite_clubs(): """ POST endpoint that adds favorite club(s) for student user. Ordering is preserved based on *when* they favorited. """ user = get_current_user() json = g.clean_json new_fav_clubs_query = NewOfficerUser.objects \ .filter(confirmed=True) \ .filter(club__link_name__in=json['clubs']) \ .only('club.link_name') potential_clubs = [ club['club']['link_name'] for club in query_to_objects(new_fav_clubs_query) ] for club in potential_clubs: if club not in user.favorited_clubs: user.favorited_clubs += [club] user.save() return jsonify(_fetch_user_profile(user)['favorited_clubs'])
def _fetch_user_profile(user): """ Helper function to fetch the user's profile as a dictionary ready to be sent as JSON. """ user_obj = query_to_objects_full(user) full_fav_clubs_query = NewOfficerUser.objects \ .filter(club__link_name__in=user.favorited_clubs) \ .only('club.name', 'club.link_name', 'club.events', 'club.recruiting_events') full_fav_clubs = [ obj['club'] for obj in query_to_objects(full_fav_clubs_query) ] full_club_board = {} for key in user.club_board: club_query = NewOfficerUser.objects \ .filter(club__link_name__in=user.club_board[key]) \ .only('club.name', 'club.link_name', 'club.logo_url', 'club.events', 'club.recruiting_events') column_clubs = [obj['club'] for obj in query_to_objects(club_query)] full_club_board[key] = column_clubs if CurrentConfig.DEBUG: recommended_clubs = _random_smart_club_recommendations(3) else: # TODO: Implement "smart" club recommendations. recommended_clubs = _random_smart_club_recommendations(3) return { 'full_name': user.full_name, 'email': user.email, 'majors': user_obj['majors'], 'minors': user_obj['minors'], 'interests': user_obj['interests'], 'favorited_clubs': full_fav_clubs, 'club_board': full_club_board, 'recommended_clubs': recommended_clubs, }
def fetch_profile(): """ GET endpoint that fetches the complete club profile from an officer user. """ user = get_current_user() club_obj = query_to_objects(user.club) club_obj['owner'] = user.email club_obj['confirmed'] = user.confirmed return club_obj
def get_organizations(): """ GET endpoint that fetches the list of organizations without filters, sorted alphabetically. """ limit = to_int_safe(request.args.get('limit'), 50) skip = to_int_safe(request.args.get('skip'), 0) query = NewOfficerUser.objects \ .filter(confirmed=True) \ .filter(club__reactivated=True) \ .only(*CATALOG_VIEW_FIELDS) \ .order_by('club.name') \ .limit(limit) \ .skip(skip) results = [obj['club'] for obj in query_to_objects(query)] return {'results': results, 'num_results': query.count()}
def _fetch_clubs(): """ Utility function to fetch the entire list of clubs by name, email, confirmation and reactivation status. """ club_list_query = NewOfficerUser.objects.scalar('club.name', 'email', 'confirmed', 'club.reactivated') raw_club_list = query_to_objects(club_list_query) club_list = [] for club in raw_club_list: del club['id'] del club['_cls'] club_list.append({ 'name': club['club']['name'], 'email': club['email'], 'confirmed': club['confirmed'], 'reactivated': club['club']['reactivated'], }) return club_list
def get_org_by_id(org_link_name): """ GET endpoint that fetches all information of the requested club organization, including its similarly recommended clubs. """ user = NewOfficerUser.objects( club__link_name=org_link_name, confirmed=True, club__reactivated=True, ).first() if user is None: raise JsonError(status='error', reason='The requested club does not exist!', status_=404) club_obj = query_to_objects(user.club) for event in club_obj['events']: del event['_cls'] current_user = get_current_user() if current_user and current_user.role == 'student': # Save the club as part of the student's visiting history of clubs current_user.visited_clubs += [org_link_name] current_user.save() if CurrentConfig.DEBUG: club_obj['recommended_clubs'] = _random_generic_club_recommendations(3) else: recommended_club_link_names = flask_exts.club_recommender.recommend( org_link_name) club_obj['recommended_clubs'] = _fetch_recommended_club_info( recommended_club_link_names) return club_obj
def get_num_user_tags(): """ GET endpoint that fetches the set of "# of users" tags. """ return query_to_objects(NumUsersTag.objects.all())
def get_tags(): """ GET endpoint that fetches the set of club tags. """ return query_to_objects(Tag.objects.all())
from slugify import slugify from models.officer import Question from utils import try_parsing_datetime, random_slugify, pst_right_now from init_app import flask_exts from flask import Blueprint, request, g from flask_json import as_json, JsonError from flask_utils import validate_json, query_to_objects, role_required from flask_jwt_extended import jwt_required, get_current_user from models import * admin_blueprint = Blueprint('admin', __name__, url_prefix='/api/admin') _fetch_resources_list = lambda user: [query_to_objects(res) for res in user.club.resources] _fetch_event_list = lambda user: [query_to_objects(event) for event in user.club.events] _fetch_recruiting_events_list = lambda user: [query_to_objects(r_event) for r_event in user.club.recruiting_events] _fetch_gallery_media_list = lambda user: [query_to_objects(gallery_media) for gallery_media in user.club.gallery_media] _fetch_question_list = lambda user: [query_to_objects(question) for question in user.club.faq] @admin_blueprint.route('/profile', methods=['GET']) @jwt_required @role_required(roles=['officer']) def fetch_profile(): """ GET endpoint that fetches the complete club profile from an officer user. """ user = get_current_user()
def get_student_years(): """ GET endpoint that fetches the set of student years. """ return query_to_objects(StudentYear.objects.all())
def get_minors(): """ GET endpoint that fetches the set of minors in UC Berkeley. """ return query_to_objects(Minor.objects.all())
from flask_jwt_extended import jwt_required, get_current_user from models import * from flask_jwt_extended import (jwt_required, jwt_refresh_token_required, create_access_token, create_refresh_token, get_raw_jwt, get_jti, get_current_user) from authomatic.extras.flask import FlaskAuthomatic from authomatic.providers import oauth2 from app_config import CurrentConfig PSEUDO_PASSWORD_PREFIX = 'UNUSABLE_PASSWORD' _fetch_fav_clubs_list = lambda user: [ query_to_objects(club) for club in user.favorited_clubs ] student_blueprint = Blueprint('student', __name__, url_prefix='/api/student') def _random_smart_club_recommendations(size): """ Generates random "smart" clubs recommendations, intended for testing purposes only. """ random_recommended_users = NewOfficerUser.objects \ .filter(confirmed=True) \ .filter(club__reactivated=True) \ .aggregate([{ '$sample': {'size': size} }])