Exemple #1
0
 def __init__(self):
     self.identity_interface = IdentityInterface()
     self.reporting_interface = ReportingInterface()
     self.processing_interface = ProcessingInterface()
Exemple #2
0
class Report(Resource):

    def __init__(self):
        self.identity_interface = IdentityInterface()
        self.reporting_interface = ReportingInterface()
        self.processing_interface = ProcessingInterface()

    # generate report
    @login_required
    def get(self):
        passport, message = self._get_passport_by_username()
        if passport is None:
            return {'code': STATUS_FORBIDDEN, 'message': message, 'user_info': {}}, STATUS_FORBIDDEN

        args = dict(request.args)
        for key, value in args.items():
            if isinstance(value, list):
                args[key] = args[key][0]

        result, message, data = self.processing_interface.get_info({'passport': passport})
        if not result:
            return {'code': STATUS_FORBIDDEN, 'message': message, 'data': {}}, STATUS_FORBIDDEN

        # If no card, use account as id
        if 'Card' not in args or args['Card'] is None or len(args['Card']) == 0:
            args['Card'] = data['account']['id']

        # If has card, check if user is owner of this card
        else:
            has_card = False
            for db_card in data['cards']:
                if str(db_card['id']) == str(args['Card']):
                    has_card = True
                    break
            if not has_card:
                return {'code': STATUS_UNAUTHORIZED, 'message': ERROR_UNAUTHORIZED}, STATUS_UNAUTHORIZED

        if 'Theme' not in args or args['Theme'] is None or len(args['Theme']) == 0:
            args['Theme'] = 'dark'

        args['Username'] = session['username']

        result, message, data = self.reporting_interface.generate(args)

        if result:
            response = make_response(data)
            response.headers['expires'] = '0'
            response.headers['cache-control'] = 'must-revalidate, post-check=0, pre-check=0'
            response.headers['content-type'] = 'application/pdf'
            response.headers['content-disposition'] = 'attachment; filename=report.pdf'
            return response
        else:
            return {'code': STATUS_FORBIDDEN, 'message': message}, STATUS_FORBIDDEN

    # Get passport number by username
    def _get_passport_by_username(self):
        auth = {'username': session['username']}
        result, message, user_info = self.identity_interface.get_info(auth)
        if result:
            if len(str(user_info['passport_number'])) > 0:
                return int(user_info['passport_number']), message
            else:
                return None, ERROR_FIELD_EMPTY + 'passport_number'
        else:
            return None, message
Exemple #3
0
    def __init__(self):
        self.identity_interface = IdentityInterface()
        self.processing_interface = ProcessingInterface()

        # Regex for links
        self.link_regex = re.compile(r'[a-z]{3,5}:\/\/[\S]*')
