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])
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))
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()
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()