Exemplo n.º 1
0
 def __init__(self, *args, **kwargs):
     """
     The new constructor.
     """
     inspector = inspect(self.__class__)
     keys = (
         [(False, o.key) for o in inspector.relationships] +
         [(True, o.name) for o in inspector.columns])
     for is_column, attr in keys:
         if is_column:
             # column processing
             col = inspector.columns[attr]
             (set_val, val) = (False, None)
             if attr in kwargs:
                 (set_val, val) = (True, kwargs[attr])
             if set_val and val is not None:
                 if (isinstance(col.type, Geometry) and
                         not isinstance(val, WKTSpatialElement)):
                     val = WKTSpatialElement('POINT(%s)' % ' '.join(val))
                 if isinstance(col.type, StateType):
                     make_transition(self, attr, val)
                 else:
                     setattr(self, attr, val)
         else:
             # relationship
             if attr in kwargs:
                 setattr(self, attr, kwargs[attr])
Exemplo n.º 2
0
    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))
Exemplo n.º 3
0
    def send_to(self, *user_list):
        """
        Sends this message to a specified list of users, also creating
        the associated notification objects accordingly.

        :params user_list: a list of users.
        :type user_list: list
        """
        notification_class = self.__notification_class__
        self.recipient_list_ids = [o.id for o in user_list]
        self.save(commit=True)
        for user in user_list:
            notification = notification_class(
                user_id=user.id,
                message=self)
            notification.save()

        if self.reply_to_id:
            # message sent as a "reply" to a previous one
            reply_notification = notification_class.query.filter_by(
                message_id=self.reply_to_id,
                user_id=self.sender_id).first()
            if not reply_notification:
                raise ValueError('Unexpected error')

            make_transition(reply_notification, 'status', 'replied')
            reply_notification.save()
        self.commit()
Exemplo n.º 4
0
    def change_status(self, new_status):
        """
        Changes the notification status to a new value.

        :param new_status: the expected new status.
        :type new_status: str

        :raises: `ValueError` in case of invalid transition.
        """
        if (self.__state_transitions__ and new_status not in
                self.__state_transitions__[self.current_status]):
            raise ValueError('Invalid state transition.')
        make_transition(self, 'status', new_status)
        self.save()