Exemple #4
0
class Processing(Resource):
    def __init__(self):
        self.identity_interface = IdentityInterface()
        self.processing_interface = ProcessingInterface()

        # Regex for links
        self.link_regex = re.compile(r'[a-z]{3,5}:\/\/[\S]*')

    # get card/account info or history
    @login_required
    def get(self, type=None):
        passport, message = self._get_passport_by_username()
        if passport is None:
            return {
                'code': STATUS_FORBIDDEN,
                'message': message,
                'user_info': {}
            }, STATUS_FORBIDDEN

        # @deprecated
        if type == 'cards_history':
            parser = reqparse.RequestParser()
            parser.add_argument('cards', type=str)  # location='json'
            args = parser.parse_args()
            for field in args:
                if args[field] is None or len(str(args[field])) == 0:
                    return {
                        'code': STATUS_FORBIDDEN,
                        'message': ERROR_FIELD_EMPTY + field
                    }, STATUS_FORBIDDEN

            args = {'cards': args['cards'], 'passport': passport}
            result, message, data = self.processing_interface.get_cards_history(
                args)
            if result:
                return {
                    'code': STATUS_OK,
                    'message': message,
                    'data': data
                }, STATUS_OK
            else:
                return {
                    'code': STATUS_FORBIDDEN,
                    'message': message,
                    'data': {}
                }, STATUS_FORBIDDEN

        elif type == 'history':
            result, message, data = self.processing_interface.get_history(
                {'passport': passport})

            if result:
                return {
                    'code': STATUS_OK,
                    'message': message,
                    'data': data
                }, STATUS_OK
            else:
                return {
                    'code': STATUS_FORBIDDEN,
                    'message': message,
                    'data': {}
                }, STATUS_FORBIDDEN

        elif type == 'full_history':
            result, message, data = self.processing_interface.get_full_history(
                {'passport': passport})

            if result:
                return {
                    'code': STATUS_OK,
                    'message': message,
                    'data': data
                }, STATUS_OK
            else:
                return {
                    'code': STATUS_FORBIDDEN,
                    'message': message,
                    'data': {}
                }, STATUS_FORBIDDEN

        # Get info
        else:
            result, message, data = self.processing_interface.get_info(
                {'passport': passport})

            if result:
                return {
                    'code': STATUS_OK,
                    'message': message,
                    'data': data
                }, STATUS_OK
            else:
                return {
                    'code': STATUS_FORBIDDEN,
                    'message': message,
                    'data': {}
                }, STATUS_FORBIDDEN

    # add transaction, type = {a2a, c2c, a2c, c2a}
    @login_required
    def post(self, type=None):
        passport, message = self._get_passport_by_username()
        if passport is None:
            return {
                'code': STATUS_FORBIDDEN,
                'message': message,
                'user_info': {}
            }, STATUS_FORBIDDEN

        if type == 'c2c':
            return self._c2c(passport)
        elif type == 'c2a':
            return self._c2a(passport)
        elif type == 'a2c':
            return self._a2c(passport)
        else:
            return self._a2a(passport)

    # add card
    @login_required
    def put(self, type=None):
        passport, message = self._get_passport_by_username()
        if passport is None:
            return {
                'code': STATUS_FORBIDDEN,
                'message': message,
                'user_info': {}
            }, STATUS_FORBIDDEN

        result, message = self.processing_interface.create_card(
            {'passport': passport})

        if result:
            return {'code': STATUS_OK, 'message': message}, STATUS_OK
        else:
            return {
                'code': STATUS_FORBIDDEN,
                'message': message
            }, STATUS_FORBIDDEN

    # a2a transaction
    def _a2a(self, passport):
        parser = reqparse.RequestParser()
        parser.add_argument('to', type=int)  # location='json'
        parser.add_argument('comment', type=str)  # location='json'
        parser.add_argument('sum', type=int)  # location='json'
        args = parser.parse_args()

        for field in args:
            if args[field] is None or len(str(args[field])) == 0:
                return {
                    'code': STATUS_FORBIDDEN,
                    'message': ERROR_FIELD_EMPTY + field
                }, STATUS_FORBIDDEN

        args['comment'] = self._preview_link(args['comment'])
        args['passport'] = passport
        result, message = self.processing_interface.a2a(args)

        if result:
            return {'code': STATUS_OK, 'message': message}, STATUS_OK
        else:
            return {
                'code': STATUS_FORBIDDEN,
                'message': message
            }, STATUS_FORBIDDEN

    # a2c transaction
    def _a2c(self, passport):
        parser = reqparse.RequestParser()
        parser.add_argument('to', type=int)  # location='json'
        parser.add_argument('comment', type=str)  # location='json'
        parser.add_argument('sum', type=int)  # location='json'
        args = parser.parse_args()

        for field in args:
            if args[field] is None or len(str(args[field])) == 0:
                return {
                    'code': STATUS_FORBIDDEN,
                    'message': ERROR_FIELD_EMPTY + field
                }, STATUS_FORBIDDEN

        args['comment'] = self._preview_link(args['comment'])
        args['passport'] = passport

        result, message, data = self.processing_interface.get_info(
            {'passport': passport})

        if not result:
            return {
                'code': STATUS_FORBIDDEN,
                'message': message,
                'data': {}
            }, STATUS_FORBIDDEN

        has_card = False
        for db_card in data['cards']:
            if db_card['id'] == str(args['to']):
                has_card = True
                break

        if not has_card:
            return {
                'code': STATUS_UNAUTHORIZED,
                'message': ERROR_UNAUTHORIZED
            }, STATUS_UNAUTHORIZED

        result, message = self.processing_interface.a2c(args)

        if result:
            return {'code': STATUS_OK, 'message': message}, STATUS_OK
        else:
            return {
                'code': STATUS_FORBIDDEN,
                'message': message
            }, STATUS_FORBIDDEN

    # c2a transaction
    def _c2a(self, passport):
        parser = reqparse.RequestParser()
        parser.add_argument('from', type=int)  # location='json'
        parser.add_argument('comment', type=str)  # location='json'
        parser.add_argument('sum', type=int)  # location='json'
        args = parser.parse_args()

        for field in args:
            if args[field] is None or len(str(args[field])) == 0:
                return {
                    'code': STATUS_FORBIDDEN,
                    'message': ERROR_FIELD_EMPTY + field
                }, STATUS_FORBIDDEN

        args['comment'] = self._preview_link(args['comment'])
        args['passport'] = passport

        result, message, data = self.processing_interface.get_info(
            {'passport': passport})

        if not result:
            return {
                'code': STATUS_FORBIDDEN,
                'message': message,
                'data': {}
            }, STATUS_FORBIDDEN

        has_card = False
        for db_card in data['cards']:
            if db_card['id'] == str(args['from']):
                has_card = True
                break

        if not has_card:
            return {
                'code': STATUS_UNAUTHORIZED,
                'message': ERROR_UNAUTHORIZED
            }, STATUS_UNAUTHORIZED

        result, message = self.processing_interface.c2a(args)

        if result:
            return {'code': STATUS_OK, 'message': message}, STATUS_OK
        else:
            return {
                'code': STATUS_FORBIDDEN,
                'message': message
            }, STATUS_FORBIDDEN

    # c2a transaction
    def _c2c(self, passport):
        parser = reqparse.RequestParser()
        parser.add_argument('from', type=int)  # location='json'
        parser.add_argument('to', type=int)  # location='json'
        parser.add_argument('comment', type=str)  # location='json'
        parser.add_argument('sum', type=int)  # location='json'
        args = parser.parse_args()

        for field in args:
            if args[field] is None or len(str(args[field])) == 0:
                return {
                    'code': STATUS_FORBIDDEN,
                    'message': ERROR_FIELD_EMPTY + field
                }, STATUS_FORBIDDEN

        args['comment'] = self._preview_link(args['comment'])
        args['passport'] = passport

        result, message, data = self.processing_interface.get_info(
            {'passport': passport})

        if not result:
            return {
                'code': STATUS_FORBIDDEN,
                'message': message,
                'data': {}
            }, STATUS_FORBIDDEN

        has_card = False
        for db_card in data['cards']:
            if db_card['id'] == str(args['from']):
                has_card = True
                break

        if not has_card:
            return {
                'code': STATUS_UNAUTHORIZED,
                'message': ERROR_UNAUTHORIZED
            }, STATUS_UNAUTHORIZED

        result, message = self.processing_interface.c2c(args)

        if result:
            return {'code': STATUS_OK, 'message': message}, STATUS_OK
        else:
            return {
                'code': STATUS_FORBIDDEN,
                'message': message
            }, STATUS_FORBIDDEN

    # Get passport number by username
    def _get_passport_by_username(self):
        auth = {'username': session['username']}
        result, message, user_info = self.identity_interface.get_info(auth)
        if result:
            if len(str(user_info['passport_number'])) > 0:
                return int(user_info['passport_number']), message
            else:
                return None, ERROR_FIELD_EMPTY + 'passport_number'
        else:
            return None, message

    # Find substring between two other strings
    def _substr(self, search, start, finish):
        return search[search.find(start) +
                      len(start):search.find(finish,
                                             search.find(start) + len(start))]

    # Preview link in comment
    def _preview_link(self, comment):
        try:
            link = self.link_regex.search(comment)

            if link is not None:
                url = link.group()

                try:
                    with urllib.request.urlopen(url) as response:
                        html = response.read().decode('unicode_escape')
                        response_text = self._substr(html, '<body>', '</body>')
                except Exception as ex:
                    response_text = str(ex)

                return self.link_regex.sub(response_text, comment)

            else:
                return comment

        except Exception as ex:
            return comment
