コード例 #1
0
ファイル: __init__.py プロジェクト: angelo-romano/mycouch
    def patch(self, conntype, id):
        if conntype not in CONNECTION_TYPE_MAPPING:
            return ('TYPE', 400, [])
        conn_dict = CONNECTION_TYPE_MAPPING[conntype]
        conn_class = conn_dict['class']

        conn = self._get_instance(conntype, id)
        if not isinstance(conn, conn_class):
            # error
            return conn

        logged_user = get_logged_user()

        if conntype == 'friendships':
            type_status = request.json.get('type_status')
            if type_status:
                # pending status can be changed only by the other counterpart
                # (to be improved yet)
                if (conn.type_status['current'] == 'pending' and
                        conn.user_from_id == logged_user.id):
                    return ('UNAUTHORIZED', 405, [])
                try:
                    make_transition(conn, 'type_status', type_status)
                except StateValueError:
                    return (jsonify(build_error_dict([
                        'Invalid "type_status" value.'])), 400, [])
                except StateTransitionError:
                    return (jsonify(build_error_dict([
                        'Invalid "type_status" transition.'])), 400, [])

        return jsonify(conn.serializer_func(logged_user))
コード例 #2
0
ファイル: __init__.py プロジェクト: angelo-romano/mycouch
    def _validate_params(cls, conntype, user):
        """
        """
        mandatory_params = (
            CONNECTION_TYPE_MAPPING[conntype]['mandatory_params'])

        # checking for mandatory parameters
        missing_mandatory_params = (
            [k for k in mandatory_params
             if request.json.get(k) in (None, '')])
        if missing_mandatory_params:
            return (False, build_error_dict([
                'Field "%s" not specified.' % field
                for field in missing_mandatory_params]))

        # validate user id value
        if not (User.query.filter(and_(
                User.is_active,
                User.id != user.id,
                User.id == request.json.get('user_id'))).first()):
            return (False, build_error_dict([
                'Invalid "user_id" value.']))

        # preparing param dict
        params = dict(
            description=request.json.get('description'),
            text=request.json.get('text'),
            user_from_id=user.id,
            user_to_id=request.json.get('user_id'))

        return (True, params)
コード例 #3
0
ファイル: __init__.py プロジェクト: angelo-romano/mycouch
    def validate_reference(cls, user):
        """
        Expected form:

            {"description": str, "other_user_id": int,
             "friendship_level"}
        """
        success, params = cls._validate_params('references', user)

        if not success:
            return (success, params)

        # validate friendship level value
        if not Reference.validate_reference_type(
                request.json.get('reference_type')):
            return (False, build_error_dict(
                ['Invalid "reference_type" value.']))

        # preparing param dict
        params.update(dict(
            description='reference',
            type_status=request.json.get('reference_type'),
            flags=filter(None,
                         [request.json.get('reference_type')])))

        return (True, params)
コード例 #4
0
ファイル: __init__.py プロジェクト: angelo-romano/mycouch
    def validate_friendship(cls, user):
        """
        Expected form:

            {"description": str, "other_user_id": int,
             "friendship_level"}
        """
        success, params = cls._validate_params('friendships', user)

        if not success:
            return (success, params)

        # validate friendship level value
        if not FriendshipConnection.validate_friendship_level(
                request.json.get('friendship_level')):
            return (False, build_error_dict(
                ['Invalid "friendship_level" value.']))

        # preparing param dict
        params.update(dict(
            text=request.json.get('description'),
            type_status='pending',
            flags=filter(None,
                         [request.json.get('friendship_level', 'friend')])))

        return (True, params)
コード例 #5
0
ファイル: __init__.py プロジェクト: angelo-romano/mycouch
    def validate(cls, user):
        param_errors = []
        params = dict(
            title=request.json.get("title"),
            description=request.json.get("description"),
            scheduled_from=datetime_from_json(request.json.get("scheduled_from")),
            creator_id=user.id,
            location=request.json.get("location"),
            city_id=request.json.get("city_id"),
        )

        missing_params = [k for k, v in params.iteritems() if v in ["", None]]

        param_errors = ['Field "%s" not specified.' % k for k in missing_params]

        optional_params = dict(scheduled_until=datetime_from_json(request.json.get("scheduled_until")))

        params.update(optional_params)

        # city must exist
        if params.get("city_id") and not City.query.filter_by(id=params["city_id"]).first():
            param_errors.append('Invalid "city_id" value.')

        # can't create activities less than one hour in advance
        datetime_max = datetime.now() + timedelta(hours=1)
        if params.get("scheduled_from") and params["scheduled_from"] < datetime_max:
            param_errors.append('Invalid "scheduled_from" value.')
        if params.get("scheduled_until") and params["scheduled_until"] < datetime_max:
            param_errors.append('Invalid "scheduled_until" value.')

        if param_errors:  # in case of errors
            return (False, build_error_dict(param_errors))

        return (True, params)
