mangroveorg/datawinners

View on GitHub
datawinners/entity/view/groups.py

Summary

Maintainability
A
2 hrs
Test Coverage
import HTMLParser
import json
from xml.sax.saxutils import unescape
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.utils.translation import ugettext
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search

from datawinners.accountmanagement.decorators import session_not_expired, is_datasender, is_not_expired
from datawinners.entity.group_helper import get_group_details, get_group_by_name, check_uniqueness_of_group
from datawinners.main.database import get_database_manager
from datawinners.search.all_datasender_search import get_all_datasenders_short_codes
from datawinners.settings import ELASTIC_SEARCH_HOST, ELASTIC_SEARCH_PORT
from mangrove.datastore.entity import contact_by_short_code
from mangrove.errors.MangroveException import DataObjectNotFound


@login_required
@session_not_expired
@is_datasender
@is_not_expired
def get_group_names(request):
    dbm = get_database_manager(request.user)
    group_names = get_group_details(dbm)
    return HttpResponse(json.dumps({'group_details': group_names}), content_type="application/json")


def _update_group_for_contacts(contact_ids, dbm, group_names, action):
    for contact_id in contact_ids:
        contact = contact_by_short_code(dbm, contact_id)
        action_to_perform = contact.add_custom_group if action == 'add' else contact.remove_custom_group
        for group_name in group_names:
            action_to_perform(group_name)
        contact.save()


def _rename_group_for_contacts(contact_ids, dbm, current_group_name, new_group_name):
    for contact_id in contact_ids:
        contact = contact_by_short_code(dbm, contact_id)
        contact.remove_custom_group(current_group_name)
        contact.add_custom_group(new_group_name)
        contact.save()


@login_required
@session_not_expired
@is_datasender
@is_not_expired
def add_or_remove_contact_from_groups(request):
    dbm = get_database_manager(request.user)
    group_names = json.loads(request.POST['group-names'])
    current_group_name = request.POST['current_group_name']
    contact_ids = json.loads(request.POST['contact_ids'])
    all_selected = json.loads(request.POST['all_selected'])
    action = request.POST['action']
    success = True
    try:
        if not all_selected:
            _update_group_for_contacts(contact_ids, dbm, group_names, action)
        else:
            search_query = request.POST['search_query']
            contact_ids = _get_reporter_ids_for_group_name(dbm, current_group_name, search_query)
            _update_group_for_contacts(contact_ids, dbm, group_names, action)
        message = 'Contact(s) successfully added to Group(s).' if action == 'add' else 'The Contact(s) are removed from Group(s) successfully.'
    except Exception as e:
        # log exception
        message = ugettext('Failed to add in to group.')
        success = False
    return HttpResponse(content=json.dumps({'success': success, 'message': ugettext(message)}),
                        content_type='application/json')


@login_required
@session_not_expired
@is_datasender
@is_not_expired
def delete_group(request):
    dbm = get_database_manager(request.user)
    group_name_to_delete = request.POST['group_name']
    contact_ids = _get_reporter_ids_for_group_name(dbm, group_name_to_delete, None)
    _update_group_for_contacts(contact_ids, dbm, [group_name_to_delete], 'remove')
    try:
        group = get_group_by_name(dbm, group_name_to_delete)
        group.delete()
        return HttpResponse(status=200)

    except DataObjectNotFound:
        return HttpResponse(status=400)

@login_required
@session_not_expired
@is_datasender
@is_not_expired
def rename_group(request):
    dbm = get_database_manager(request.user)
    current_group_name = request.POST['group_name']
    new_group_name = request.POST['new_group_name']
    try:
        group = get_group_by_name(dbm, current_group_name)
        if check_uniqueness_of_group(dbm, new_group_name):
            contact_ids = _get_reporter_ids_for_group_name(dbm, current_group_name, None)
            _rename_group_for_contacts(contact_ids, dbm, current_group_name, new_group_name)
            group.update_name(new_group_name)
            group.save()
            return HttpResponse(status=200, content=json.dumps({'success': True}))
        else:
            return HttpResponse(status=200, content=json.dumps(
                {'success': False, 'message': ugettext("Group with same name already exists.")}))
    except DataObjectNotFound:
        return HttpResponse(status=400)


def _get_reporter_ids_for_group_name(dbm, group_name, search_query):
    search_parameters = {'search_filters': {'group_name': group_name, 'search_text': search_query}}
    return get_all_datasenders_short_codes(dbm, search_parameters)


@login_required
@session_not_expired
@is_datasender
@is_not_expired
def group_ds_count(request):
    dbm = get_database_manager(request.user)
    groups = []
    group_details = get_group_details(dbm)
    for group_detail in group_details:
        name = unescape(group_detail['name'])
        group_count = _get_data_sender_count_for_groups(dbm, name)
        groups.append({'count': group_count, 'name': name})
    return HttpResponse(content_type='application/json', content=json.dumps({'groups': groups}))


def _get_data_sender_count_for_groups(dbm, group_name):
    es = Elasticsearch(hosts=[{"host": ELASTIC_SEARCH_HOST, "port": ELASTIC_SEARCH_PORT}])
    search = Search(using=es, index=dbm.database_name, doc_type='reporter')
    search = search.query("term", customgroups_exact=group_name)
    search = search.query("term", void=False)
    body = search.to_dict()
    return es.search(index=dbm.database_name, doc_type='reporter', body=body, search_type='count')['hits']['total']