def access_dashboards(request):
    access = get_access(request)
    urls = []
    if access:
        for url in access.allowed_urls.all():
            print url.url
            if url.url.startswith('^flags/(?P<pk'):
                for f in access.flags.all():
                    urls.append('/flags/%s/messages/' % str(f.pk))
            elif url.url.startswith('^dashboard/(?P<name>'):
                for f in access.flags.all():
                    urls.append('/dashboard/%s/' % str(f.name.replace(" ", "_")))
            elif url.url.startswith('^(?P<poll_id>\d+)/respon'):
                for f in access.user.poll_set.all():
                    urls.append('/%s/responses/' % str(f.pk))
            elif url.url.startswith('^mypolls/(?P<pk>'):
                urls.append('/mypolls/%s/' % str(request.user.pk))
            elif url.url.startswith('^alerts/(?P<pk>'):
                urls.append('/alerts/%s/' % str(request.user.pk))
            elif url.url.startswith('^dashboard/group/(?P<name>'):
                for f in access.groups.all():
                    urls.append('/dashboard/group/%s/' % str(f.name))
            else:
                if "?" not in url.url:
                    urls.append(url.url.replace('^', '/').replace('$', ""))
    return render_to_response('ureport/access_dashboards.html', locals(), context_instance=RequestContext(request))
Ejemplo n.º 2
0
def ureport_polls(request, pk):
    access = get_access(request)
    columns = [(_('Name'), True, 'name', SimpleSorter()),
               (_('Question'), True, 'question', SimpleSorter(),),
               (_('Start Date'), True, 'start_date', SimpleSorter(),),
               (_('Closing Date'), True, 'end_date', SimpleSorter()),
               ('', False, '', None)]
    queryset = get_polls(request=request)
    if access:
        queryset = queryset.filter(user=access.user)
    return generic(request,
                   model=Poll,
                   queryset=queryset,
                   objects_per_page=10,
                   selectable=False,
                   partial_row='ureport/partials/polls/poll_admin_row.html',
                   base_template='ureport/poll_admin_base.html',
                   paginator_template='ureport/partials/new_pagination.html',
                   results_title='Polls',
                   paginator_func=ureport_paginate,
                   sort_column='start_date',
                   sort_ascending=False,
                   filter_forms=[SearchPollsForm],
                   columns=columns
    )
def access_dashboards(request):
    access = get_access(request)
    urls = []
    if access:
        for url in access.allowed_urls.all():
            print url.url
            if url.url.startswith('^flags/(?P<pk'):
                for f in access.flags.all():
                    urls.append('/flags/%s/messages/' % str(f.pk))
            elif url.url.startswith('^dashboard/(?P<name>'):
                for f in access.flags.all():
                    urls.append('/dashboard/%s/' % str(f.name.replace(" ", "_")))
            elif url.url.startswith('^(?P<poll_id>\d+)/respon'):
                for f in access.user.poll_set.all():
                    urls.append('/%s/responses/' % str(f.pk))
            elif url.url.startswith('^mypolls/(?P<pk>'):
                urls.append('/mypolls/%s/' % str(request.user.pk))
            elif url.url.startswith('^alerts/(?P<pk>'):
                urls.append('/alerts/%s/' % str(request.user.pk))
            elif url.url.startswith('^dashboard/group/(?P<name>'):
                for f in access.groups.all():
                    urls.append('/dashboard/group/%s/' % str(f.name))
            else:
                if "?" not in url.url:
                    urls.append(url.url.replace('^', '/').replace('$', ""))
    return render_to_response('ureport/access_dashboards.html', locals(), context_instance=RequestContext(request))
Ejemplo n.º 4
0
def mass_messages(request):
    access = get_access(request)
    columns = [(_('Message'), True, 'text', TupleSorter(0)),
               (_('Time'), True, 'date', TupleSorter(1)), (_('User'), True, 'user', TupleSorter(2)),
               (_('Recipients'), True, 'response', TupleSorter(3)),
               (_('Type'), True, 'type', TupleSorter(4))]

    queryset = get_mass_messages(request=request)
    if access:
        queryset = queryset.filter(user=access.user)
    return generic(
        request,
        model=MassText,
        queryset=queryset,
        objects_per_page=10,
        partial_row='contact/partials/mass_message_row.html',
        paginator_template='ureport/partials/new_pagination.html',
        paginator_func=ureport_paginate,
        base_template='ureport/contacts_base.html',
        sort_column='date',
        results_title="Mass Messages",
        sort_ascending=False,
        selectable=False,
        columns=columns
    )
def flag_categories(request, name):
    group = get_object_or_404(Group, name=name)
    if get_access(request) and request.user not in group.user_set.all():
        return render(request, '403.html', status=403)
    access = group.access_set.all()[0]
    flags = access.flags.all()
    flagged_messages = MessageFlag.objects.filter(flag__in=flags,
                                                  message__connection__contact__reporting_location__name__in=access.allowed_locations)
    if request.GET.get('export', None):
        data = flagged_messages.filter(
            message__connection__contact__reporting_location__name__in=access.allowed_locations).values_list(
            'message__connection_id', 'message__text', 'flag__name', 'message__date',
            'message__connection__contact__reporting_location__name')
        headers = ['Identifier', 'Message', 'Flag', 'Date', 'District']
        return ExcelResponse(data=data, headers=headers)
    return generic(
        request,
        model=MessageFlag,
        queryset=flagged_messages,
        objects_per_page=10,
        results_title='Flagged Messages',
        selectable=False,
        partial_row='ureport/partials/messages/flagged_message_row.html'
        ,
        base_template='ureport/flagged_message_base.html',
        columns=[('Identifier', True, 'message__connection_id', SimpleSorter()),
                 ('Message', True, 'message__text', SimpleSorter()),
                 ('Date', True, 'message__date', SimpleSorter()),
                 ('Flags', False, 'message__flagged', None)],
        sort_column='date',
        sort_ascending=False,
        all_flags=flags,
        go_to_dashboards=True
    )
Ejemplo n.º 6
0
def autoreg_messages(request):
    access = get_access(request)
    filter_forms = [FreeSearchTextForm, DistictFilterMessageForm]
    action_forms = [ReplyTextForm, BlacklistForm2]
    partial_row = 'ureport/partials/messages/message_row.html'
    base_template = 'ureport/contact_message_base.html'
    paginator_template = 'ureport/partials/new_pagination.html'
    columns = [(_('Text'), True, 'text', SimpleSorter()),
               (_('Identifier'), True, 'connection__pk', SimpleSorter()),
               (_('Date'), True, 'date',
                SimpleSorter()), (_('Type'), True, 'application',
                                  SimpleSorter()), (_('Response'), False, 'response', None)]

    queryset = get_autoreg_messages(request=request)
    if access:
        queryset = queryset.filter(connection__contact__groups__in=access.groups.all())
    return generic(
        request,
        model=Message,
        queryset=queryset,
        filter_forms=filter_forms,
        action_forms=action_forms,
        objects_per_page=25,
        partial_row=partial_row,
        results_title="Autoreg Messages",
        base_template=base_template,
        paginator_template=paginator_template,
        paginator_func=ureport_paginate,
        columns=columns,
        sort_column='date',
        sort_ascending=False,
    )
Ejemplo n.º 7
0
def view_flagged_with(request, pk):
    flag = get_object_or_404(Flag, pk=pk)
    access = get_access(request)
    if access and not flag in access.flags.all():
        return render(request, '403.html', status=403)
    messages = flag.get_messages()
    if request.GET.get('export', None):
        export_data = messages.values_list('text', 'connection_id', 'date',
                                           'connection__contact__reporting_location__name')
        headers = ['Message', 'Identifier', 'Date', 'District']
        return ExcelResponse(data=export_data, headers=headers)
    return generic(
        request,
        model=Message,
        queryset=messages,
        objects_per_page=25,
        partial_row='ureport/partials/contacts/contacts_row_flag.html',
        base_template='ureport/view_flagged_with_base.html',
        results_title='Messages Flagged With %s' % flag.name,
        columns=[('Message', True, 'text', SimpleSorter()),
                 ('Identifier', True, 'connection_id', SimpleSorter()),
                 ('Date', True, 'date', SimpleSorter()),
                 ('Type', True, 'application', SimpleSorter())],
        sort_column='date',
        sort_ascending=False,
    )
