示例#1
0
def export_count(request):
    if request.method == 'GET':
        return HttpResponse(status=405)

    submission_type = request.GET.get(u'type')
    post_body = json.loads(request.POST['data'])
    search_filters = post_body['search_filters']
    questionnaire_code = post_body['questionnaire_code']
    manager = get_database_manager(request.user)
    questionnaire = get_project_by_code(manager, questionnaire_code)
    organization = get_organization(request)
    local_time_delta = get_country_time_delta(organization.country)

    # the number_of_results limit will not be used for result-set size since scan-scroll api does not support it.
    # it is specified since the code-flow requires its value to be present

    query_params = {
        "search_filters": search_filters,
        "start_result_number": 0,
        "number_of_results": 4000,
        "order": "",
        "sort_field": "date"
    }

    search_text = search_filters.get("search_text", '')
    query_params.update({"search_text": search_text})
    query_params.update({"filter": submission_type})

    submission_count = get_submission_count(manager, questionnaire,
                                            query_params, local_time_delta)
    return HttpResponse(mimetype='application/json',
                        content=json.dumps({"count": submission_count}))
示例#2
0
def _create_export_artifact(form_model, manager, request, search_filters):
    # the number_of_results limit will not be used for result-set size since scan-scroll api does not support it.
    # it is specified since the code-flow requires its value to be present
    query_params = {
        "search_filters": search_filters,
        "start_result_number": 0,
        "number_of_results": 4000,
        "order": "",
        "sort_field": "date"
    }
    search_text = search_filters.get("search_text", '')
    submission_type = request.GET.get(u'type')
    query_params.update({"search_text": search_text})
    query_params.update({"filter": submission_type})
    is_media = False
    if request.POST.get('is_media') == u'true':
        is_media = True
    organization = get_organization(request)
    local_time_delta = get_country_time_delta(organization.country)
    project_name = request.POST.get(u"project_name")
    current_language = get_language()
    if form_model.xform:
        return _advanced_questionnaire_export(current_language, form_model,
                                              is_media, local_time_delta,
                                              manager, project_name,
                                              query_params, submission_type)

    return SubmissionExporter(form_model, project_name, manager, local_time_delta, current_language) \
        .create_excel_response(submission_type, query_params)
示例#3
0
def get_stats(request, form_code):
    dbm = get_database_manager(request.user)
    questionnaire = get_project_by_code(dbm, form_code)
    search_parameters = {}
    search_parameters.update({"start_result_number": 0})
    search_parameters.update({"number_of_results": 0})
    filter_type = "success"
    search_parameters.update({"filter": filter_type})

    search_parameters.update({"sort_field": "ds_id"})
    search_parameters.update(
        {"order": "-" if request.POST.get('sSortDir_0') == "desc" else ""})
    search_filters = json.loads(request.POST.get('search_filters'))
    search_parameters.update({"search_filters": search_filters})
    search_text = search_filters.get("search_text", '')
    search_parameters.update({"search_text": search_text})
    organization = get_organization(request)
    local_time_delta = get_country_time_delta(organization.country)
    # total success submission count irrespective of current fields being present or not
    facet_results, total_submissions = get_facets_for_choice_fields(
        dbm, questionnaire, search_parameters, local_time_delta)

    return HttpResponse(json.dumps({
        'result':
        create_statistics_response(facet_results, questionnaire),
        'total':
        total_submissions
    }),
                        content_type='application/json')
