def registrations(request):
    context = {}
    hubApi = HubApiClient(
        api_url=request.session["user_tokens"]["HUB"]["url"],  # noqa
        auth_token=request.session["user_tokens"]["HUB"]["token"]  # noqa
    )
    if 'mother_id' in request.GET:
        form = RegistrationFilterForm(request.GET)
        if form.is_valid():
            reg_filter = {
                settings.STAGE_FIELD: form.cleaned_data['stage'],
                "validated": form.cleaned_data['validated'],
                settings.IDENTITY_FIELD: form.cleaned_data['mother_id']
            }
            registrations = hubApi.get_registrations(
                params=reg_filter)['results']
        else:
            registrations = []
    else:
        form = RegistrationFilterForm()
        registrations = hubApi.get_registrations()['results']

    context['form'] = form
    context['registrations'] = utils.get_page_of_iterator(
        registrations, settings.REGISTRATION_LIST_PAGE_SIZE,
        request.GET.get('page'))

    return render(request, 'ci/registrations.html', context)
    def handle(self, *args, **options):
        hub_url = options['hub_url']
        hub_token = options['hub_token']
        id_url = options['identity_url']
        id_token = options['identity_token']
        hub_id_field = options['hub_identity_field']

        if not hub_url or not hub_token:
            self.warning("hub-url and hub-token is required.")
            return

        hubApi = HubApiClient(hub_token, hub_url)
        idApi = IdentityStoreApiClient(id_token, id_url)

        subscriptions = Subscription.objects.filter(process_status=5)

        reg_count = 0
        id_count = 0
        for subscription in subscriptions.iterator():
            identity = subscription.identity

            # find and update linked registrations
            registrations = hubApi.get_registrations({hub_id_field: identity})

            for registration in registrations['results']:

                if not registration['data'].get('exclude_report', False):
                    registration['data']['exclude_report'] = True

                    try:
                        hubApi.update_registration(
                            registration['id'], {'data': registration['data']})
                        reg_count += 1
                    except exceptions.ConnectionError as exc:
                        self.warning(
                            'Connection error to Hub API: {}'.format(exc))
                    except HTTPServiceError as exc:
                        self.warning('Invalid Hub API response({}): {}'.format(
                            exc.response.status_code, exc.response.url))

            # find and update linked identities
            identity = idApi.get_identity(identity)

            if not identity['details'].get('exclude_report', False):
                identity['details']['exclude_report'] = True

                try:
                    idApi.update_identity(identity['id'],
                                          {'details': identity['details']})
                    id_count += 1
                except exceptions.ConnectionError as exc:
                    self.warning(
                        'Connection error to Identity API: {}'.format(exc))
                except HTTPServiceError as exc:
                    self.warning(
                        'Invalid Identity Store API response({}): {}'.format(
                            exc.response.status_code, exc.response.url))

        self.success('Updated %s identities and %s registrations.' %
                     (id_count, reg_count))