def voices(request):
    """
    a context processor that passes the total number of ureporters to all templates.
    """
    try:
        quote = QuoteBox.objects.latest()
    except QuoteBox.DoesNotExist:
        quote = None

    context = {
        'total_ureporters': Contact.objects.exclude(
            connection__identity__in=Blacklist.objects.values_list('connection__identity', flat=True)).count(),
        'polls': Poll.objects.exclude(contacts=None, start_date=None).exclude(pk__in=[297, 296, 349, 350]).order_by(
                '-start_date'),
        'deployment_id': settings.DEPLOYMENT_ID,
        'quote': quote,
        'geoserver_url': settings.GEOSERVER_URL,
        'map_bounds': settings.MAP_BOUNDS,
        'map_args': settings.MAP_ARGS,
        'show_contact_info': getattr(settings, 'SHOW_CONTACT_INFO', True)
    }
    if request.user.is_authenticated():
        context['access'] = get_access(request)

    if has_valid_pagination_limit(settings):
        context['polls'] = Poll.objects.exclude(contacts=None, start_date=None).exclude(
            pk__in=[297, 296, 349, 350]).order_by(
            '-start_date')[:settings.PAGINATION_LIMIT]
    return context
Ejemplo n.º 9
0
def autoreg_messages(request):
    access = get_access(request)
    filter_forms = [SearchInMessagesForm, DistictFilterMessageForm]
    action_forms = [ReplyTextForm, BlacklistForm2]
    partial_row = 'ureport/partials/messages/message_row.html'
    base_template = 'ureport/contact_message_base.html'
    paginator_template = 'ureport/partials/new_pagination.html'
    columns = [('Text', True, 'text', SimpleSorter()),
               ('Identifier', True, 'connection__pk', SimpleSorter()),
               ('Date', True, 'date', SimpleSorter()),
               ('Type', True, 'application', SimpleSorter()),
               ('Response', False, 'response', None)]

    queryset = get_autoreg_messages(request=request)
    if access:
        queryset = queryset.filter(
            connection__contact__groups__in=access.groups.all())
    return generic(
        request,
        model=Message,
        queryset=queryset,
        filter_forms=filter_forms,
        action_forms=action_forms,
        objects_per_page=25,
        partial_row=partial_row,
        results_title="Autoreg Messages",
        base_template=base_template,
        paginator_template=paginator_template,
        paginator_func=ureport_paginate,
        columns=columns,
        sort_column='date',
        sort_ascending=False,
    )
def flag_categories(request, name):
    group = get_object_or_404(Group, name=name)
    if get_access(request) and request.user not in group.user_set.all():
        return render(request, '403.html', status=403)
    access = group.access_set.all()[0]
    flags = access.flags.all()
    flagged_messages = MessageFlag.objects.filter(flag__in=flags,
                                                  message__connection__contact__reporting_location__name__in=access.allowed_locations)
    if request.GET.get('export', None):
        data = flagged_messages.filter(
            message__connection__contact__reporting_location__name__in=access.allowed_locations).values_list(
            'message__connection_id', 'message__text', 'flag__name', 'message__date',
            'message__connection__contact__reporting_location__name')
        headers = ['Identifier', 'Message', 'Flag', 'Date', 'District']
        return ExcelResponse(data=data, headers=headers)
    return generic(
        request,
        model=MessageFlag,
        queryset=flagged_messages,
        objects_per_page=10,
        results_title='Flagged Messages',
        selectable=False,
        partial_row='ureport/partials/messages/flagged_message_row.html'
        ,
        base_template='ureport/flagged_message_base.html',
        columns=[('Identifier', True, 'message__connection_id', SimpleSorter()),
                 ('Message', True, 'message__text', SimpleSorter()),
                 ('Date', True, 'message__date', SimpleSorter()),
                 ('Flags', False, 'message__flagged', None)],
        sort_column='date',
        sort_ascending=False,
        all_flags=flags,
        go_to_dashboards=True
    )
Ejemplo n.º 11
0
def ureport_polls(request):
    access = get_access(request)
    columns = [('Name', True, 'name', SimpleSorter()),
               (
                   'Question',
                   True,
                   'question',
                   SimpleSorter(),
               ), (
                   'Start Date',
                   True,
                   'start_date',
                   SimpleSorter(),
               ), ('Closing Date', True, 'end_date', SimpleSorter()),
               ('', False, '', None)]
    queryset = get_polls(request=request)
    if access:
        queryset = queryset.filter(user=access.user)
    return generic(request,
                   model=Poll,
                   queryset=queryset,
                   objects_per_page=10,
                   selectable=False,
                   partial_row='ureport/partials/polls/poll_admin_row.html',
                   base_template='ureport/poll_admin_base.html',
                   paginator_template='ureport/partials/new_pagination.html',
                   results_title='Polls',
                   paginator_func=ureport_paginate,
                   sort_column='start_date',
                   sort_ascending=False,
                   columns=columns)
Ejemplo n.º 12
0
def view_responses(req, poll_id):
    poll = get_object_or_404(Poll, pk=poll_id)
    access = get_access(req)
    if access and not poll.user == access.user:
        return render(req, '403.html', status=403)

    script_polls = \
        ScriptStep.objects.exclude(poll=None).values_list('poll',
                                                          flat=True)
    response_rates = {}
    if poll.pk in script_polls:
        responses = poll.responses.order_by('-date')
        log.info("[reponses] 1 - %s " % responses)
    else:
        responses = poll.responses.all()
        responses = responses.order_by('-date')
        log.info("[reponses] 3 - %s " % responses)
        for group in req.user.groups.all():
            try:
                contact_count = \
                    poll.contacts.filter(groups__in=[group]).distinct().count()
                response_count = \
                    poll.responses.filter(contact__groups__in=[group]).distinct().count()
                response_rates[str(group.name)] = [contact_count]
                response_rates[str(group.name)].append(response_count)
                response_rates[str(group.name)].append(response_count * 100.0 /
                                                       contact_count)
            except ZeroDivisionError:
                response_rates.pop(group.name)
    typedef = Poll.TYPE_CHOICES[poll.type]
    # columns = [('Sender', False, 'sender', None)]
    # for (column, style_class, sortable, db_field, sorter) in \
    #     typedef['report_columns']:
    #     columns.append((column, sortable, db_field, sorter))
    columns = ((_('Date'), True, 'date', SimpleSorter()),
               (_('Text'), True, 'poll__question', SimpleSorter()),
               (_('Category'), True, 'categories__category', SimpleSorter()))

    return generic(
        req,
        model=Response,
        response_rates=response_rates,
        queryset=responses,
        objects_per_page=25,
        selectable=True,
        partial_base='ureport/partials/polls/poll_partial_base.html',
        base_template='ureport/responses_base.html',
        paginator_template='ureport/partials/new_pagination.html',
        paginator_func=ureport_paginate,
        row_base=typedef['view_template'],
        action_forms=[
            AssignToPollForm, AssignResponseGroupForm, ReplyTextForm,
            DeleteSelectedForm
        ],
        filter_forms=[SearchResponsesForm],
        columns=columns,
        partial_row='ureport/partials/polls/response_row.html',
        poll_id=poll_id,
    )
Ejemplo n.º 13
0
def view_responses(req, poll_id):
    poll = get_object_or_404(Poll, pk=poll_id)
    access = get_access(req)
    if access and not poll.user == access.user:
        return render(req, '403.html', status=403)

    script_polls = \
        ScriptStep.objects.exclude(poll=None).values_list('poll',
                                                          flat=True)
    response_rates = {}
    if poll.pk in script_polls:
        responses = poll.responses.order_by('-date')
        log.info("[reponses] 1 - %s " % responses)
    else:
        responses = poll.responses.all()
        responses = responses.order_by('-date')
        log.info("[reponses] 3 - %s " % responses)
        for group in req.user.groups.all():
            try:
                contact_count = \
                    poll.contacts.filter(groups__in=[group]).distinct().count()
                response_count = \
                    poll.responses.filter(contact__groups__in=[group]).distinct().count()
                response_rates[str(group.name)] = [contact_count]
                response_rates[str(group.name)].append(response_count)
                response_rates[str(group.name)].append(response_count
                                                       * 100.0 / contact_count)
            except ZeroDivisionError:
                response_rates.pop(group.name)
    typedef = Poll.TYPE_CHOICES[poll.type]
    # columns = [('Sender', False, 'sender', None)]
    # for (column, style_class, sortable, db_field, sorter) in \
    #     typedef['report_columns']:
    #     columns.append((column, sortable, db_field, sorter))
    columns = (
        (_('Date'), True, 'date', SimpleSorter()),
        (_('Text'), True, 'poll__question', SimpleSorter()),
        (_('Category'), True, 'categories__category', SimpleSorter())
    )

    return generic(
        req,
        model=Response,
        response_rates=response_rates,
        queryset=responses,
        objects_per_page=25,
        selectable=True,
        partial_base='ureport/partials/polls/poll_partial_base.html',
        base_template='ureport/responses_base.html',
        paginator_template='ureport/partials/new_pagination.html',
        paginator_func=ureport_paginate,
        row_base=typedef['view_template'],
        action_forms=[AssignToPollForm, AssignResponseGroupForm, ReplyTextForm,
                      DeleteSelectedForm],
        filter_forms=[SearchResponsesForm],
        columns=columns,
        partial_row='ureport/partials/polls/response_row.html',
        poll_id=poll_id,
        )
