Exemplo n.º 1
0
    def create(self, params, meta, **kwargs):
        validated = kwargs.get('validated')
        user = kwargs.get('context').get('user')  # user dict
        user_id = user.get('user')
        project_id = user.get('project')
        service = user.get('service')

        channel_id = generate_uuid()

        self._check_create_params(validated)
        body = {
            "project_id": project_id,
            "created_by": user_id,
            "validated_channel": self._check_create_params(validated),
            "service": service,
            "channel_id": channel_id,
        }
        rpc_params = self.rpc_client.rpc_call("create_channel",
                                              body,
                                              blocking=False)
        return {
            "id": channel_id,
            "name": body['validated_channel']['name'],
            "description": body['validated_channel']['description'],
            "type": body['validated_channel']['type'],
            "banned_subscribers": [],
            "invitees": [],
            "joinRequests": [],
            "owner": [user_id],
            "managers": [user_id],
            "subscribers": [user_id],
            "tracking_id": rpc_params['tracking_id'],
        }
Exemplo n.º 2
0
    def create_push_segment(self, project_id=None, **kwargs):
        """
        Creates a push segment with given args.
    
        Args:
            **kwargs (dict): project_id, name, residents
                - project_id: project_id
                - name (str): name of segment
                - residents (dict): object of expressions which represent the audience set of
                segment
        Returns:
    
        """
        project_id = project_id or kwargs['project_id']
        bucket = self.get_bucket(project_id, 'segment')
        segment = bucket.get(kwargs['segment_id'])

        if segment.exists:
            # todo: let client know the new segment id
            kwargs['segment_id'] = generate_uuid()
            segment = bucket.get(kwargs['segment_id'])

        segment.data = {'name': kwargs['name'], 'residents': kwargs['residents'], 'id': kwargs['segment_id']}
        segment.add_index('segment_bin', project_id)

        for val in kwargs['residents']['sets'].values():
            segment.add_index('tag_seg_bin', val['key'])

        segment.data.update(self.get_creation_info())
        segment.store()
        zlogger.info("New segment is created. Project id:{}, segment id:{}".format(
            project_id, segment.key))
Exemplo n.º 3
0
    def create(self, params, meta, **kwargs):
        user = kwargs.get('context').get('user')  # user dict
        project_id = user.get('project_id')
        admin_id = user.get('admin_id')
        account_id = user.get('account_id')
        validated = kwargs.get("validated")

        channel_id = generate_uuid()
        self._check_create_params(validated)
        body = {
            "project_id": project_id,
            "account_id": account_id,
            "admin_id": admin_id,
            "service": "roc",
            "channel_id": channel_id,
            "channel_parameters": validated
        }

        rpc_params = self.rpc_client.rpc_call("create_channel_as_admin",
                                              body,
                                              blocking=False)
        return {
            "id": channel_id,
            "name": body['channel_parameters']['name'],
            "description": body['channel_parameters']['description'],
            "type": body['channel_parameters']['type'],
            "tracking_id": rpc_params['tracking_id'],
        }
Exemplo n.º 4
0
    def create(self, params, meta, **kwargs):
        user = kwargs.get('context').get('user')  # user dict
        user_id = user.get('user')
        project_id = user.get('project')
        service = user.get('service')
        validated = kwargs.get('validated')
        client_id = generate_uuid()
        body = {
            "target_id": user_id,
            "validated_client": validated,
            "project_id": project_id,
            "service": service,
            "client_id": client_id
        }
        rpc_params = self.rpc_client.rpc_call("create_client",
                                              body,
                                              blocking=False)

        return {
            "id": client_id,
            "tracking_id": rpc_params['tracking_id'],
            "app_version": rpc_params['validated_client']['app_version'],
            "device_type": rpc_params['validated_client']['device_type'],
            "language": rpc_params['validated_client']['language'],
            "country": rpc_params['validated_client']['country'],
            "os_version": rpc_params['validated_client']['os_version'],
        }
Exemplo n.º 5
0
    def create(self, params, meta, **kwargs):
        validated = kwargs.get('validated')
        user = kwargs.get('context').get('user')  # user dict
        user_id = user.get('user')
        project_id = user.get('project')
        service = user.get('service')
        subscriber = SubscriberCache(user.get('project'), user.get('service'), user.get('user'),
                                     rpc_client=self.rpc_client).get_or_set()
        contacts_of_user = subscriber['contacts']
        channels_of_user = subscriber['channels']
        channel = validated['channel']

        validated_message = self._check_create_params(user_id, channels_of_user, contacts_of_user,
                                                      validated, project_id, service)
        validated_message['id'] = generate_uuid()

        body = {
            "project_id": project_id,
            "service": service,
            # validated message becomes a dict with keys
            # [id, title, body, sentTime, receiver, channel, sender]
            "validated_message": validated_message,
        }

        rpc_params = self.rpc_client.rpc_call("post_message", body, blocking=False)
        return {
            "id": rpc_params['validated_message']['id'],
            "title": rpc_params['validated_message']['title'],
            "body": rpc_params['validated_message']['body'],
            "sender": rpc_params['validated_message']['sender'],
            "receiver": validated['receiver'],
            "sentTime": rpc_params['validated_message']['sentTime'],
            "channel": channel,
            "tracking_id": rpc_params['tracking_id'],
        }