示例#4
0
def _get_failed_entries(organization,
                        display_start=0,
                        display_length=25,
                        sort_col=2,
                        sort_dir='asc'):
    header_dict = OrderedDict([('from_number', 'Data Sender'),
                               ('created_at', 'Submission Date'),
                               ('form_code', 'Questionnaire Code'),
                               ('message', 'SMS Text'),
                               ('error', 'Error message')])
    order = list(header_dict.keys())[sort_col - 1]
    total = DatawinnerLog.objects.filter(organization=organization).count()
    i_start = display_start
    if display_length == 0:
        i_end = total
    else:
        i_end = display_start + display_length
    if sort_dir == 'desc':
        order = '-' + order
    org_logs = DatawinnerLog.objects.filter(
        organization=organization).order_by(order)[i_start:i_end]
    #    import IPython
    #    IPython.embed()
    local_time_delta = get_country_time_delta(organization.country)
    for entry in org_logs:
        entry.created_at = convert_utc_to_localized(local_time_delta,
                                                    entry.created_at)

    org_logs_flat = org_logs.values_list('from_number', 'created_at',
                                         'form_code', 'message', 'error')
    return total, list(org_logs_flat)
示例#5
0
def _get_failed_entries(organization):
    org_logs = DatawinnerLog.objects.filter(
        organization=organization).order_by('-created_at')
    local_time_delta = get_country_time_delta(organization.country)
    for entry in org_logs:
        entry.created_at = convert_utc_to_localized(local_time_delta,
                                                    entry.created_at)
    return org_logs
示例#6
0
def _get_timezone_information(organization):
    timedelta = get_country_time_delta(organization.country)
    localized_time = convert_utc_to_localized(timedelta,
                                              datetime.datetime.utcnow())
    timedelta_as_string = "%s%.2d:%.2d" % (timedelta[0], timedelta[1],
                                           timedelta[2])
    return ugettext("GMT%s <span class='timezone-text'>  Now it is: %s</span>"
                    ) % (timedelta_as_string,
                         datetime.datetime.strftime(localized_time, "%H:%M"))
示例#7
0
def _get_all_criterias_from_request(request, form_code):
    dbm = get_database_manager(request.user)
    questionnaire = get_project_by_code(dbm, form_code)
    organization = get_organization(request)
    local_time_delta = get_country_time_delta(organization.country)
    pagination_params = _get_pagination_params(request)
    sort_params = _get_sorting_params(request)
    search_parameters = _get_search_params(request)
    return dbm, questionnaire, pagination_params, \
           local_time_delta, sort_params, search_parameters
示例#8
0
def projects_ajax(request):
    organization = get_organization(request)
    project_list = []
    rows = get_project_list(request)
    smart_phone_instruction_link = reverse("smart_phone_instruction")
    local_time_delta = get_country_time_delta(organization.country)
    for project in rows:
        project_list.append(
            _construct_project_dict(request.user, local_time_delta, project))
    project_list.sort(key=itemgetter('name'))

    return HttpResponse(mimetype='application/json',
                        content=json.dumps(project_list, default=json_serial))
示例#9
0
def index(request):
    organization = get_organization(request)
    page_heading = get_page_heading(request)
    hide_for_data_sender = 'none' if request.user.get_profile(
    ).reporter else ''
    rows = get_project_list(request)
    project_list = []
    smart_phone_instruction_link = reverse("smart_phone_instruction")
    local_time_delta = get_country_time_delta(organization.country)
    for project in rows:
        project_list.append(
            _construct_project_dict(request.user, local_time_delta, project))
    project_list.sort(key=itemgetter('name'))

    activation_success = request.GET.get('activation', False)

    error_messages = []
    if "associate" in request.GET.keys():
        error_messages = [
            _('You may have been dissociated from the project. Please contact your administrator for more details.'
              )
        ]
    if is_crs_admin(request):
        return render_to_response('alldata/index.html', {
            'projects': project_list,
            'page_heading': page_heading,
            'is_crs_admin': True,
            'project_links': get_alldata_project_links(),
            'is_quota_reached': is_quota_reached(request),
            'error_messages': error_messages,
            'is_pro_sms': organization.is_pro_sms,
            'activation_success': activation_success,
            'hide_for_data_sender': hide_for_data_sender,
            'current_lang': get_language()
        },
                                  context_instance=RequestContext(request))
    else:
        return render_to_response('alldata/index.html', {
            'projects': project_list,
            'page_heading': page_heading,
            'is_crs_admin': False,
            "smart_phone_instruction_link": smart_phone_instruction_link,
            'project_links': get_alldata_project_links(),
            'is_quota_reached': is_quota_reached(request),
            'error_messages': error_messages,
            'is_pro_sms': organization.is_pro_sms,
            'activation_success': activation_success,
            'hide_for_data_sender': hide_for_data_sender,
            'current_lang': get_language()
        },
                                  context_instance=RequestContext(request))