Ejemplo n.º 14
0
def ureporters(request):
    access = get_access(request)
    download_form = DownloadForm(request.POST or None)
    if request.POST and request.POST.get('download', None):
        if download_form.is_valid():
            download_form.export(request, request.session['queryset'], 'autoreg_join_date')
        else:
            return HttpResponse("Some thing went wrong")

    columns = [
        (_('Identifier'), True, 'connection_pk', SimpleSorter()),
        (_('Age'), True, 'age', SimpleSorter(),),
        (_('Gender'), True, 'gender', SimpleSorter(),),
        (_('Language'), True, 'language', SimpleSorter(),),
        (_('District'), True, 'district', SimpleSorter(),),
        (_('Group(s)'), True, 'group', SimpleSorter(),),
        (_('Questions '), True, 'questions', SimpleSorter(),),
        (_('Responses '), True, 'responses', SimpleSorter(),),
        (_('Messages Sent'), True, 'incoming', SimpleSorter(),),
        (_('caregiver'), True, 'is_caregiver', SimpleSorter(),),
        (_('join date'), True, 'autoreg_join_date', SimpleSorter(),),
        (_('quit date'), True, 'quit_date', SimpleSorter(),),
    ]

    if request.user.is_staff:
        columns.insert(1, ('Phone', True, 'mobile', SimpleSorter()))

    queryset = get_contacts2(request=request)
    if access is not None:
        groups = list(access.groups.values_list('name', flat=True))
        if len(groups) > 0:
            qset = Q(group__icontains=groups[0])
        if len(groups) > 1:
            for group in groups[1:]:
                qset = qset | Q(group__icontains=group)
        queryset = queryset.filter(qset)
    return generic(request,
                   model=UreportContact,
                   queryset=queryset,
                   download_form=download_form,
                   results_title= _('uReporters'),
                   filter_forms=[UreporterSearchForm, GenderFilterForm, AgeFilterForm, MultipleDistictFilterForm,
                                 FilterGroupsForm],
                   action_forms=[MassTextForm, AssignGroupForm, BlacklistForm, AssignToNewPollForm, RemoveGroupForm,
                                 TemplateMessage],
                   objects_per_page=25,
                   partial_row='ureport/partials/contacts/contacts_row.html',
                   base_template='ureport/ureporters_base.html',
                   paginator_template='ureport/partials/new_pagination.html',
                   paginator_func=ureport_paginate,
                   columns=columns,

    )
Ejemplo n.º 15
0
def voices(request):
    """
    a context processor that passes the total number of ureporters to all templates.
    """
    try:
        quote = QuoteBox.objects.latest()
    except QuoteBox.DoesNotExist:
        quote = None

    context = {
        'total_ureporters':
        Contact.objects.exclude(
            connection__identity__in=Blacklist.objects.values_list(
                'connection__identity', flat=True)).count(),
        'polls':
        Poll.objects.exclude(contacts=None, start_date=None).exclude(
            pk__in=[297, 296, 349, 350]).order_by('-start_date'),
        'deployment_id':
        settings.DEPLOYMENT_ID,
        'quote':
        quote,
        'geoserver_url':
        settings.GEOSERVER_URL,
        'map_bounds':
        settings.MAP_BOUNDS,
        'map_args':
        settings.MAP_ARGS,
        'show_contact_info':
        getattr(settings, 'SHOW_CONTACT_INFO', True)
    }
    if request.user.is_authenticated():
        context['access'] = get_access(request)

    if has_valid_pagination_limit(settings):
        context['polls'] = Poll.objects.exclude(
            contacts=None,
            start_date=None).exclude(pk__in=[297, 296, 349, 350]).order_by(
                '-start_date')[:settings.PAGINATION_LIMIT]
    return context
Ejemplo n.º 16
0
def ureport_polls(request):
	access = get_access(request)
	columns = [('Name', True, 'name', SimpleSorter()),
               ('Question', True, 'question', SimpleSorter(),),
               ('Start Date', True, 'start_date', SimpleSorter(),),
               ('Closing Date', True, 'end_date', SimpleSorter()),
               ('', False, '', None)]
	#queryset = get_polls(request=request).filter(user__groups__in=request.user.groups.values_list('id'))

	list_of_poll_id = []
	for pol in Poll.objects.all():
		contacts = Contact.objects.filter(polls=pol.id,groups = request.user.groups.values_list('id'))
		if contacts.count() != 0:
			list_of_poll_id.append(pol.id)


	queryset = get_polls(request=request)
	if access:
		queryset = queryset.filter(user__groups__in=request.user.groups.values_list('id'))

	queryset = get_polls(request=request).filter(id__in=list_of_poll_id)

	return generic(request,
                   model=Poll,
                   queryset=queryset,
                   objects_per_page=10,
                   selectable=False,
                   partial_row='ureport/partials/polls/poll_admin_row.html',
                   base_template='ureport/poll_admin_base.html',
                   paginator_template='ureport/partials/new_pagination.html',
                   results_title='Polls',
                   paginator_func=ureport_paginate,
                   sort_column='start_date',
                   sort_ascending=False,
                   columns=columns
    )