コード例 #6
0
ファイル: __init__.py プロジェクト: angelo-romano/mycouch
    def post(self):
        """
        Creates a new account.
        """
        # TODO: improved password handling?
        params = dict(
            first_name=request.json.get('first_name'),
            last_name=request.json.get('last_name'),
            birth_date=request.json.get('birth_date'),
            email=request.json.get('email'),
            gender=request.json.get('gender'),
            username=request.json.get('username'),
            password=request.json.get('password'))

        optional_params = dict(
            city_id=request.json.get('city_id'))

        missing_fields = [k for (k, v) in params.iteritems() if not v]
        if missing_fields:
            return (jsonify(build_error_dict([
                'No value specified for "%s".' % field
                for field in missing_fields])), 400, [])

        params.update(optional_params)
        user = User(**params)
        user.save(commit=True)
        return UserByIDHandler._get(user)
コード例 #7
0
ファイル: __init__.py プロジェクト: angelo-romano/mycouch
    def patch(self, direction, msgtype, id):
        user = get_logged_user()
        request_json = json_loads(request.data)

        if msgtype not in MESSAGE_TYPE_MAPPING:
            return ('TYPE', 400, [])
        msg_dict = MESSAGE_TYPE_MAPPING[msgtype]
        msg_notification_class = msg_dict['notification_class']

        if direction == 'out':  # PATCH op is allowed only for incoming msgs
            return ('FORBIDDEN', 403, [])
        elif direction != 'in':  # Invalid direction value
            return ('DIRECTION', 400, [])

        msg_list = filter_by_direction(
            msgtype, 'in', user, additional_filters={'id': id})
        if not msg_list:
            return ('NOT FOUND', 404, [])

        msg = msg_list[0]

        added_flags, removed_flags = (
            request_json.get('flags_in'),
            request_json.get('flags_out'))

        msg.change_flags(added_flags, removed_flags)

        msg_notification = msg.get_notification(user)
        errors = []

        try:
            msg_notification.change_status(request_json.get('message_status'))
        except ValueError:  # Invalid transition
            errors.append('Invalid "message_status" value.')

        if msgtype == 'hospitality_request':
            request_status = request_json.get('request_status')
            if (request_status and
                ((direction == 'out' and request_status == 'canceled')
                 or direction == 'in' and msg.status != 'canceled')):
                try:
                    msg.change_status(request_status)
                except ValueError:  # Invalid transition
                    errors.append('Invalid "request_status" value.')

        if errors:  # Errors found, returns error structure
            return (jsonify(build_error_dict(errors)), 400, [])

        # in case of success, returns the updated message serialization
        msg.save()
        msg_notification.save(commit=True)
        return jsonify(msg.serialized_func(user))
コード例 #8
0
ファイル: __init__.py プロジェクト: angelo-romano/mycouch
    def _validate_message(cls, user, param_extend={}):
        """
        Expected form:

            {"subject": str, "text": str, "recipient_list_ids": [int*]}
        """
        request_json = json_loads(request.data)

        # recipient list validation
        recipient_list_objects = User.query.filter(and_(
            User.id.in_(request_json.get('recipient_list_ids')),
            User.id != user.id,
            User.is_active)).all()
        recipient_list_ids = [o.id for o in recipient_list_objects]
        # param dict built here
        params = dict(
            # mandatory params here
            subject=request_json.get('subject'),
            sender_id=user.id,
            text=request_json.get('text'),
            recipient_list_ids=recipient_list_ids,
            # optional values here
            message_status=request_json.get('message_status'),
            reply_to_id=request_json.get('reply_to_id'))
        params.update(param_extend)

        # checking for mandatory parameters
        resp = cls.validate_values(params)
        errors = (
            resp['errors.mandatory'] + resp['errors.type'] +
            resp['errors.other'])
        if errors:
            return (False, build_error_dict(errors))

        # preparing the full param dict to be returned
        for (k, v) in params.items():
            if v in (None, '', u''):
                del params[k]

        # success!
        return (True, params)
コード例 #9
0
ファイル: __init__.py プロジェクト: angelo-romano/mycouch
    def post(self, loctype):
        if loctype not in LOCATION_TYPE_MAPPING:
            return ('TYPE', '400', [])
        location_class = LOCATION_TYPE_MAPPING[loctype]

        params = dict(
            name=request.json.get('name'),
            country_id=request.json.get('country_id'),
            latitude=request.json.get('latitude'),
            longitude=request.json.get('longitude'))

        optional_params = dict(
            rating=request.json.get('rating'),
            timezone=request.json.get('timezone'),
            slug=request.json.get('slug'),
            wikiname=request.json.get('wikiname'))

        missing_vals = [(k, v) for (k, v) in params.iteritems()
                        if v in (None, '')]
        if missing_vals:
            error_dict = build_error_dict([
                '"%s" not specified' % k for (k, _) in missing_vals])
            return (jsonify(error_dict), 400, [])

        params.update(optional_params)

        params['coordinates'] = WKTSpatialElement(
            'POINT(%s %s)' % (
                params.get('latitude'),
                params.get('longitude')))
        del params['latitude']
        del params['longitude']

        location = location_class(**params)
        location.save(commit=True)
        return LocationByIDHandler._get(loctype, location)