示例#10
0
def delete(request, project_id):
    dbm = get_database_manager(request.user)
    questionnaire = Project.get(dbm, project_id)
    dashboard_page = settings.HOME_PAGE + "?deleted=true"
    if questionnaire.is_void():
        return HttpResponseRedirect(dashboard_page)
    organization = get_organization(request)
    local_time_delta = get_country_time_delta(organization.country)
    survey_response_ids = get_survey_response_ids_from_request(
        dbm, request, questionnaire, local_time_delta)
    received_times = []
    for survey_response_id in survey_response_ids:
        survey_response = SurveyResponse.get(dbm, survey_response_id)
        received_times.append(
            datetime.datetime.strftime(
                convert_utc_to_localized(local_time_delta,
                                         survey_response.submitted_on),
                "%d/%m/%Y %X"))
        feeds_dbm = get_feeds_database(request.user)
        additional_feed_dictionary = get_project_details_dict_for_feed(
            questionnaire)
        delete_response = WebPlayerV2(dbm, feeds_dbm).delete_survey_response(
            survey_response, additional_feed_dictionary, websubmission_logger)
        mail_feed_errors(delete_response, dbm.database_name)
        if survey_response.data_record:
            ReportRouter().delete(
                get_organization(request).org_id, questionnaire.form_code,
                survey_response.data_record.id)

    if len(received_times):
        UserActivityLog().log(request,
                              action=DELETED_DATA_SUBMISSION,
                              project=questionnaire.name,
                              detail=json.dumps({
                                  "Date Received":
                                  "[%s]" % ", ".join(received_times)
                              }))
        response = encode_json({
            'success_message':
            ugettext("The selected submissions have been deleted"),
            'success':
            True
        })
    else:
        response = encode_json({
            'error_message': ugettext("No records deleted"),
            'success': False
        })

    return HttpResponse(response)
示例#11
0
def show_log(request):
    organization = get_organization(request)
    org_id = organization.org_id
    args = dict(organization=org_id)
    time_delta = get_country_time_delta(organization.country)
    if request.method == 'GET':
        form = LogFilterForm(request=request)
    else:
        form = LogFilterForm(request.POST, request=request)
        filter = form.data.copy()
        filter.pop("csrfmiddlewaretoken")
        for key, value in filter.items():
            if value != "":
                if key == "daterange":
                    dates = value.split(" %s " % ugettext("to"))
                    # args["log_date__gte"] = convert_dmy_to_ymd(dates[0])
                    args["log_date__gte"] = convert_local_to_utc(
                        dates[0] + " 00:00:00", time_delta,
                        "%d-%m-%Y %H:%M:%S")
                    try:
                        end_date = date.today()
                        if len(dates) > 1:
                            # end_date = convert_dmy_to_ymd(dates[1])
                            end_date = convert_local_to_utc(
                                dates[1] + " 23:59:59", time_delta,
                                "%d-%m-%Y %H:%M:%S")
                        else:
                            end_date = convert_local_to_utc(
                                dates[0] + " 23:59:59", time_delta,
                                "%d-%m-%Y %H:%M:%S")
                    except KeyError:
                        pass
                    args["log_date__lte"] = "%s" % end_date
                    continue
                args[key] = value
    log_data = UserActivityLog.objects.select_related().filter(
        **args).order_by("-log_date")
    for entry in log_data:
        entry.log_date = convert_utc_to_localized(time_delta, entry.log_date)
    return render_to_response(
        "activitylog/activitylog.html", {
            'form': form,
            'is_pro_sms': organization.is_pro_sms,
            'log_data': repr(encode_json([log.to_render()
                                          for log in log_data]))
        },
        context_instance=RequestContext(request))