Exemplo n.º 6
0
def init_zops_models(target_model):
    """
    Initialize given target_model class. Assign a uuid to _id attr.
    Args:
        target_model: Model class
    """
    target_model._id = generate_uuid()
    target_model.creation_time = datetime.utcnow()
Exemplo n.º 7
0
    def create(self, params, meta, **kwargs):
        validated = kwargs.get('validated')
        user = kwargs.get('context').get('user')  # user dict
        project_id = user.get('project')
        service = user.get('service')
        segment_id = generate_uuid()
        body = dict(project_id=project_id,
                    **validated,
                    service=service,
                    segment_id=segment_id)

        rpc_params = self.rpc_client.rpc_call("create_push_segment",
                                              body,
                                              blocking=False)
        rpc_params['id'] = segment_id
        return rpc_params
Exemplo n.º 8
0
    def create_client(self, **kwargs):
        """
        Creates a new client with given target_id and validated_client.
    
        Args:
            **kwargs: project_id, target_id, validated_client
                - project_id: project_id
                - target_id: id of target who owns client
                - validated_client: dict of client information including clientId, token,
                appVersion, deviceType, language, country, osVersion.
    
        Returns:
        """
        # TODO: device_type's validity should be controlled before this method.
        client_bucket = self.get_bucket(kwargs['project_id'], 'client')
        target_bucket = self.get_bucket(kwargs['project_id'], 'target')

        kwargs['validated_client']['target_id'] = kwargs['target_id']
        kwargs['validated_client']['id'] = kwargs['client_id']
        kwargs['validated_client'].update(self.get_creation_info())
        client = client_bucket.get(kwargs['client_id'])

        if client.exists:
            # todo: let client know the new client id
            kwargs['validated_client']['id'] = generate_uuid()
            client = client_bucket.get(kwargs['validated_client']['id'])

        client.data = kwargs['validated_client']
        target = target_bucket.get(kwargs['target_id'])

        client.store()
        zlogger.info("Client is created. Project id:{}, target id:{}, client id:{}".format(
            kwargs['project_id'], kwargs['target_id'], client.key))

        if target.exists:
            target.data['clients'][client.key] = ""
            zlogger.info("Client: {} is added into Target Object . Project id:{}, target id:{}".format(
                client.key, kwargs['project_id'],  target.key))
        else:
            target.data = {'clients': {client.key: ""}}
            zlogger.info("Target is created and Client: {} is added. Project id:{}, target id:{}".format(
                client.key, kwargs['project_id'],  target.key))

        target.data['last_update_time'] = datetime.now().strftime(DATETIME_FORMAT)
        target.store()
Exemplo n.º 9
0
    def create(self, params, meta, **kwargs):
        validated = kwargs.get('validated')
        user = kwargs.get('context').get('user')  # user dict
        user_id = user.get('user')
        project_id = user.get('project')
        service = user.get('service')

        channel_id = validated.get('channel')
        invitee = validated.get('invitee')
        actor = self.check_create_request(user, channel_id, invitee)
        invite_id = generate_uuid()

        body = {
            "project_id": project_id,
            "inviter": user_id,
            "channel": channel_id,
            "invite_message": validated.get('invite_message'),
            "service": service,
            "invite_id": invite_id
        }

        rpc_params = {}
        if actor == "channel-manager":
            body['invitee'] = invitee
            rpc_params = self.rpc_client.rpc_call("create_invite_by_channel",
                                                  body,
                                                  blocking=False)
        elif actor == "subscriber":
            rpc_params = self.rpc_client.rpc_call(
                "create_invite_by_subscriber", body, blocking=False)
        return {
            "id": rpc_params.get('invite_id'),
            "inviter": rpc_params.get('inviter'),
            "invitee": invitee,
            "channel": channel_id,
            "invite_message": rpc_params.get('invite_message'),
            "approve": "not_evaluated",
            "tracking_id": rpc_params.get('tracking_id'),
        }
