HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/buyercall_forms/buyercall/buyercall/blueprints/api/doc/endpoints/account.py
from datetime import datetime
import logging

from flask import request, jsonify
from flask_restx import Resource
from sqlalchemy import func, and_, extract

from buyercall.lib.util_rest import (rest_partnership_account, rest_partnership,
                                     requires_auth, rest_is_partnership_account, rest_is_partnership)
from buyercall.blueprints.api.doc import serializers
from buyercall.blueprints.api.restplus import api
from buyercall.blueprints.partnership.models import PartnershipAccount
from buyercall.blueprints.leads.models import Lead
from buyercall.blueprints.user.models import User
from buyercall.extensions import db


log = logging.getLogger(__name__)
ns = api.namespace('account', description='Operations related to partnership accounts')


@ns.route('/details/')
@api.doc(responses={200: 'OK',
                    400: 'Error performing operation.',
                    401: 'Unauthorized request.',
                    404: 'Partnership account not found.'})
class AccountDetails(Resource):
    @requires_auth
    def get(self):
        """
        Retrieves partnership account details.

        Use this method to view the details of the partnership accounts.
        """
        if rest_is_partnership_account and rest_partnership_account:
            users = (db.session.query(User)).filter(User.partnership_account_id == rest_partnership_account.id).all()
            user_list = list()

            if users:
                for user in users:
                    add_user = {
                        'firstname': user.firstname,
                        'lastname': user.lastname,
                        'email': user.email,
                        'phonenumber': user.phonenumber,
                        'company': user.company,
                        'title': user.title,
                        'role': user.role
                    }
                    user_list.append(add_user)

            return jsonify(
                name=rest_partnership_account.name,
                is_active=rest_partnership_account.active,
                billing_type=rest_partnership_account.billing_type,
                users=user_list
            )
        elif rest_is_partnership and rest_partnership:
            partnership_accounts = rest_partnership.get_partnership_accounts()
            pa_list = list()
            users = (db.session.query(User)).filter(User.partnership_id == rest_partnership.id).all()
            user_list = list()

            if partnership_accounts:
                for pa in partnership_accounts:
                    pa_users = (db.session.query(User))\
                        .filter(and_(User.partnership_account_id == pa.id,
                                     User.active == True)).all()
                    pa_user_list = list()

                    if pa_users:
                        for pa_user in pa_users:
                            add_pa_user = {
                                'firstname': pa_user.firstname,
                                'lastname': pa_user.lastname,
                                'email': pa_user.email,
                                'phonenumber': pa_user.phonenumber,
                                'company': pa_user.company,
                                'title': pa_user.title,
                                'role': pa_user.role
                            }
                            pa_user_list.append(add_pa_user)

                    add_pa = {
                        'name': rest_partnership_account.name,
                        'billing_type': rest_partnership_account.billing_type,
                        'users': pa_user_list
                    }
                    pa_list.append(add_pa)

            if users:
                for user in users:
                    add_user = {
                        'firstname': user.firstname,
                        'lastname': user.lastname,
                        'email': user.email,
                        'phonenumber': user.phonenumber,
                        'company': user.company,
                        'title': user.title,
                        'role': user.role
                    }
                    user_list.append(add_user)

            return jsonify(
                name=rest_partnership.name,
                billing_type=rest_partnership.billing_type,
                users=user_list,
                accounts=pa_list
            )
        else:
            return api.abort(401)

    @api.response(204, 'Partnership account successfully added.')
    @api.expect(serializers.account_row, validate=True)
    @requires_auth
    def post(self):
        """
        Adds a partnership account.

        Use this method to add a partnership account.

        NB: Only can be used by a partnership.

        """
        if rest_is_partnership and rest_partnership:
            result = request.json

            if result:
                params = {
                    'name': result['name'],
                    'partnership_account_id': rest_partnership.id,
                    'active': True,
                    'billing_type': result['billing_type']
                }

                if PartnershipAccount.create(params):
                    return True, 204
                else:
                    api.abort(code=400, message="Error creating partnership account.")
            else:
                return api.abort(400)
        else:
            return api.abort(401)

    @api.response(204, 'Partnership account successfully updated.')
    @api.expect(serializers.account_row, validate=True)
    @requires_auth
    def put(self):
        """
        Update a partnership account.

        Use this method to update a partnership account.

        """
        if rest_is_partnership_account and rest_partnership_account:
            result = request.json

            if result:
                if PartnershipAccount.update(rest_partnership_account.id,
                                             result['name'],
                                             result['billing_type']):
                    return True, 204
                else:
                    api.abort(code=400, message="Error updating partnership account.")
            else:
                return api.abort(400)
        else:
            return api.abort(401)


@ns.route('/usage/')
@api.doc(responses={200: 'OK',
                    400: 'Error performing operation.',
                    401: 'Unauthorized request.',
                    404: 'Partnership account not found.'})
class Usage(Resource):
    @requires_auth
    def get(self):
        """
        Retrieves partnership usage measurements.

        Use this method to retrieve the total minutes used and minutes used this month.

        """

        if rest_is_partnership_account and rest_partnership_account:
            now = datetime.now()
            year = now.year
            month = now.month
            total_minutes_result = 0
            month_minutes_result = 0
            total_minutes = (db.session.query(func.sum(Lead.duration))
                             .filter(Lead.partnership_account_id == rest_partnership_account.id).scalar())

            if total_minutes:
                total_minutes_result = total_minutes / 60

            month_minutes = (db.session.query(func.sum(Lead.duration))
                             .filter(Lead.partnership_account_id == rest_partnership_account.id)
                             .filter(extract('year', Lead.created_on) == year)
                             .filter(extract('month', Lead.created_on) == month).scalar())

            if month_minutes:
                month_minutes_result = month_minutes / 60

            return jsonify(
                total_minutes=total_minutes_result,
                total_minutes_month=month_minutes_result
            )
        elif rest_is_partnership and rest_partnership:
            partnership_accounts = rest_partnership.get_partnership_accounts()
            pa_list = list()
            now = datetime.now()
            year = now.year
            month = now.month

            if partnership_accounts:
                for pa in partnership_accounts:
                    total_minutes_result = 0
                    month_minutes_result = 0
                    total_minutes = (db.session.query(func.sum(Lead.duration))
                                     .filter(Lead.partnership_account_id == pa.id)
                                     .scalar())

                    if total_minutes:
                        total_minutes_result = total_minutes / 60

                    month_minutes = (db.session.query(func.sum(Lead.duration))
                                     .filter(Lead.partnership_account_id == pa.id)
                                     .filter(extract('year', Lead.created_on) == year)
                                     .filter(extract('month', Lead.created_on) == month)
                                     .scalar())

                    if month_minutes:
                        month_minutes_result = month_minutes / 60

                    add_pa = {
                        'name': pa.name,
                        'total_minutes': total_minutes_result,
                        'total_minutes_month': month_minutes_result
                    }
                    pa_list.append(add_pa)

            return jsonify(
                accounts=pa_list
            )
        else:
            return api.abort(401)