Ejemplo n.º 17
0
def alerts(request):
    access = get_access(request)
    poll_form = NewPollForm()
    range_form = rangeForm()
    poll_form.updateTypes()
    assign_polls = Poll.objects.exclude(start_date=None).order_by('-pk')[0:5]
    district_form = DistrictForm(request.POST or None)
    if request.GET.get('reset_districts', None):
        request.session['districts'] = None
        request.session['groups'] = None

    if district_form.is_valid():
        request.session['districts'] = [c.pk for c in district_form.cleaned_data['districts']]

    groupform = AssignResponseGroupForm(request=request, access=access)
    if request.method == 'POST' and request.POST.get('groups', None):
        g_form = AssignResponseGroupForm(request.POST, request=request)
        if g_form.is_valid():
            request.session['groups'] = g_form.cleaned_data['groups']

    template = 'ureport/polls/alerts.html'
    if request.session.get('districts'):
        message_list = \
            Message.objects.filter(details__attribute__name='alert'

            ).filter(connection__contact__reporting_location__in=request.session.get('districts'))
    else:
        message_list = Message.objects.filter(details__attribute__name='alert')

    if request.session.get('groups', None):
        message_list = message_list.filter(connection__contact__groups__in=request.session.get('groups'
        ))

    if access:
        message_list = message_list.filter(connection__contact__groups__in=access.groups.all())
    (capture_status, _) = \
        Settings.objects.get_or_create(attribute='alerts')
    (rate, _) = MessageAttribute.objects.get_or_create(name='rating')

    # message_list=[Message.objects.latest('date')]
    # use more efficient count

    if request.GET.get('download', None) and access is None:
        range_form = rangeForm(request.POST)
        if range_form.is_valid():
            start = range_form.cleaned_data['startdate']
            end = range_form.cleaned_data['enddate']
            from django.core.servers.basehttp import FileWrapper

            cols = ["replied", "rating", "direction", "district", "date", "message", "id",
                    "forwarded"]
            data = AlertsExport.objects.filter(date__range=(start, end)).values_list(*cols).iterator()
            excel_file_path = \
                os.path.join(os.path.join(os.path.join(UREPORT_ROOT,
                                                       'static'), 'spreadsheets'),
                             'alerts.xlsx')
            ExcelResponse(data, output_name=excel_file_path,
                          write_to_file=True, headers=cols)
            response = HttpResponse(FileWrapper(open(excel_file_path)),
                                    content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
            response['Content-Disposition'] = 'attachment; filename=alerts.xlsx'
            from django import db

            db.reset_queries()
            response['Cache-Control'] = 'no-cache'
            return response

    if request.GET.get('search', None):
        search = request.GET.get('search')
        if search[0] == '"' and search[-1] == '"':
            search = search[1:-1]
            message_list = message_list.filter(Q(text__iregex=".*\m(%s)\y.*"
                                                              % search)
                                               | Q(connection__contact__reporting_location__name__iregex=".*\m(%s)\y.*"
                                                                                                         % search)
                                               | Q(connection__pk__iregex=".*\m(%s)\y.*"
                                                                          % search))
        elif search[0] == "'" and search[-1] == "'":

            search = search[1:-1]
            message_list = message_list.filter(Q(text__iexact=search)
                                               | Q(connection__contact__reporting_location__name__iexact=search)
                                               | Q(connection__pk__iexact=search))
        elif search == "=numerical value()":
            message_list = message_list.filter(text__iregex="(-?\d+(\.\d+)?)")
        else:

            message_list = message_list.filter(Q(text__icontains=search)
                                               | Q(connection__contact__reporting_location__name__icontains=search)
                                               | Q(connection__pk__icontains=search))

    if request.GET.get('capture', None):
        (s, _) = Settings.objects.get_or_create(attribute='alerts')
        if s.value == 'true':
            s.value = 'false'
            s.save()
            reply = 'Start Capture'
        else:
            s.value = 'true'
            s.save()
            reply = 'Stop Capture'
        return HttpResponse(reply)
    if request.GET.get('ajax', None):
        date = datetime.datetime.now() - datetime.timedelta(seconds=30)
        prev = request.session.get('prev', [])
        msgs = Message.objects.filter(details__attribute__name='alert',
                                      direction='I'
        ).filter(date__gte=date).exclude(pk__in=prev)
        if access:
            msgs = msgs.filter(connection__contact__groups__in=access.groups.all())
        request.session['prev'] = list(msgs.values_list('pk',
                                                        flat=True))
        msgs_list = []
        if msgs:
            for msg in msgs:
                from django.template.loader import render_to_string

                can_view_number = request.user.has_perm('view_numbers')
                can_foward = request.user.has_perm('forward')
                row_rendered = \
                    render_to_string('ureport/partials/row.html',
                                     {'msg': msg, 'can_foward': can_foward, 'can_view_number': can_view_number,
                                      'assign_polls': assign_polls})

                m = {}
                m['text'] = msg.text
                m['date'] = str(msg.date.date())
                if msg.connection.contact:
                    m['name'] = msg.connection.contact.name
                else:
                    m['name'] = 'Anonymous User'
                m['number'] = msg.connection.identity
                if msg.connection.contact \
                    and msg.connection.contact.reporting_location:
                    m['district'] = \
                        msg.connection.contact.reporting_location.name
                else:
                    m['district'] = 'N/A'
                rating = msg.details.filter(attribute__name='alerts')
                if rating:
                    r = rating[0].value
                else:
                    r = 0
                m['row'] = row_rendered
                m['connection'] = msg.connection.pk
                m['pk'] = msg.pk
                msgs_list.append(m)
            return HttpResponse(mark_safe(simplejson.dumps(msgs_list)))
        else:
            return HttpResponse('success')
    if request.GET.get('rating', None):
        rating = request.GET.get('rating')
        descs = {
            '1': 'Requires Attention',
            '2': 'Moderate',
            '3': 'Important',
            '4': 'Urgent',
            '5': 'Very Urgent',
        }
        msg = Message.objects.get(pk=int(request.GET.get('msg')))
        (rate, _) = MessageAttribute.objects.get_or_create(name='rating'
        )
        det = MessageDetail.objects.create(message=msg, attribute=rate,
                                           value=rating, description=descs.get(rating, ''))
        response = \
            """<li><a href='javascript:void(0)'  class="rate%s"

                            title="%s">%s</a></li>""" \
            % (rating, descs.get(rating, ''), descs.get(rating, ''))

        return HttpResponse(mark_safe(response))

    paginator = UreportPaginator(message_list.order_by('-date'), 10, body=12, padding=2)
    page = request.GET.get('page', 1)
    try:
        messages = paginator.page(page)
    except (PageNotAnInteger, EmptyPage):

        # If page is not an integer, deliver first page.

        messages = paginator.page(1)

    return render_to_response(template, {
        'messages': messages,
        'assign_polls': assign_polls,
        'paginator': paginator,
        'capture_status': capture_status,
        'rate': rate,
        'district_form': district_form,
        'range_form': range_form,
        'groupform': groupform,
    }, context_instance=RequestContext(request))
def a_dashboard(request, name):
    poll_form = NewPollForm()
    range_form = rangeForm()
    poll_form.updateTypes()
    template = 'ureport/aids_dashboard.html'

    (capture_status, _) = \
        Settings.objects.get_or_create(attribute='aids')
    (rate, _) = MessageAttribute.objects.get_or_create(name='rating')
    name = name.replace("_", " ")
    flag = get_object_or_404(Flag, name=name)
    access = get_access(request)
    if access is not None and flag not in access.flags.all():
        return render(request, '403.html', status=403)
    messages = flag.get_messages().order_by('-date')
    responses = Message.objects.filter(
        pk__in=flag.flagtracker_set.exclude(response=None).values_list("response", flat=True))
    messages = messages | responses

    if request.GET.get('download', None):
        export_data = messages.values_list('connection__pk', 'text', 'connection__identity',
                                           'connection__contact__reporting_location__name').iterator()
        return ExcelResponse(data=export_data)
    if request.GET.get('capture', None):
        (s, _) = Settings.objects.get_or_create(attribute='aids')
        if s.value == 'true':
            s.value = 'false'
            s.save()
            reply = gettext('Start Capture')
        else:
            s.value = 'true'
            s.save()
            reply = gettext('Stop Capture')
        return HttpResponse(reply)
    if request.GET.get('ajax', None):
        date = datetime.datetime.now() - datetime.timedelta(seconds=30)
        prev = request.session.get('prev', [])
        msgs = flag.get_messages().filter(date__gte=date).exclude(pk__in=prev)
        request.session['prev'] = list(msgs.values_list('pk',
                                                        flat=True))
        msgs_list = []
        if msgs:
            for msg in msgs:
                from django.template.loader import render_to_string

                row_rendered = \
                    render_to_string('ureport/partials/row.html',
                                     {'msg': msg})

                m = {}
                m['text'] = msg.text
                m['date'] = str(msg.date.date())
                if msg.connection.contact:
                    m['name'] = msg.connection.contact.name
                else:
                    m['name'] = 'Anonymous User'
                m['number'] = msg.connection.identity
                if msg.connection.contact \
                    and msg.connection.contact.reporting_location:
                    m['district'] = \
                        msg.connection.contact.reporting_location.name
                else:
                    m['district'] = 'N/A'
                rating = msg.details.filter(attribute__name='aids')
                if rating:
                    r = rating[0].value
                else:
                    r = 0
                m['row'] = row_rendered
                m['connection'] = msg.connection.pk
                m['pk'] = msg.pk
                msgs_list.append(m)
            return HttpResponse(mark_safe(simplejson.dumps(msgs_list)))
        else:
            return HttpResponse('success')
    if request.GET.get('rating', None):
        rating = request.GET.get('rating')
        descs = {
            '1': 'Requires Attention',
            '2': 'Moderate',
            '3': 'Important',
            '4': 'Urgent',
            '5': 'Very Urgent',
        }
        msg = Message.objects.get(pk=int(request.GET.get('msg')))
        (rate, _) = MessageAttribute.objects.get_or_create(name='rating'
        )
        det = MessageDetail.objects.create(message=msg, attribute=rate,
                                           value=rating, description=descs.get(rating, ''))
        response = \
            """<li><a href='javascript:void(0)'  class="rate%s"

        title="%s">%s</a></li>""" \
            % (rating, descs.get(rating, ''), descs.get(rating, ''))

        return HttpResponse(mark_safe(response))

    paginator = UreportPaginator(messages.order_by('-date'), 10, body=12, padding=2)
    page = request.GET.get('page', 1)
    try:
        messages = paginator.page(page)
    except (PageNotAnInteger, EmptyPage):

        # If page is not an integer, deliver first page.

        messages = paginator.page(1)

    return render_to_response(template, {
        'name': name,
        'messages': messages,
        'paginator': paginator,
        'capture_status': capture_status,
        'rate': rate,
        'range_form': range_form,
    }, context_instance=RequestContext(request))
Ejemplo n.º 19
0
def ureporters(request):
    access = get_access(request)
    print request.method
    message=''
    if request.method == 'POST' and request.FILES:
        contactsform = ExcelTestUploadForm(request.POST, request.FILES)
        if contactsform.is_valid() and contactsform.good_file() :
            new_file = contactsform.cleaned_data
            fields = [
                'number',
                'name',
                'province',
                'commune',
                'colline',
                'language',
                'county',
                'village',
                'birthdate',
                'group',
                'gender',
                ]
            message = handle_excel_file_update(new_file['excel_file'], fields)
            print(message)
            messages.success(request, message )
            return HttpResponseRedirect("/reporter")


        else:
        	return HttpResponse(content='The form is not valid. Resfresh this page')

    columns = [
        ('Identifier', True, 'connection_pk', SimpleSorter()),
        ('Modile', True, 'mobile', SimpleSorter()),
        ('Age', True, 'age', SimpleSorter(),),
        ('Gender', True, 'gender', SimpleSorter(),),
        ('Language', True, 'language',SimpleSorter(),),
        ('Province', True, 'province', SimpleSorter(),),
        ('Group(s)', True, 'group', SimpleSorter(),),
        ('Polls ', True, 'questions', SimpleSorter(),),
        ('Responses ', True, 'responses', SimpleSorter(),),
        ('Messages Sent', True, 'incoming', SimpleSorter(),),
#        ('caregiver', True, 'is_caregiver', SimpleSorter(),),
#        ('join date', True, 'autoreg_join_date', SimpleSorter(),),
#        ('quit date', True, 'quit_date', SimpleSorter(),),
        ]
    queryset = get_contacts2(request=request)
    if access is not None:
        groups = ",".join(list(access.groups.values_list('name', flat=True)))
        queryset = queryset.filter(group__icontains=groups)
    return generic(request,
        model=UreportContact,
        queryset=get_contacts2,
        contactsform=ExcelTestUploadForm,
        message=message,
        results_title='uReporters',
        filter_forms=[ UreporterSearchForm,  GenderFilterForm, AgeFilterForm, MultipleDistictFilterForm, FilterGroupsForm, FilterByGroupForm, FilterByLocationForm ],
        action_forms=[MassTextForm, AssignGroupForm, BlacklistForm,  AssignToNewPollForm,RemoveGroupForm,TemplateMessage , ExportToExcelForm],
        objects_per_page=25,
        base_template='ureport/ureporters_base.html',
        partial_base='ureport/partials/contacts/partial_base.html',
        partial_row='ureport/partials/contacts/partial_row.html',
        paginator_template='ureport/partials/new_pagination.html',
        paginator_func=ureport_paginate,
        columns=columns,
        )
def a_dashboard(request, name):
    poll_form = NewPollForm()
    range_form = rangeForm()
    poll_form.updateTypes()
    template = 'ureport/aids_dashboard.html'

    (capture_status, _) = \
        Settings.objects.get_or_create(attribute='aids')
    (rate, _) = MessageAttribute.objects.get_or_create(name='rating')
    name = name.replace("_", " ")
    flag = get_object_or_404(Flag, name=name)
    access = get_access(request)
    if access is not None and flag not in access.flags.all():
        return render(request, '403.html', status=403)
    flagged_messages = Message.objects.filter(flags__flag=flag)\
        .select_related('connection__contact__reporting_location').order_by('-date')
    responses = Message.objects.filter(
        pk__in=flag.flagtracker_set.exclude(response=None).values_list("response", flat=True)
    ).select_related('connection__contact__reporting_location')

    messages = flagged_messages | responses

    if request.GET.get('download', None):
        message_details = MessageDetail.objects.filter(message__id__in=flagged_messages.values_list('id', flat=True))\
            .order_by('message__id')\
            .select_related('message', 'attribute', 'message__connection__contact__reporting_location')

        export_data, messages_with_details = _build_report(message_details)
        messages_without_details = flagged_messages.exclude(id__in=messages_with_details)
        export_data += _build_plain_message_export_data(messages_without_details)

        headers = ['message_id', 'Connection ID', 'Message', 'Date', 'District', 'Rating', 'Replied', "Forwarded"]

        return ExcelResponse(data=export_data, headers=headers)

    if request.GET.get('capture', None):
        (s, _) = Settings.objects.get_or_create(attribute='aids')
        if s.value == 'true':
            s.value = 'false'
            s.save()
            reply = gettext('Start Capture')
        else:
            s.value = 'true'
            s.save()
            reply = gettext('Stop Capture')
        return HttpResponse(reply)

    if request.GET.get('ajax', None):
        return HttpResponse('success')

    if request.GET.get('rating', None):
        rating = request.GET.get('rating')
        descs = {
            '1': 'Requires Attention',
            '2': 'Moderate',
            '3': 'Important',
            '4': 'Urgent',
            '5': 'Very Urgent',
        }
        msg = Message.objects.get(pk=int(request.GET.get('msg')))
        (rate, _) = MessageAttribute.objects.get_or_create(name='rating'
        )
        det = MessageDetail.objects.create(message=msg, attribute=rate,
                                           value=rating, description=descs.get(rating, ''))
        response = \
            """<li><a href='javascript:void(0)'  class="rate%s"

        title="%s">%s</a></li>""" \
            % (rating, descs.get(rating, ''), descs.get(rating, ''))

        return HttpResponse(mark_safe(response))

    paginator = UreportPaginator(messages.order_by('-date'), 10, body=12, padding=2)
    page = request.GET.get('page', 1)
    try:
        messages = paginator.page(page)
    except (PageNotAnInteger, EmptyPage):
        messages = paginator.page(1)

    return render_to_response(template, {
        'name': name,
        'messages': messages,
        'paginator': paginator,
        'capture_status': capture_status,
        'rate': rate,
        'range_form': range_form,
    }, context_instance=RequestContext(request))
def alerts(request, pk):
    access = get_access(request)
    poll_form = NewPollForm()
    range_form = rangeForm()
    poll_form.updateTypes()
    assign_polls = Poll.objects.exclude(start_date=None).order_by('-pk')[0:5]
    district_form = DistrictForm(request.POST or None)
    if request.GET.get('reset_districts', None):
        request.session['districts'] = None
        request.session['groups'] = None

    if district_form.is_valid():
        request.session['districts'] = [c.pk for c in district_form.cleaned_data['districts']]

    groupform = AssignResponseGroupForm(request=request, access=access)
    if request.method == 'POST' and request.POST.get('groups', None):
        g_form = AssignResponseGroupForm(request.POST, request=request)
        if g_form.is_valid():
            request.session['groups'] = g_form.cleaned_data['groups']

    template = 'ureport/polls/alerts.html'
    if request.session.get('districts'):
        message_list = \
            Message.objects.filter(details__attribute__name='alert', direction='I',

            ).filter(connection__contact__reporting_location__in=request.session.get('districts'))
    else:
        message_list = Message.objects.filter(details__attribute__name='alert', direction='I')

    if request.session.get('groups', None):
        message_list = message_list.filter(connection__contact__groups__in=request.session.get('groups'
        ))

    if access:
        if access.assigned_messages.exists():
            message_list = access.assigned_messages.all()
        else:
            message_list = message_list.filter(connection__contact__groups__in=access.groups.all())

    (capture_status, _) = \
        Settings.objects.get_or_create(attribute='alerts')
    (rate, _) = MessageAttribute.objects.get_or_create(name='rating')

    # message_list=[Message.objects.latest('date')]
    # use more efficient count

    if request.GET.get('download', None):
        range_form = rangeForm(request.POST)
        if range_form.is_valid():
            tasks.export_alerts_task.delay(range_form, access, request.get_host(), request.user.username)
            return HttpResponseRedirect(reverse('alerts', args=[request.user.pk]))

    if request.GET.get('search', None):
        search = request.GET.get('search')
        if search[0] == '"' and search[-1] == '"':
            search = search[1:-1]
            message_list = message_list.filter(Q(text__iregex=".*\m(%s)\y.*"
                                                              % search)
                                               | Q(connection__contact__reporting_location__name__iregex=".*\m(%s)\y.*"
                                                                                                         % search)
                                               | Q(connection__pk__iregex=".*\m(%s)\y.*"
                                                                          % search))
        elif search[0] == "'" and search[-1] == "'":

            search = search[1:-1]
            message_list = message_list.filter(Q(text__iexact=search)
                                               | Q(connection__contact__reporting_location__name__iexact=search)
                                               | Q(connection__pk__iexact=search))
        elif search == "=numerical value()":
            message_list = message_list.filter(text__iregex="(-?\d+(\.\d+)?)")
        else:

            message_list = message_list.filter(Q(text__icontains=search)
                                               | Q(connection__contact__reporting_location__name__icontains=search)
                                               | Q(connection__pk__icontains=search))

    if request.GET.get('capture', None):
        (s, _) = Settings.objects.get_or_create(attribute='alerts')
        if s.value == 'true':
            s.value = 'false'
            s.save()
            reply = gettext('Start Capture')
        else:
            s.value = 'true'
            s.save()
            reply = gettext('Stop Capture')
        return HttpResponse(reply)
    if request.GET.get('ajax', None):
        if request.GET.get('ajax') == 'get_replied':
            date = datetime.datetime.now() - datetime.timedelta(seconds=4 * 60 * 60 * 30)
            msgs = Message.objects.filter(details__attribute__name='replied', direction='I', date__gte=date).values(
                'pk')
            return HttpResponse(simplejson.dumps(list(msgs)), content_type="application/json")
        date = datetime.datetime.now() - datetime.timedelta(seconds=30)
        prev = request.session.get('prev', [])
        msgs = Message.objects.filter(details__attribute__name='alert',
                                      direction='I'
        ).filter(date__gte=date).exclude(pk__in=prev)
        if access:
            msgs = msgs.filter(connection__contact__groups__in=access.groups.all())
        request.session['prev'] = list(msgs.values_list('pk',
                                                        flat=True))
        msgs_list = []
        if msgs:
            for msg in msgs:
                from django.template.loader import render_to_string

                can_view_number = request.user.has_perm('view_numbers')
                can_foward = request.user.has_perm('forward')
                row_rendered = \
                    render_to_string('ureport/partials/row.html',
                                     {'msg': msg, 'can_foward': can_foward, 'can_view_number': can_view_number,
                                      'assign_polls': assign_polls})

                m = {}
                m['text'] = msg.text
                m['date'] = str(msg.date.date())
                if msg.connection.contact:
                    m['name'] = msg.connection.contact.name
                else:
                    m['name'] = 'Anonymous User'
                m['number'] = msg.connection.identity
                if msg.connection.contact \
                        and msg.connection.contact.reporting_location:
                    m['district'] = \
                        msg.connection.contact.reporting_location.name
                else:
                    m['district'] = 'N/A'
                rating = msg.details.filter(attribute__name='alerts')
                if rating:
                    r = rating[0].value
                else:
                    r = 0
                m['row'] = row_rendered
                m['connection'] = msg.connection.pk
                m['pk'] = msg.pk
                msgs_list.append(m)
            return HttpResponse(mark_safe(simplejson.dumps(msgs_list)))
        else:
            return HttpResponse('success')
    if request.GET.get('rating', None):
        rating = request.GET.get('rating')
        descs = {
            '1': 'Requires Attention',
            '2': 'Moderate',
            '3': 'Important',
            '4': 'Urgent',
            '5': 'Very Urgent',
        }
        msg = Message.objects.get(pk=int(request.GET.get('msg')))
        (rate, _) = MessageAttribute.objects.get_or_create(name='rating')
        MessageDetail.objects.create(message=msg, attribute=rate,
                                           value=rating, description=descs.get(rating, ''))
        response = \
            """<li><a href='javascript:void(0)'  class="rate%s"

                            title="%s">%s</a></li>""" \
            % (rating, descs.get(rating, ''), descs.get(rating, ''))

        return HttpResponse(mark_safe(response))

    paginator = UreportPaginator(message_list.order_by('-date'), 10, body=12, padding=2)
    page = request.GET.get('page', 1)
    try:
        messages = paginator.page(page)
    except (PageNotAnInteger, EmptyPage):

        # If page is not an integer, deliver first page.

        messages = paginator.page(1)

    return render_to_response(template, {
        'messages': messages,
        'assign_polls': assign_polls,
        'paginator': paginator,
        'capture_status': capture_status,
        'rate': rate,
        'district_form': district_form,
        'range_form': range_form,
        'groupform': groupform,
        'access': access,
        'accesses': Access.objects.filter(user__username__startswith='GAPP'),
    }, context_instance=RequestContext(request))
Ejemplo n.º 22
0
def alerts(request):
    access = get_access(request)
    poll_form = NewPollForm()
    range_form = rangeForm()
    poll_form.updateTypes()
    assign_polls = Poll.objects.exclude(start_date=None).order_by('-pk')[0:5]
    district_form = DistrictForm(request.POST or None)
    if request.GET.get('reset_districts', None):
        request.session['districts'] = None
        request.session['groups'] = None

    if district_form.is_valid():
        request.session['districts'] = [
            c.pk for c in district_form.cleaned_data['districts']
        ]

    groupform = AssignResponseGroupForm(request=request, access=access)
    if request.method == 'POST' and request.POST.get('groups', None):
        g_form = AssignResponseGroupForm(request.POST, request=request)
        if g_form.is_valid():
            request.session['groups'] = g_form.cleaned_data['groups']

    template = 'ureport/polls/alerts.html'
    if request.session.get('districts'):
        message_list = \
            Message.objects.filter(details__attribute__name='alert'

            ).filter(connection__contact__reporting_location__in=request.session.get('districts'))
    else:
        message_list = Message.objects.filter(details__attribute__name='alert')

    if request.session.get('groups', None):
        message_list = message_list.filter(
            connection__contact__groups__in=request.session.get('groups'))

    if access:
        message_list = message_list.filter(
            connection__contact__groups__in=access.groups.all())
    (capture_status, _) = \
        Settings.objects.get_or_create(attribute='alerts')
    (rate, _) = MessageAttribute.objects.get_or_create(name='rating')

    # message_list=[Message.objects.latest('date')]
    # use more efficient count

    if request.GET.get('download', None) and access is None:
        range_form = rangeForm(request.POST)
        if range_form.is_valid():
            start = range_form.cleaned_data['startdate']
            end = range_form.cleaned_data['enddate']
            from django.core.servers.basehttp import FileWrapper

            cols = [
                "replied", "rating", "direction", "district", "date",
                "message", "id", "forwarded"
            ]
            data = AlertsExport.objects.filter(
                date__range=(start, end)).values_list(*cols).iterator()
            excel_file_path = \
                os.path.join(os.path.join(os.path.join(UREPORT_ROOT,
                                                       'static'), 'spreadsheets'),
                             'alerts.xlsx')
            ExcelResponse(data,
                          output_name=excel_file_path,
                          write_to_file=True,
                          headers=cols)
            response = HttpResponse(
                FileWrapper(open(excel_file_path)),
                content_type=
                'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
            )
            response[
                'Content-Disposition'] = 'attachment; filename=alerts.xlsx'
            from django import db

            db.reset_queries()
            response['Cache-Control'] = 'no-cache'
            return response

    if request.GET.get('search', None):
        search = request.GET.get('search')
        if search[0] == '"' and search[-1] == '"':
            search = search[1:-1]
            message_list = message_list.filter(
                Q(text__iregex=".*\m(%s)\y.*" % search)
                | Q(connection__contact__reporting_location__name__iregex=
                    ".*\m(%s)\y.*" % search)
                | Q(connection__pk__iregex=".*\m(%s)\y.*" % search))
        elif search[0] == "'" and search[-1] == "'":

            search = search[1:-1]
            message_list = message_list.filter(
                Q(text__iexact=search)
                |
                Q(connection__contact__reporting_location__name__iexact=search)
                | Q(connection__pk__iexact=search))
        elif search == "=numerical value()":
            message_list = message_list.filter(text__iregex="(-?\d+(\.\d+)?)")
        else:

            message_list = message_list.filter(
                Q(text__icontains=search)
                | Q(connection__contact__reporting_location__name__icontains=
                    search)
                | Q(connection__pk__icontains=search))

    if request.GET.get('capture', None):
        (s, _) = Settings.objects.get_or_create(attribute='alerts')
        if s.value == 'true':
            s.value = 'false'
            s.save()
            reply = 'Start Capture'
        else:
            s.value = 'true'
            s.save()
            reply = 'Stop Capture'
        return HttpResponse(reply)
    if request.GET.get('ajax', None):
        date = datetime.datetime.now() - datetime.timedelta(seconds=30)
        prev = request.session.get('prev', [])
        msgs = Message.objects.filter(
            details__attribute__name='alert',
            direction='I').filter(date__gte=date).exclude(pk__in=prev)
        if access:
            msgs = msgs.filter(
                connection__contact__groups__in=access.groups.all())
        request.session['prev'] = list(msgs.values_list('pk', flat=True))
        msgs_list = []
        if msgs:
            for msg in msgs:
                from django.template.loader import render_to_string

                can_view_number = request.user.has_perm('view_numbers')
                can_foward = request.user.has_perm('forward')
                row_rendered = \
                    render_to_string('ureport/partials/row.html',
                                     {'msg': msg, 'can_foward': can_foward, 'can_view_number': can_view_number,
                                      'assign_polls': assign_polls})

                m = {}
                m['text'] = msg.text
                m['date'] = str(msg.date.date())
                if msg.connection.contact:
                    m['name'] = msg.connection.contact.name
                else:
                    m['name'] = 'Anonymous User'
                m['number'] = msg.connection.identity
                if msg.connection.contact \
                    and msg.connection.contact.reporting_location:
                    m['district'] = \
                        msg.connection.contact.reporting_location.name
                else:
                    m['district'] = 'N/A'
                rating = msg.details.filter(attribute__name='alerts')
                if rating:
                    r = rating[0].value
                else:
                    r = 0
                m['row'] = row_rendered
                m['connection'] = msg.connection.pk
                m['pk'] = msg.pk
                msgs_list.append(m)
            return HttpResponse(mark_safe(simplejson.dumps(msgs_list)))
        else:
            return HttpResponse('success')
    if request.GET.get('rating', None):
        rating = request.GET.get('rating')
        descs = {
            '1': 'Requires Attention',
            '2': 'Moderate',
            '3': 'Important',
            '4': 'Urgent',
            '5': 'Very Urgent',
        }
        msg = Message.objects.get(pk=int(request.GET.get('msg')))
        (rate, _) = MessageAttribute.objects.get_or_create(name='rating')
        det = MessageDetail.objects.create(message=msg,
                                           attribute=rate,
                                           value=rating,
                                           description=descs.get(rating, ''))
        response = \
            """<li><a href='javascript:void(0)'  class="rate%s"

                            title="%s">%s</a></li>""" \
            % (rating, descs.get(rating, ''), descs.get(rating, ''))

        return HttpResponse(mark_safe(response))

    paginator = UreportPaginator(message_list.order_by('-date'),
                                 10,
                                 body=12,
                                 padding=2)
    page = request.GET.get('page', 1)
    try:
        messages = paginator.page(page)
    except (PageNotAnInteger, EmptyPage):

        # If page is not an integer, deliver first page.

        messages = paginator.page(1)

    return render_to_response(template, {
        'messages': messages,
        'assign_polls': assign_polls,
        'paginator': paginator,
        'capture_status': capture_status,
        'rate': rate,
        'district_form': district_form,
        'range_form': range_form,
        'groupform': groupform,
    },
                              context_instance=RequestContext(request))
Ejemplo n.º 23
0
def ureporters(request):
    access = get_access(request)
    download_form = DownloadForm(request.POST or None)
    if request.POST and request.POST.get("download", None):
        if download_form.is_valid():
            download_form.export(request, request.session["queryset"], "autoreg_join_date")
        else:
            return HttpResponse("Some thing went wrong")

    columns = [
        (_("Identifier"), True, "connection_pk", SimpleSorter()),
        (_("Age"), True, "age", SimpleSorter()),
        (_("Gender"), True, "gender", SimpleSorter()),
        (_("Language"), True, "language", SimpleSorter()),
        (_("District"), True, "district", SimpleSorter()),
        (_("Group(s)"), True, "group", SimpleSorter()),
        (_("Questions "), True, "questions", SimpleSorter()),
        (_("Responses "), True, "responses", SimpleSorter()),
        (_("Messages Sent"), True, "incoming", SimpleSorter()),
        (_("caregiver"), True, "is_caregiver", SimpleSorter()),
        (_("join date"), True, "autoreg_join_date", SimpleSorter()),
        (_("quit date"), True, "quit_date", SimpleSorter()),
    ]

    if request.user.is_staff:
        columns.insert(1, ("Phone", True, "mobile", SimpleSorter()))

    queryset = get_contacts2(request=request)
    if access is not None:
        groups = list(access.groups.values_list("name", flat=True))
        if len(groups) > 0:
            qset = Q(group__icontains=groups[0])
        if len(groups) > 1:
            for group in groups[1:]:
                qset = qset | Q(group__icontains=group)
        queryset = queryset.filter(qset)
    return generic(
        request,
        model=UreportContact,
        queryset=queryset,
        download_form=download_form,
        results_title=_("uReporters"),
        filter_forms=[
            UreporterSearchForm,
            GenderFilterForm,
            AgeFilterForm,
            MultipleDistictFilterForm,
            FilterGroupsForm,
        ],
        action_forms=[
            MassTextForm,
            AssignGroupForm,
            BlacklistForm,
            AssignToNewPollForm,
            RemoveGroupForm,
            TemplateMessage,
        ],
        objects_per_page=25,
        partial_row="ureport/partials/contacts/contacts_row.html",
        base_template="ureport/ureporters_base.html",
        paginator_template="ureport/partials/new_pagination.html",
        paginator_func=ureport_paginate,
        columns=columns,
    )
Ejemplo n.º 24
0
def ureporters(request):
    access = get_access(request)
    print request.method
    message = ''
    if request.method == 'POST' and request.FILES:
        contactsform = ExcelTestUploadForm(request.POST, request.FILES)
        if contactsform.is_valid() and contactsform.good_file():
            new_file = contactsform.cleaned_data
            fields = [
                'number',
                'name',
                'province',
                'commune',
                'colline',
                'language',
                'county',
                'village',
                'birthdate',
                'group',
                'gender',
            ]
            message = handle_excel_file_update(new_file['excel_file'], fields)
            print(message)
            messages.success(request, message)
            return HttpResponseRedirect("/reporter")

        else:
            return HttpResponse(
                content='The form is not valid. Resfresh this page')

    columns = [
        ('Identifier', True, 'connection_pk', SimpleSorter()),
        ('Modile', True, 'mobile', SimpleSorter()),
        (
            'Age',
            True,
            'age',
            SimpleSorter(),
        ),
        (
            'Gender',
            True,
            'gender',
            SimpleSorter(),
        ),
        (
            'Language',
            True,
            'language',
            SimpleSorter(),
        ),
        (
            'Province',
            True,
            'province',
            SimpleSorter(),
        ),
        (
            'Group(s)',
            True,
            'group',
            SimpleSorter(),
        ),
        (
            'Polls ',
            True,
            'questions',
            SimpleSorter(),
        ),
        (
            'Responses ',
            True,
            'responses',
            SimpleSorter(),
        ),
        (
            'Messages Sent',
            True,
            'incoming',
            SimpleSorter(),
        ),
        #        ('caregiver', True, 'is_caregiver', SimpleSorter(),),
        #        ('join date', True, 'autoreg_join_date', SimpleSorter(),),
        #        ('quit date', True, 'quit_date', SimpleSorter(),),
    ]
    queryset = get_contacts2(request=request)
    if access is not None:
        groups = ",".join(list(access.groups.values_list('name', flat=True)))
        queryset = queryset.filter(group__icontains=groups)
    return generic(
        request,
        model=UreportContact,
        queryset=get_contacts2,
        contactsform=ExcelTestUploadForm,
        message=message,
        results_title='uReporters',
        filter_forms=[
            UreporterSearchForm, GenderFilterForm, AgeFilterForm,
            MultipleDistictFilterForm, FilterGroupsForm, FilterByGroupForm,
            FilterByLocationForm
        ],
        action_forms=[
            MassTextForm, AssignGroupForm, BlacklistForm, AssignToNewPollForm,
            RemoveGroupForm, TemplateMessage, ExportToExcelForm
        ],
        objects_per_page=25,
        base_template='ureport/ureporters_base.html',
        partial_base='ureport/partials/contacts/partial_base.html',
        partial_row='ureport/partials/contacts/partial_row.html',
        paginator_template='ureport/partials/new_pagination.html',
        paginator_func=ureport_paginate,
        columns=columns,
    )
def a_dashboard(request, name):
    poll_form = NewPollForm()
    range_form = rangeForm()
    poll_form.updateTypes()
    template = 'ureport/aids_dashboard.html'

    (capture_status, _) = \
        Settings.objects.get_or_create(attribute='aids')
    (rate, _) = MessageAttribute.objects.get_or_create(name='rating')
    name = name.replace("_", " ")
    flag = get_object_or_404(Flag, name=name)
    access = get_access(request)
    if access is not None and flag not in access.flags.all():
        return render(request, '403.html', status=403)
    flagged_messages = Message.objects.filter(flags__flag=flag) \
        .select_related('connection__contact__reporting_location').order_by('-date')
    responses = Message.objects.filter(
        pk__in=flag.flagtracker_set.exclude(response=None).values_list("response", flat=True)
    ).select_related('connection__contact__reporting_location')

    messages = flagged_messages | responses

    if request.GET.get('download', None):
        message_details = MessageDetail.objects.filter(message__id__in=flagged_messages.values_list('id', flat=True)) \
            .order_by('message__id') \
            .select_related('message', 'attribute', 'message__connection__contact__reporting_location')

        export_data, messages_with_details = _build_report(message_details)
        messages_without_details = flagged_messages.exclude(id__in=messages_with_details)
        export_data += _build_plain_message_export_data(messages_without_details)

        headers = ['message_id', 'Connection ID', 'Message', 'Date', 'District', 'Rating', 'Replied', "Forwarded"]

        return ExcelResponse(data=export_data, headers=headers)

    if request.GET.get('capture', None):
        (s, _) = Settings.objects.get_or_create(attribute='aids')
        if s.value == 'true':
            s.value = 'false'
            s.save()
            reply = gettext('Start Capture')
        else:
            s.value = 'true'
            s.save()
            reply = gettext('Stop Capture')
        return HttpResponse(reply)

    if request.GET.get('ajax', None):
        return HttpResponse('success')

    if request.GET.get('rating', None):
        rating = request.GET.get('rating')
        descs = {
            '1': 'Requires Attention',
            '2': 'Moderate',
            '3': 'Important',
            '4': 'Urgent',
            '5': 'Very Urgent',
        }
        msg = Message.objects.get(pk=int(request.GET.get('msg')))
        (rate, _) = MessageAttribute.objects.get_or_create(name='rating'
                                                           )
        det = MessageDetail.objects.create(message=msg, attribute=rate,
                                           value=rating, description=descs.get(rating, ''))
        response = \
            """<li><a href='javascript:void(0)'  class="rate%s"

        title="%s">%s</a></li>""" \
            % (rating, descs.get(rating, ''), descs.get(rating, ''))

        return HttpResponse(mark_safe(response))

    paginator = UreportPaginator(messages.order_by('-date'), 10, body=12, padding=2)
    page = request.GET.get('page', 1)
    try:
        messages = paginator.page(page)
    except (PageNotAnInteger, EmptyPage):
        messages = paginator.page(1)

    return render_to_response(template, {
        'name': name,
        'messages': messages,
        'paginator': paginator,
        'capture_status': capture_status,
        'rate': rate,
        'range_form': range_form,
    }, context_instance=RequestContext(request))
def alerts(request, pk):
    access = get_access(request)
    poll_form = NewPollForm()
    range_form = rangeForm()
    poll_form.updateTypes()
    assign_polls = Poll.objects.exclude(start_date=None).order_by('-pk')[0:5]
    district_form = DistrictForm(request.POST or None)
    if request.GET.get('reset_districts', None):
        request.session['districts'] = None
        request.session['groups'] = None

    if district_form.is_valid():
        request.session['districts'] = [c.pk for c in district_form.cleaned_data['districts']]

    groupform = AssignResponseGroupForm(request=request, access=access)
    if request.method == 'POST' and request.POST.get('groups', None):
        g_form = AssignResponseGroupForm(request.POST, request=request)
        if g_form.is_valid():
            request.session['groups'] = g_form.cleaned_data['groups']

    template = 'ureport/polls/alerts.html'
    if request.session.get('districts'):
        message_list = \
            Message.objects.filter(details__attribute__name='alert', direction='I',

                                   ).filter(
                connection__contact__reporting_location__in=request.session.get('districts'))
    else:
        message_list = Message.objects.filter(details__attribute__name='alert', direction='I')

    if request.session.get('groups', None):
        message_list = message_list.filter(connection__contact__groups__in=request.session.get('groups'
                                                                                               ))

    if access:
        if access.assigned_messages.exists():
            message_list = access.assigned_messages.all()
        else:
            message_list = message_list.filter(connection__contact__groups__in=access.groups.all())

    (capture_status, _) = \
        Settings.objects.get_or_create(attribute='alerts')
    (rate, _) = MessageAttribute.objects.get_or_create(name='rating')

    # message_list=[Message.objects.latest('date')]
    # use more efficient count

    if request.GET.get('download', None):
        range_form = rangeForm(request.POST)
        if range_form.is_valid():
            tasks.export_alerts_task.delay(range_form, access, request.get_host(), request.user.username)
            return HttpResponseRedirect(reverse('alerts', args=[request.user.pk]))

    if request.GET.get('search', None):
        search = request.GET.get('search')
        if search[0] == '"' and search[-1] == '"':
            search = search[1:-1]
            message_list = message_list.filter(Q(text__iregex=".*\m(%s)\y.*"
                                                              % search)
                                               | Q(connection__contact__reporting_location__name__iregex=".*\m(%s)\y.*"
                                                                                                         % search)
                                               | Q(connection__pk__iregex=".*\m(%s)\y.*"
                                                                          % search))
        elif search[0] == "'" and search[-1] == "'":

            search = search[1:-1]
            message_list = message_list.filter(Q(text__iexact=search)
                                               | Q(connection__contact__reporting_location__name__iexact=search)
                                               | Q(connection__pk__iexact=search))
        elif search == "=numerical value()":
            message_list = message_list.filter(text__iregex="(-?\d+(\.\d+)?)")
        else:

            message_list = message_list.filter(Q(text__icontains=search)
                                               | Q(connection__contact__reporting_location__name__icontains=search)
                                               | Q(connection__pk__icontains=search))

    if request.GET.get('capture', None):
        (s, _) = Settings.objects.get_or_create(attribute='alerts')
        if s.value == 'true':
            s.value = 'false'
            s.save()
            reply = gettext('Start Capture')
        else:
            s.value = 'true'
            s.save()
            reply = gettext('Stop Capture')
        return HttpResponse(reply)
    if request.GET.get('ajax', None):
        if request.GET.get('ajax') == 'get_replied':
            date = datetime.datetime.now() - datetime.timedelta(seconds=4 * 60 * 60 * 30)
            msgs = Message.objects.filter(details__attribute__name='replied', direction='I', date__gte=date).values(
                'pk')
            return HttpResponse(simplejson.dumps(list(msgs)), content_type="application/json")
        date = datetime.datetime.now() - datetime.timedelta(seconds=30)
        prev = request.session.get('prev', [])
        msgs = Message.objects.filter(details__attribute__name='alert',
                                      direction='I'
                                      ).filter(date__gte=date).exclude(pk__in=prev)
        if access:
            msgs = msgs.filter(connection__contact__groups__in=access.groups.all())
        request.session['prev'] = list(msgs.values_list('pk',
                                                        flat=True))
        msgs_list = []
        if msgs:
            for msg in msgs:
                from django.template.loader import render_to_string

                can_view_number = request.user.has_perm('view_numbers')
                can_foward = request.user.has_perm('forward')
                row_rendered = \
                    render_to_string('ureport/partials/row.html',
                                     {'msg': msg, 'can_foward': can_foward, 'can_view_number': can_view_number,
                                      'assign_polls': assign_polls})

                m = {}
                m['text'] = msg.text
                m['date'] = str(msg.date.date())
                if msg.connection.contact:
                    m['name'] = msg.connection.contact.name
                else:
                    m['name'] = 'Anonymous User'
                m['number'] = msg.connection.identity
                if msg.connection.contact \
                        and msg.connection.contact.reporting_location:
                    m['district'] = \
                        msg.connection.contact.reporting_location.name
                else:
                    m['district'] = 'N/A'
                rating = msg.details.filter(attribute__name='alerts')
                if rating:
                    r = rating[0].value
                else:
                    r = 0
                m['row'] = row_rendered
                m['connection'] = msg.connection.pk
                m['pk'] = msg.pk
                msgs_list.append(m)
            return HttpResponse(mark_safe(simplejson.dumps(msgs_list)))
        else:
            return HttpResponse('success')
    if request.GET.get('rating', None):
        rating = request.GET.get('rating')
        descs = {
            '1': 'Requires Attention',
            '2': 'Moderate',
            '3': 'Important',
            '4': 'Urgent',
            '5': 'Very Urgent',
        }
        msg = Message.objects.get(pk=int(request.GET.get('msg')))
        (rate, _) = MessageAttribute.objects.get_or_create(name='rating')
        MessageDetail.objects.create(message=msg, attribute=rate,
                                     value=rating, description=descs.get(rating, ''))
        response = \
            """<li><a href='javascript:void(0)'  class="rate%s"

                            title="%s">%s</a></li>""" \
            % (rating, descs.get(rating, ''), descs.get(rating, ''))

        return HttpResponse(mark_safe(response))

    paginator = UreportPaginator(message_list.order_by('-date'), 10, body=12, padding=2)
    page = request.GET.get('page', 1)
    try:
        messages = paginator.page(page)
    except (PageNotAnInteger, EmptyPage):

        # If page is not an integer, deliver first page.

        messages = paginator.page(1)

    return render_to_response(template, {
        'messages': messages,
        'assign_polls': assign_polls,
        'paginator': paginator,
        'capture_status': capture_status,
        'rate': rate,
        'district_form': district_form,
        'range_form': range_form,
        'groupform': groupform,
        'access': access,
        'accesses': Access.objects.filter(user__username__startswith='GAPP'),
    }, context_instance=RequestContext(request))