Exemplo n.º 10
0
    def create(self, params, meta, **kwargs):
        validated = kwargs.get('validated')
        user = kwargs.get('context').get('user')  # user dict
        user_id = user.get('user')
        project_id = user.get('project')
        service = user.get('service')
        message_id = generate_uuid()
        if not validated['audience'] and not validated['consumers']:
            raise HTTPBadRequest(description="Audience or consumers field must be filled")
        elif validated['audience'] and validated['consumers']:
            raise HTTPBadRequest(description="Audience and consumers field can not be filled at the same time")

        body = dict(
            target_id=user_id,
            validated_message=validated,
            project_id=project_id,
            service=service,
            message_id=message_id
        )

        rpc_params = self.rpc_client.rpc_call("post_push_message", body, blocking=False)
        return {
            "id": message_id,
            "target_id": rpc_params['target_id'],
            "tracking_id": rpc_params['tracking_id'],
            "title": rpc_params['validated_message']['title'],
            "body": rpc_params['validated_message']['body'],
            "type": rpc_params['validated_message']['type'],
            "language": rpc_params['validated_message']['language'],
            "icon": rpc_params['validated_message']['icon'],
            "image": rpc_params['validated_message']['image'],
            "badge": rpc_params['validated_message']['badge'],
            "audience": rpc_params['validated_message']['audience'],
            "schedule_time": rpc_params['validated_message']['schedule_time'],
            "extra": rpc_params['validated_message']['extra'],
            "consumers": rpc_params['validated_message']['consumers']
        }
Exemplo n.º 11
0
    def post_push_message(self, **kwargs):
        """
        Creates a push message with given segment id.
    
        Segment id check must be performed. If it is OK, then segment's resident set must be
        retrieved and push operation performed according to the message's type.
    
        `audience` is a segment id, it is retrieved from db. its `residents` field in following
        form:
            residents = {
                "sets": {
                    "a": {"key": "color", "relation": "=", "value": "blue", "intention": "target"},
                    "b": {"key": "age", "relation": "<", "value": "55", "intention": "target"},
                    "c": {"key": "birth_year", "relation": "()", "value": "["1980","2010"]", 
                    "intention": "target"},
                    "d": {"key": "device", "relation": "=", "value": "apple", "intention": "client"},
                },
                "expression": "(a U b) - (c n d)"
            }
    
        Sets must be obtained from riak concurrently. For each set in the given residents object,
        there must be a worker that parses the given set definition, gets keys from riak by using
        2i, put it to the redis and map its set_key to the redis key.
        Examples:
             set: "a": {"key": "level", "relation": "=", "value": "10"}
             2i query: level_int, 10
             redis_key: Project:Example123:a
             redis_key_map: {"a": "Project:Example123:a"}
    
        Main worker sends redis keys of sets to sub-workers, so that they can put them to redis with
        expected keys.
    
        Main worker subscribes a redis pub/sub channel after sending jobs to the sub-workers. Each
        worker that finishes its job publishes a message to redis channel. Main worker counts the
        messages that are published to the channel and when it reach to the number of sets, starts
        the evaluation of the expression.
    
        For the evaluation of the expression a SEXPParser instance must be obtained.
            sexp = SEXPParser(residents["sets"], residents["expression"], redis_key_map, redis_instance)
            `sexp.expression_stack` gives the parsed expression stack
            evaluated_set_redis_key = sexp.evaluate_stack()  # this is the final redis key
            then, evaluate_stack method must be called to evaluate the stack.
        Args:
            **kwargs: project_id, target_id, validated_message
                - project_id
                - validated_message: dict of validated message including title, body, type,
                language, icon, image, badge, audience.
                - target_id: sender of the message
    
        Returns:
    
        """
        if kwargs['validated_message']['audience']:
            kwargs['validated_message']["consumers"] = []
            segment_id = kwargs['validated_message']['audience']
            segment = self.get_obj(kwargs['project_id'], 'segment', segment_id)
            residents = segment.data['residents']

            intentions = [val['intention'] for val in residents['sets'].values()]

            case = 'single' if len(set(intentions)) == 1 else 'mix'
            single_case_type = set(intentions).pop() if case == 'single' else None

            client_ids = self.calculate_sets(residents, case, single_case_type, kwargs['project_id'])
        else:
            consumers = kwargs['validated_message']['consumers']
            client_ids = self.get_targets_client_ids(kwargs['project_id'], consumers)

        bucket = self.get_bucket(kwargs['project_id'], 'push_message')
        message = bucket.get(kwargs['message_id'])

        if message.exists:
            kwargs['validated_message']['id'] = generate_uuid()
            message = bucket.get(kwargs['validated_message']['id'])

        kwargs['validated_message']['target_id'] = kwargs['target_id']
        message.data = kwargs['validated_message']

        formatted_time = format(time.time(), '.7f')
        timestamp = int(self.last) - int("".join(str(formatted_time).split('.')))
        message.add_index('push_message_bin', "{}_{}".format(kwargs['target_id'], timestamp))
        message.data.update(self.get_creation_info())
        message.store()

        self.send_push_message(kwargs['project_id'], kwargs['service'], client_ids, kwargs['validated_message'], message.key)