def identity(request, identity):
    idApi = IdentityStoreApiClient(
        api_url=request.session["user_tokens"]["SEED_IDENTITY_SERVICE"]
        ["url"],  # noqa
        auth_token=request.session["user_tokens"]["SEED_IDENTITY_SERVICE"][
            "token"]  # noqa
    )
    hubApi = HubApiClient(
        api_url=request.session["user_tokens"]["HUB"]["url"],  # noqa
        auth_token=request.session["user_tokens"]["HUB"]["token"]  # noqa
    )
    sbmApi = StageBasedMessagingApiClient(
        api_url=request.session["user_tokens"]["SEED_STAGE_BASED_MESSAGING"]
        ["url"],  # noqa
        auth_token=request.session["user_tokens"]["SEED_STAGE_BASED_MESSAGING"]
        ["token"]  # noqa
    )
    msApi = MessageSenderApiClient(
        api_url=request.session["user_tokens"]["SEED_MESSAGE_SENDER"]
        ["url"],  # noqa
        auth_token=request.session["user_tokens"]["SEED_MESSAGE_SENDER"][
            "token"]  # noqa
    )
    messagesets_results = sbmApi.get_messagesets()
    messagesets = {}
    schedules = {}
    choices = []
    for messageset in messagesets_results["results"]:
        messagesets[messageset["id"]] = messageset["short_name"]
        schedules[messageset["id"]] = messageset["default_schedule"]
        choices.append((messageset["id"], messageset["short_name"]))

    results = idApi.get_identity(identity)
    sbm_filter = {"identity": identity}
    subscriptions = sbmApi.get_subscriptions(params=sbm_filter)

    if request.method == "POST":
        if 'add_subscription' in request.POST:
            form = AddSubscriptionForm(request.POST)
            language = results['details'].get(settings.LANGUAGE_FIELD)

            if language:

                if form.is_valid():
                    subscription = {
                        "active": True,
                        "identity": identity,
                        "completed": False,
                        "lang": language,
                        "messageset": form.cleaned_data['messageset'],
                        "next_sequence_number": 1,
                        "schedule": schedules[form.cleaned_data['messageset']],
                        "process_status": 0,
                    }
                    sbmApi.create_subscription(subscription)

                    messages.add_message(
                        request,
                        messages.INFO,
                        'Successfully created a subscription.',
                        extra_tags='success')
            else:
                messages.add_message(
                    request,
                    messages.ERROR,
                    'No language value in {} on the identity.'.format(
                        settings.LANGUAGE_FIELD),
                    extra_tags='danger')

        elif 'deactivate_subscription' in request.POST:
            form = DeactivateSubscriptionForm(request.POST)

            if form.is_valid():
                data = {"active": False}
                sbmApi.update_subscription(
                    form.cleaned_data['subscription_id'], data)

                messages.add_message(
                    request,
                    messages.INFO,
                    'Successfully deactivated the subscription.',
                    extra_tags='success')

        elif 'optout_identity' in request.POST:
            try:
                details = results.get('details', {})
                addresses = details.get('addresses', {})

                for address_type, addresses in addresses.items():
                    for address, info in addresses.items():
                        idApi.create_optout({
                            "identity": identity,
                            "optout_type": "stop",
                            "address_type": address_type,
                            "address": address,
                            "request_source": "ci"
                        })

                hubApi.create_optout_admin({settings.IDENTITY_FIELD: identity})

                messages.add_message(request,
                                     messages.INFO,
                                     'Successfully opted out.',
                                     extra_tags='success')
            except:
                messages.add_message(request,
                                     messages.ERROR,
                                     'Optout failed.',
                                     extra_tags='danger')

    hub_filter = {settings.IDENTITY_FIELD: identity}
    registrations = hubApi.get_registrations(params=hub_filter)
    changes = hubApi.get_changes(params=hub_filter)
    if results is None:
        return redirect('not_found')

    outbound_message_params = {
        'to_identity': identity,
        'ordering': '-created_at',
    }
    outbound_messages = msApi.get_outbounds(params=outbound_message_params)
    outbound_page = request.GET.get('outbound_page')
    outbound_paginator = Paginator(list(outbound_messages['results']),
                                   settings.IDENTITY_MESSAGES_PAGE_SIZE)

    try:
        outbound_messages = outbound_paginator.page(outbound_page)
    except PageNotAnInteger:
        outbound_messages = outbound_paginator.page(1)
    except EmptyPage:
        outbound_messages = outbound_paginator.page(
            outbound_paginator.num_pages)

    inbound_message_params = {
        'from_identity': identity,
        'ordering': '-created_at',
    }
    inbound_messages = msApi.get_inbounds(inbound_message_params)
    inbound_page = request.GET.get('inbound_page')
    inbound_paginator = Paginator(list(inbound_messages['results']),
                                  settings.IDENTITY_MESSAGES_PAGE_SIZE)

    try:
        inbound_messages = inbound_paginator.page(inbound_page)
    except PageNotAnInteger:
        inbound_messages = inbound_paginator.page(1)
    except EmptyPage:
        inbound_messages = inbound_paginator.page(inbound_paginator.num_pages)

    deactivate_subscription_form = DeactivateSubscriptionForm()
    add_subscription_form = AddSubscriptionForm()
    add_subscription_form.fields['messageset'] = forms.ChoiceField(
        choices=choices)

    optout_visible = False
    details = results.get('details', {})
    addresses = details.get('addresses', {})
    msisdns = addresses.get('msisdn', {})
    optout_visible = any((not d.get('optedout') for _, d in msisdns.items()))

    context = {
        "identity": results,
        "registrations": registrations,
        "changes": changes,
        "messagesets": messagesets,
        "subscriptions": subscriptions,
        "outbound_messages": outbound_messages,
        "add_subscription_form": add_subscription_form,
        "deactivate_subscription_form": deactivate_subscription_form,
        "inbound_messages": inbound_messages,
        "optout_visible": optout_visible
    }
    context.update(csrf(request))
    return render(request, 'ci/identities_detail.html', context)