示例#12
0
def export_subject(request):
    manager = get_database_manager(request.user)
    organization = get_organization(request)
    local_time_delta = get_country_time_delta(organization.country)
    current_language = get_language()
    subject_type = request.POST.get('subject_type', '').lower()
    project_name = subject_type
    form_model = get_form_model_by_entity_type(manager, [subject_type.lower()])
    query_params = {
        "start_result_number": 0,
        "number_of_results": 4000,
        "order": "",
        "filter": 'identification_number',
    }

    return SubmissionExporter(form_model, project_name, manager, local_time_delta, current_language, None) \
        .create_excel_response('identification_number', query_params)
示例#13
0
def get_submissions(request, form_code):
    dbm = get_database_manager(request.user)
    questionnaire = get_project_by_code(dbm, form_code)
    search_parameters = {}
    search_parameters.update(
        {"start_result_number": int(request.POST.get('iDisplayStart'))})
    search_parameters.update(
        {"number_of_results": int(request.POST.get('iDisplayLength'))})
    filter_type = request.GET['type']
    search_parameters.update({"filter": filter_type})

    search_parameters.update({
        "sort_field":
        _get_field_to_sort_on(request.POST, questionnaire, filter_type)
    })
    search_parameters.update(
        {"order": "-" if request.POST.get('sSortDir_0') == "desc" else ""})
    search_filters = json.loads(request.POST.get('search_filters'))
    search_parameters.update({"search_filters": search_filters})
    search_text = search_filters.get("search_text", '')
    search_parameters.update({"search_text": search_text})
    organization = get_organization(request)
    local_time_delta = get_country_time_delta(organization.country)
    search_results, query_fields = get_submissions_paginated(
        dbm, questionnaire, search_parameters, local_time_delta)
    submission_count_with_filters = get_submission_count(
        dbm, questionnaire, search_parameters, local_time_delta)
    submission_count_without_filters = get_submissions_without_user_filters_count(
        dbm, questionnaire, search_parameters)
    submissions = SubmissionQueryResponseCreator(
        questionnaire,
        local_time_delta).create_response(query_fields, search_results)

    return HttpResponse(jsonpickle.encode(
        {
            'data': submissions,
            'iTotalDisplayRecords': submission_count_with_filters,
            'iDisplayStart': int(request.POST.get('iDisplayStart')),
            "iTotalRecords": submission_count_without_filters,
            'iDisplayLength': int(request.POST.get('iDisplayLength'))
        },
        unpicklable=False),
                        content_type='application/json')
示例#14
0
def _get_slim_submission_paginated(request, project_uuid):
    dbm = get_database_manager(request.user)
    form_model = FormModel.get(dbm, project_uuid)
    length = int(request.GET.get('length', '10'))
    start = int(request.GET.get('start', '0'))
    search_text = request.GET.get('search_str')
    search_parameters = {}
    search_parameters.update({"start_result_number": start})
    search_parameters.update({"number_of_results": length})
    search_parameters.update({"filter": 'all'})
    search_parameters.update({"headers_for": 'all'})
    search_parameters.update(
        {'response_fields': ['ds_id', 'ds_name', 'date', 'status']})
    search_parameters.update({"sort_field": "date"})
    search_parameters.update({"order": "-"})
    search_filters = {
        "submissionDatePicker": "All Dates",
        "datasenderFilter": "",
        "search_text": search_text,
        "dateQuestionFilters": {},
        "uniqueIdFilters": {}
    }
    search_parameters.update({"search_filters": search_filters})
    search_parameters.update({"search_text": search_text})
    local_time_delta = get_country_time_delta('IN')
    search_results, query_fields = get_submissions_paginated(
        dbm, form_model, search_parameters, local_time_delta)
    submission_count_with_filters = get_submission_count(
        dbm, form_model, search_parameters, local_time_delta)
    submissions = SubmissionQueryResponseCreator(form_model, local_time_delta) \
                    .create_response(query_fields, search_results)
    return {
        'data': submissions,
        'headers': '',
        'total': submission_count_with_filters,
        'start': start,
        "search_count": len(submissions),
        'length': length
    }