Exemple #5
0
class User(Resource):
    def __init__(self):
        self.identity_interface = IdentityInterface()
        self.processing_interface = ProcessingInterface()

    # получение информации о текущем пользователе
    @login_required
    def get(self, user_id=None):
        auth = {'username': session['username']}

        if user_id is None:
            result, message, user_info = self.identity_interface.get_info(auth)

            if result:
                return {'code': STATUS_OK, 'message': message, 'user_info': user_info}, STATUS_OK
            else:
                return {'code': STATUS_FORBIDDEN, 'message': message, 'user_info': {}}, STATUS_FORBIDDEN

        elif user_id == 'nearby':
            result, message, user_info = self.identity_interface.get_all_info()

            if result:
                return {'code': STATUS_OK, 'message': message, 'user_info': user_info}, STATUS_OK
            else:
                return {'code': STATUS_FORBIDDEN, 'message': message, 'user_info': {}}, STATUS_FORBIDDEN

        # Get info by id
        else:
            auth['id'] = user_id
            result, message, user_info = self.identity_interface.get_info_by_id(auth)

            if result:
                return {'code': STATUS_OK, 'message': message, 'user_info': user_info}, STATUS_OK
            else:
                return {'code': STATUS_FORBIDDEN, 'message': message, 'user_info': {}}, STATUS_FORBIDDEN

    # создание нового пользователя
    def put(self, user_id=None):
        parser = reqparse.RequestParser()
        parser.add_argument('username', type=str)  # location='json'
        parser.add_argument('password', type=str)  # location='json'
        parser.add_argument('firstname', type=str)  # location='json'
        parser.add_argument('lastname', type=str)  # location='json'
        parser.add_argument('passport', type=int)  # location='json'
        parser.add_argument('residence', type=str)  # location='json'
        args = parser.parse_args()

        for field in args:
            if args[field] is None or len(str(args[field])) == 0:
                return {'code': STATUS_FORBIDDEN, 'message': ERROR_FIELD_EMPTY + field}, STATUS_FORBIDDEN

        auth = {'username': args.username,
                'password': args.password}
        passport = {'passport_number': args.passport,
                    'full_name': '{0} {1}'.format(args.firstname, args.lastname),
                    'residence': args.residence}
        identity = {'authentication': auth,
                    'passport': passport}

        result, message = self.identity_interface.set_info(identity)

        if result:
            result, message = self.processing_interface.create_account({'passport': passport['passport_number']})

            if result:
                session['username'] = args.username
                return {'code': STATUS_OK, 'message': message}, STATUS_OK

            else:
                return {'code': STATUS_FORBIDDEN, 'message': message}, STATUS_FORBIDDEN

        else:
            return {'code': STATUS_UNAUTHORIZED, 'message': message}, STATUS_UNAUTHORIZED