Ejemplo n.º 4
0
    def handle(self, *options, **kwargs):
        self.identity_cache = {}

        hub_token = kwargs['hub_token']
        hub_url = kwargs['hub_url']
        id_store_token = kwargs['identity_store_token']
        id_store_url = kwargs['identity_store_url']
        group = kwargs['group']

        headers = ['risk', 'count']
        if group == 'msisdn':
            if not id_store_token or not id_store_url:
                raise CommandError(
                    'Please make sure the --identity-store-url and '
                    '--identity-store-token is set.')

            ids_client = IdentityStoreApiClient(id_store_token, id_store_url)
            headers = ['msisdn', 'risk']

        output = self.stdout
        if kwargs['output']:
            output = open(kwargs['output'], 'w')

        results = defaultdict(int)

        def add_to_result(risk, reg):
            if group == "msisdn":
                identity = self.get_identity(ids_client, reg)

                if identity:
                    details = identity.get('details', {})
                    default_addr_type = details.get('default_addr_type')
                    if default_addr_type:
                        addresses = details.get('addresses', {})
                        msisdns = addresses.get(default_addr_type, {}).keys()
                    else:
                        msisdns = []

                    results[', '.join(msisdns)] = 1 if risk == "high" else 0
            else:
                results[risk] += 1

        if hub_token and hub_url:
            hub_client = HubApiClient(hub_token, hub_url)

            for source in (1, 3):
                registrations = hub_client.get_registrations({
                    "source": source,
                    "validated": True
                })['results']

                for registration in registrations:
                    mom_dob = registration["data"].get("mom_dob")
                    if not mom_dob:
                        identity = self.get_identity(
                            ids_client, registration["registrant_id"])
                        if not identity:
                            continue
                        mom_dob = identity["details"].get("mom_dob")

                    risk = get_risk_status(registration["reg_type"], mom_dob,
                                           registration["data"].get("edd"))

                    add_to_result(risk, registration['registrant_id'])

        else:
            registrations = Registration.objects.filter(
                Q(reg_type='pmtct_postbirth') | Q(reg_type='pmtct_prebirth')
                | Q(reg_type='whatsapp_pmtct_postbirth')
                | Q(reg_type='whatsapp_pmtct_prebirth'),
                validated=True)

            for registration in registrations.iterator():
                add_personally_identifiable_fields(registration)
                risk = get_risk_status(registration.reg_type,
                                       registration.data["mom_dob"],
                                       registration.data.get("edd"))

                add_to_result(risk, registration.registrant_id)

        writer = csv.DictWriter(output, headers)
        writer.writeheader()
        for risk, count in results.items():
            writer.writerow({headers[0]: risk, headers[1]: count})