示例#15
0
def show_log(request):
    organization = get_organization(request)
    org_id = organization.org_id
    args = dict(organization=org_id)
    time_delta = get_country_time_delta(organization.country)
    if request.method == 'GET':
        form = LogFilterForm(request=request)
    else:
        form = LogFilterForm(request.POST, request=request)
        filter = form.data.copy()
        filter.pop("csrfmiddlewaretoken")
        for key, value in filter.items():
            if value != "":
                if key == "daterange":
                    dates = value.split(" %s " % _("to"))
                    # args["log_date__gte"] = convert_dmy_to_ymd(dates[0])
                    args["log_date__gte"] = convert_local_to_utc(
                        dates[0] + " 00:00:00", time_delta,
                        "%d-%m-%Y %H:%M:%S")
                    try:
                        end_date = date.today()
                        if len(dates) > 1:
                            # end_date = convert_dmy_to_ymd(dates[1])
                            end_date = convert_local_to_utc(
                                dates[1] + " 23:59:59", time_delta,
                                "%d-%m-%Y %H:%M:%S")
                        else:
                            end_date = convert_local_to_utc(
                                dates[0] + " 23:59:59", time_delta,
                                "%d-%m-%Y %H:%M:%S")
                    except KeyError:
                        pass
                    args["log_date__lte"] = "%s" % end_date
                    continue
                args[key] = value
    log_data = UserActivityLog.objects.select_related().filter(
        **args).order_by("-log_date")
    for entry in log_data:
        entry.log_date = convert_utc_to_localized(time_delta, entry.log_date)
        action = entry.action
        if action == "Updated reminders":
            try:
                current_lang = get_language()
                activate(current_lang)
                details = json.loads(entry.detail)
                text_details = ""
                text_details += "<ul class='bulleted'>"
                for key, value in details.iteritems():
                    if value != "":
                        text_details += "<li>" + _(key) % value + "</li>"
                    else:
                        text_details += "<li>" + _(key) + "</li>"
                text_details += "</ul>"
                entry.detail = text_details
            except ValueError:
                entry.detail = _(entry.detail)

        if action == "Set Deadline":
            try:
                current_lang = get_language()
                activate(current_lang)
                entry.detail = _(entry.detail)

            except ValueError:
                entry.detail = _(entry.detail)

        if action == "Edited Data Submission(s) for advanced questionnaire":
            try:
                current_lang = get_language()
                activate(current_lang)
                details = json.loads(entry.detail)
                text_details = ""
                text_details += _("Changed Answers:")
                text_details += "<ul class='bulleted'>"
                for key, value in details.iteritems():
                    question = unicode(value['question'])
                    #if value['old'] and value['new']:
                    try:
                        old_data_value = str(value['old'].encode('UTF-8'))
                        new_data_value = str(value['new'].encode('UTF-8'))
                        text_details += '<li>' + question + ': "' + old_data_value.decode(
                            'UTF-8') + '" ' + _(
                                "to") + ' "' + new_data_value.decode(
                                    'UTF-8') + '"</li>'
                    #except :
                    #new_data_value = str(value['new'])
                    #text_details += '<li>'+ _("New node: ") + '</br>' + question + ':' + new_data_value +'"</li>'
                    #else :
                    #old_data_value = str(value['old'])
                    #text_details += '<li>'+ _("Delete node: ") + '</br>' + question + ':' + old_data_value +'"</li>'
                    except (ValueError, IndexError):
                        entry.detail = _(entry.detail)
                text_details += "</ul>"
                entry.detail = text_details

            except:
                entry.detail = _(entry.detail)
    return render_to_response(
        "activitylog/activitylog.html", {
            'form': form,
            'is_pro_sms': organization.is_pro_sms,
            'log_data': repr(encode_json([log.to_render()
                                          for log in log_data]))
        },
        context_instance=RequestContext(request))