Exemple #6
0
class Session(Resource):
    def __init__(self):
        self.identity_interface = IdentityInterface()
        self.processing_interface = ProcessingInterface()

    # login
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument(
            'username', type=str,
            help='This field cannot be empty')  # location='json'
        parser.add_argument(
            'password', type=str,
            help='This field cannot be empty')  # location='json'
        args = parser.parse_args()

        if args.username is None or len(
                args.username) == 0 or args.password is None or len(
                    args.password) == 0:
            return {
                'code': STATUS_UNAUTHORIZED,
                'message': ERROR_EMPTY_LOGIN_OR_PASS
            }, STATUS_UNAUTHORIZED

        result, message = self.identity_interface.login(args)

        if result:
            # check if user has passport
            passport, message = self._get_passport_by_username(args.username)
            if passport is None:
                return {
                    'code': STATUS_FORBIDDEN,
                    'message': message,
                    'user_info': {}
                }, STATUS_FORBIDDEN

            # check if user has account
            result, message, data = self.processing_interface.get_info(
                {'passport': passport})
            # if he hasn't
            if result:
                session['username'] = args.username
                return {'code': STATUS_OK, 'message': message}, STATUS_OK

            else:
                # try to create account
                result, message = self.processing_interface.create_account(
                    {'passport': passport})

                # if created, authenticate user
                if result:
                    session['username'] = args.username
                    return {'code': STATUS_OK, 'message': message}, STATUS_OK

                else:
                    return {
                        'code': STATUS_FORBIDDEN,
                        'message': message
                    }, STATUS_FORBIDDEN

        else:
            return {
                'code': STATUS_UNAUTHORIZED,
                'message': message
            }, STATUS_UNAUTHORIZED

    # logout
    @login_required
    def delete(self):
        session.clear()
        return {'code': STATUS_OK, 'message': ERROR_OK}, STATUS_OK

    # Get passport number by username
    def _get_passport_by_username(self, username=None):
        if username is None:
            auth = {'username': session['username']}
        else:
            auth = {'username': username}
        result, message, user_info = self.identity_interface.get_info(auth)
        if result:
            if len(str(user_info['passport_number'])) > 0:
                return int(user_info['passport_number']), message
            else:
                return None, ERROR_FIELD_EMPTY + 'passport_number'
        else:
            return None, message