def post(self, request, form_code):
        manager = get_database_manager(request.user)
        feeds_dbm = get_feeds_database(request.user)
        project_id = request.GET["project_id"]
        project = Project.load(manager.database, project_id)
        form_model = get_form_model_by_code(manager, form_code)
        user_profile = NGOUserProfile.objects.get(user=request.user)
        organization = Organization.objects.get(org_id=user_profile.org_id)
        submission_importer = SubmissionImporter(
            manager, feeds_dbm, request.user, form_model, project,
            SubmissionQuotaService(organization))
        response = submission_importer.import_submission(request)

        return HttpResponse(
            json.dumps({
                "success":
                self._successful(response),
                "question_map":
                self._get_question_code_map(form_model, request),
                "success_submissions":
                response.saved_entries,
                "errored_submission_details":
                response.errored_entrie_details,
                "message":
                response.message,
                "total_submissions":
                response.total_submissions,
                "quota_over":
                self._is_submission_quota_over(response)
            }))
Esempio n. 2
0
def feed_entries(request, form_code):
    user = request.user
    try:
        if not settings.FEEDS_ENABLED:
            return HttpResponse(404)
        if invalid_date(request.GET.get('start_date')):
            return convert_to_json_response(
                {"ERROR_CODE": 102, "ERROR_MESSAGE": 'Invalid Start Date provided'}, 400)
        if invalid_date(request.GET.get('end_date')):
            return convert_to_json_response(
                {"ERROR_CODE": 102, "ERROR_MESSAGE": 'Invalid End Date provided'}, 400)
        if lesser_end_date(request.GET.get('end_date'), request.GET.get('start_date')):
            return convert_to_json_response(
                {"ERROR_CODE": 103, "ERROR_MESSAGE": 'End Date provided is less than Start Date'}, 400)
        if _invalid_form_code(request, form_code):
            return convert_to_json_response({"ERROR_CODE": 101, "ERROR_MESSAGE": 'Invalid form code provided'}, 400)

        dbm = get_database_manager(user)
        form_model = get_form_model_by_code(dbm, form_code)
        questionnaire_id = form_model.id
        if user.is_ngo_admin() or user.is_extended_user() or \
                (user.is_project_manager() and has_permission(dbm, user.id, questionnaire_id)):
            feed_dbm = get_feeds_database(request.user)
            start_date = _parse_date(request.GET['start_date'])
            end_date = _parse_date(request.GET['end_date'])
            return HttpResponse(stream_feeds(feed_dbm, startkey=[form_code, start_date], endkey=[form_code, end_date]),
                                content_type='application/json; charset=utf-8')

        return convert_to_json_response({"ERROR_CODE": 104, "ERROR_MESSAGE": "You don't have access to this feed"}, 403)
    except Exception as e:
        logger = logging.getLogger('datawinners')
        logger.exception(e)
        return HttpResponse(content='Internal Server Error', status=500)
Esempio n. 3
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)
    survey_response_ids = get_survey_response_ids_from_request(dbm, request, questionnaire)
    received_times = []
    for survey_response_id in survey_response_ids:
        survey_response = SurveyResponse.get(dbm, survey_response_id)
        received_times.append(datetime.datetime.strftime(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, survey_response.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 records have been deleted"), 'success': True})
    else:
        response = encode_json({'error_message': ugettext("No records deleted"), 'success': False})

    return HttpResponse(response)
Esempio n. 4
0
 def _purge_feed_documents(self, questionnaire, request):
     feed_dbm = get_feeds_database(request.user)
     rows = feed_dbm.view.questionnaire_feed(
         startkey=[questionnaire.form_code],
         endkey=[questionnaire.form_code, {}],
         include_docs=True)
     for row in rows:
         feed_dbm.database.delete(row['doc'])
Esempio n. 5
0
 def __init__(self, request, project_id=None):
     self.request = request
     self.manager = get_database_manager(self.request.user)
     self.questionnaire = Project.get(self.manager, project_id)
     self.form_code = self.questionnaire.form_code
     self.feeds_dbm = get_feeds_database(request.user)
     self.is_data_sender = self.request.user.get_profile().reporter
     self.disable_link_class, self.hide_link_class = get_visibility_settings_for(
         self.request.user)
Esempio n. 6
0
 def __init__(self, request, project_id=None):
     self.request = request
     self.manager = get_database_manager(self.request.user)
     self.project = Project.load(self.manager.database, project_id)
     self.form_model = FormModel.get(self.manager, self.project.qid)
     self.form_code = self.form_model.form_code
     self.feeds_dbm = get_feeds_database(request.user)
     self.subject_field_creator = SubjectQuestionFieldCreator(self.manager, self.project)
     self.is_data_sender = self.request.user.get_profile().reporter
     self.disable_link_class, self.hide_link_class = get_visibility_settings_for(self.request.user)
Esempio n. 7
0
def submission(request):
    if request.method != 'POST':
        response = HttpResponse(status=204)
        response['Location'] = request.build_absolute_uri()
        return response

    send_to_carbon(create_path('submissions.smartphone'), 1)
    request_user = request.user
    submission_file = request.FILES.get("xml_submission_file").read()
    manager = get_database_manager(request_user)

    if not __authorized_to_make_submission_on_requested_form(request_user, submission_file, manager) \
            or is_quota_reached(request):
        response = HttpResponse(status=403)
        return response

    player = XFormPlayerV2(manager, get_feeds_database(request_user))
    try:
        user_profile = NGOUserProfile.objects.get(user=request_user)
        mangrove_request = Request(
            message=submission_file,
            transportInfo=TransportInfo(transport=SMART_PHONE,
                                        source=request_user.email,
                                        destination=''),
            media=request.FILES if len(request.FILES) > 1 else [])

        response = player.add_survey_response(mangrove_request,
                                              user_profile.reporter_id,
                                              logger=sp_submission_logger)
        mail_feed_errors(response, manager.database_name)
        if response.errors:
            logger.error("Error in submission : \n%s" %
                         get_errors(response.errors))
            return HttpResponseBadRequest()

    except MediaAttachmentNotFoundException as me:
        _send_media_error_mail(request, request_user, user_profile, me.message)
        return HttpResponseBadRequest()

    except Exception as e:
        logger.exception("Exception in submission : \n%s" % e)
        return HttpResponseBadRequest()

    organization = Organization.objects.get(org_id=user_profile.org_id)
    organization.increment_message_count_for(incoming_sp_count=1)

    check_quotas_and_update_users(organization)
    response = HttpResponse(status=201)
    response['Location'] = request.build_absolute_uri(request.path)
    return response
Esempio n. 8
0
def activate_project(request, project_id=None):
    manager = get_database_manager(request.user)
    project = Project.load(manager.database, project_id)
    project.activate(manager)
    form_model = FormModel.get(manager, project.qid)
    oneDay = datetime.timedelta(days=1)
    tomorrow = datetime.datetime.now() + oneDay
    survey_responses = get_survey_responses(manager, form_model.form_code, from_time=0,
                                            to_time=int(mktime(tomorrow.timetuple())) * 1000, page_size=None)
    feeds_dbm = get_feeds_database(request.user)
    service = SurveyResponseService(manager, logger, feeds_dbm)
    additional_feed_dictionary = get_project_details_dict_for_feed(project)
    for survey_response in survey_responses:
        service.delete_survey(survey_response, additional_feed_dictionary)
    UserActivityLog().log(request, action=ACTIVATED_PROJECT, project=project.name)
    return HttpResponseRedirect(reverse('project-overview', args=[project_id]))
Esempio n. 9
0
 def __init__(self, request):
     self.request = request
     self.request_user = request.user
     self.manager = get_database_manager(self.request_user)
     self.player = XFormPlayerV2(self.manager, get_feeds_database(self.request_user))
     self.xml_submission_file = request.POST['form_data']
     self.retain_files = request.POST['retain_files'].split(',') if request.POST.get('retain_files') else None
     self.add_preview_files()
     self.user_profile = NGOUserProfile.objects.get(user=self.request_user)
     self.mangrove_request = Request(message=self.xml_submission_file, media=request.FILES,
         retain_files=self.retain_files,
         transportInfo=
         TransportInfo(transport=WEB,
             source=self.request_user.email,
             destination=''
         ))
     self.organization = Organization.objects.get(org_id=self.user_profile.org_id)
Esempio n. 10
0
def feed_entries(request, form_code):
    try:
        if not settings.FEEDS_ENABLED:
            return HttpResponse(404)
        if invalid_date(request.GET.get('start_date')):
            return convert_to_json_response(
                {
                    "ERROR_CODE": 102,
                    "ERROR_MESSAGE": 'Invalid Start Date provided'
                }, 400)
        if invalid_date(request.GET.get('end_date')):
            return convert_to_json_response(
                {
                    "ERROR_CODE": 102,
                    "ERROR_MESSAGE": 'Invalid End Date provided'
                }, 400)
        if lesser_end_date(request.GET.get('end_date'),
                           request.GET.get('start_date')):
            return convert_to_json_response(
                {
                    "ERROR_CODE": 103,
                    "ERROR_MESSAGE":
                    'End Date provided is less than Start Date'
                }, 400)
        if _invalid_form_code(request, form_code):
            return convert_to_json_response(
                {
                    "ERROR_CODE": 101,
                    "ERROR_MESSAGE": 'Invalid form code provided'
                }, 400)

        feed_dbm = get_feeds_database(request.user)
        start_date = _parse_date(request.GET['start_date'])
        end_date = _parse_date(request.GET['end_date'])
        return HttpResponse(stream_feeds(feed_dbm,
                                         startkey=[form_code, start_date],
                                         endkey=[form_code, end_date]),
                            content_type='application/json; charset=utf-8')
    except Exception as e:
        logger = logging.getLogger('datawinners')
        logger.exception(e)
        return HttpResponse(content='Internal Server Error', status=500)
Esempio n. 11
0
def submission(request):
    if request.method != 'POST':
        response = HttpResponse(status=204)
        response['Location'] = request.build_absolute_uri()
        return response

    send_to_carbon(create_path('submissions.smartphone'), 1)
    request_user = request.user
    submission_file = request.FILES.get("xml_submission_file").read()
    manager = get_database_manager(request_user)

    if not __authorized_to_make_submission_on_requested_form(request_user, submission_file, manager) \
            or is_quota_reached(request):
        response = HttpResponse(status=403)
        return response

    player = XFormPlayerV2(manager, get_feeds_database(request_user))
    try:
        user_profile = NGOUserProfile.objects.get(user=request_user)
        mangrove_request = Request(
            message=submission_file,
            transportInfo=TransportInfo(transport=SMART_PHONE,
                                        source=request_user.email,
                                        destination=''),
            media=request.FILES if len(request.FILES) > 1 else [])
        form_code, values = XFormParser(manager).parse(
            mangrove_request.message)
        form_model = get_form_model_by_code(manager, form_code)

        if isinstance(
                form_model,
                EntityFormModel) and form_model.is_entity_registration_form:
            location_tree = LocationBridge(
                get_location_tree(), get_loc_hierarchy=get_location_hierarchy)
            response = player.add_subject(form_model, values, location_tree)
        else:
            response = player.add_survey_response(mangrove_request,
                                                  user_profile.reporter_id,
                                                  logger=sp_submission_logger)

        mail_feed_errors(response, manager.database_name)
        if response.errors:
            logger.error("Error in submission : \n%s" %
                         get_errors(response.errors))
            return HttpResponseBadRequest()

    except MediaAttachmentNotFoundException as me:
        _send_media_error_mail(request, request_user, user_profile, me.message)
        return HttpResponseBadRequest()

    except DataObjectAlreadyExists as doe:
        send_email_for_duplicate_unique_id_registration(
            request, doe.data[2], doe.data[1])
        return HttpResponseBadRequest()

    except Exception as e:
        logger.exception("Exception in submission : \n%s" % e)
        return HttpResponseBadRequest()

    organization = Organization.objects.get(org_id=user_profile.org_id)
    organization.increment_message_count_for(incoming_sp_count=1)

    check_quotas_and_update_users(organization)
    response = HttpResponse(status=201)
    response['Location'] = request.build_absolute_uri(request.path)
    return response
Esempio n. 12
0
def edit(request, project_id, survey_response_id, tab=0):
    manager = get_database_manager(request.user)
    questionnaire_form_model = Project.get(manager, project_id)
    dashboard_page = settings.HOME_PAGE + "?deleted=true"
    reporter_id = NGOUserProfile.objects.get(user=request.user).reporter_id
    is_linked = reporter_id in questionnaire_form_model.data_senders
    reporter_name = NGOUserProfile.objects.get(
        user=request.user).user.first_name
    if questionnaire_form_model.is_void():
        return HttpResponseRedirect(dashboard_page)

    disable_link_class, hide_link_class = get_visibility_settings_for(
        request.user)
    survey_response = get_survey_response_by_id(manager, survey_response_id)
    back_link = reverse(index,
                        kwargs={
                            "project_id": project_id,
                            "questionnaire_code":
                            questionnaire_form_model.form_code,
                            "tab": tab
                        })
    form_ui_model = build_static_info_context(
        manager,
        survey_response,
        questionnaire_form_model=questionnaire_form_model,
        reporter_id=reporter_id)
    form_ui_model.update({
        "back_link":
        back_link,
        'is_datasender':
        is_data_sender(request),
        'hide_change':
        questionnaire_form_model.is_poll
        and questionnaire_form_model.is_open_survey
    })
    data_sender = get_data_sender(manager, survey_response)
    short_code = data_sender[1]
    enable_datasender_edit = True if survey_response.owner_uid else False
    if request.method == 'GET':
        form_initial_values = construct_request_dict(survey_response,
                                                     questionnaire_form_model,
                                                     short_code)
        survey_response_form = SurveyResponseForm(
            questionnaire_form_model,
            form_initial_values,
            datasender_name=data_sender[0],
            reporter_id=reporter_id,
            reporter_name=reporter_name,
            enable_datasender_edit=enable_datasender_edit)

        form_ui_model.update(
            get_form_context(questionnaire_form_model, survey_response_form,
                             manager, hide_link_class, disable_link_class))
        form_ui_model.update({
            "redirect_url": "",
            "reporter_id": reporter_id,
            "is_linked": is_linked,
            "is_pro_sms": get_organization(request).is_pro_sms,
            "reporter_name": reporter_name
        })

        if not survey_response_form.is_valid(
        ) or form_ui_model['datasender_error_message']:
            error_message = _("Please check your answers below for errors.")
            form_ui_model.update({
                'error_message': error_message,
                "reporter_id": reporter_id,
                "is_linked": is_linked,
                "reporter_name": reporter_name
            })
        return render_to_response("project/web_questionnaire.html",
                                  form_ui_model,
                                  context_instance=RequestContext(request))

    if request.method == 'POST':
        send_to_carbon(create_path('submissions.web.simple'), 1)
        original_survey_response = survey_response.copy()
        is_errored_before_edit = True if survey_response.errors != '' else False
        submitted_values = request.POST
        owner_id = submitted_values.get("dsid")
        form_ui_model.update({
            "redirect_url":
            submitted_values.get("redirect_url"),
            'is_datasender':
            is_data_sender(request),
            "is_pro_sms":
            get_organization(request).is_pro_sms
        })
        form_ui_model.update(
            {"click_after_reload": submitted_values.get("click_after_reload")})
        if submitted_values.get("discard"):
            survey_response_form = SurveyResponseForm(questionnaire_form_model,
                                                      survey_response.values)

            form_ui_model.update(
                get_form_context(questionnaire_form_model,
                                 survey_response_form, manager,
                                 hide_link_class, disable_link_class))
            form_ui_model.update({
                "reporter_id": reporter_id,
                "is_linked": is_linked,
                "reporter_name": reporter_name
            })
            return render_to_response("project/web_questionnaire.html",
                                      form_ui_model,
                                      context_instance=RequestContext(request))
        else:
            form_initial_values = construct_request_dict(
                survey_response, questionnaire_form_model, short_code)
            if not owner_id:
                submitted_values = submitted_values.copy()
                submitted_values['dsid'] = form_initial_values['dsid']

            survey_response_form = SurveyResponseForm(
                questionnaire_form_model,
                submitted_values,
                initial=form_initial_values,
                enable_datasender_edit=enable_datasender_edit)

        form_ui_model.update(
            get_form_context(questionnaire_form_model, survey_response_form,
                             manager, hide_link_class, disable_link_class))
        form_ui_model.update({
            "reporter_id": reporter_id,
            "is_linked": is_linked
        })
        if not survey_response_form.is_valid():
            error_message = _("Please check your answers below for errors.")
            form_ui_model.update({
                'error_message': error_message,
                "reporter_id": reporter_id,
                "is_linked": is_linked
            })
            return render_to_response("project/web_questionnaire.html",
                                      form_ui_model,
                                      context_instance=RequestContext(request))

        success_message = _("Your changes have been saved.")
        form_ui_model.update({
            'success_message': success_message,
            "reporter_id": reporter_id,
            "is_linked": is_linked,
            "reporter_name": reporter_name
        })
        # if len(survey_response_form.changed_data) or is_errored_before_edit:
        created_request = helper.create_request(survey_response_form,
                                                request.user.username)

        additional_feed_dictionary = get_project_details_dict_for_feed(
            questionnaire_form_model)
        user_profile = NGOUserProfile.objects.get(user=request.user)
        feeds_dbm = get_feeds_database(request.user)
        response = WebPlayerV2(manager, feeds_dbm, user_profile.reporter_id) \
            .edit_survey_response(created_request, survey_response, owner_id,
                                  additional_feed_dictionary, websubmission_logger)
        mail_feed_errors(response, manager.database_name)
        if response.success:
            build_static_info_context(manager, survey_response, form_ui_model,
                                      questionnaire_form_model, reporter_id)
            ReportRouter().route(get_organization(request).org_id, response)
            _update_static_info_block_status(form_ui_model,
                                             is_errored_before_edit)
            log_edit_action(original_survey_response, survey_response, request,
                            questionnaire_form_model.name,
                            questionnaire_form_model)
            if submitted_values.get("redirect_url"):
                return HttpResponseRedirect(
                    submitted_values.get("redirect_url"))
        else:
            del form_ui_model["success_message"]
            survey_response_form._errors = helper.errors_to_list(
                response.errors, questionnaire_form_model.fields)
            form_ui_model.update({
                "reporter_id": reporter_id,
                "is_linked": is_linked,
                "reporter_name": reporter_name
            })
        return render_to_response("project/web_questionnaire.html",
                                  form_ui_model,
                                  context_instance=RequestContext(request))
def edit(request, project_id, survey_response_id, tab=0):
    manager = get_database_manager(request.user)
    project = Project.load(manager.database, project_id)
    questionnaire_form_model = FormModel.get(manager, project.qid)

    disable_link_class, hide_link_class = get_visibility_settings_for(
        request.user)
    survey_response = get_survey_response_by_id(manager, survey_response_id)
    back_link = reverse(index,
                        kwargs={
                            "project_id": project_id,
                            "questionnaire_code":
                            questionnaire_form_model.form_code,
                            "tab": tab
                        })
    form_ui_model = build_static_info_context(manager, survey_response)
    form_ui_model.update({"back_link": back_link})
    if request.method == 'GET':
        form_initial_values = construct_request_dict(survey_response,
                                                     questionnaire_form_model)
        survey_response_form = EditSubmissionForm(manager, project,
                                                  questionnaire_form_model,
                                                  form_initial_values)

        form_ui_model.update(
            get_form_context(questionnaire_form_model.form_code, project,
                             survey_response_form, manager, hide_link_class,
                             disable_link_class))
        form_ui_model.update({"redirect_url": ""})

        if not survey_response_form.is_valid():
            error_message = _("Please check your answers below for errors.")
            form_ui_model.update({'error_message': error_message})
        return render_to_response("project/web_questionnaire.html",
                                  form_ui_model,
                                  context_instance=RequestContext(request))

    if request.method == 'POST':
        original_survey_response = survey_response.copy()
        is_errored_before_edit = True if survey_response.errors != '' else False
        form_ui_model.update(
            {"redirect_url": request.POST.get("redirect_url")})
        form_ui_model.update(
            {"click_after_reload": request.POST.get("click_after_reload")})
        if request.POST.get("discard"):
            survey_response_form = EditSubmissionForm(
                manager, project, questionnaire_form_model,
                survey_response.values)

            form_ui_model.update(
                get_form_context(questionnaire_form_model.form_code, project,
                                 survey_response_form, manager,
                                 hide_link_class, disable_link_class))
            return render_to_response("project/web_questionnaire.html",
                                      form_ui_model,
                                      context_instance=RequestContext(request))
        else:
            survey_response_form = EditSubmissionForm(
                manager, project, questionnaire_form_model, request.POST)

        form_ui_model.update(
            get_form_context(questionnaire_form_model.form_code, project,
                             survey_response_form, manager, hide_link_class,
                             disable_link_class))
        if not survey_response_form.is_valid():
            error_message = _("Please check your answers below for errors.")
            form_ui_model.update({'error_message': error_message})
            return render_to_response("project/web_questionnaire.html",
                                      form_ui_model,
                                      context_instance=RequestContext(request))

        success_message = _("Your changes have been saved.")
        form_ui_model.update({'success_message': success_message})
        if len(survey_response_form.changed_data) or is_errored_before_edit:
            created_request = helper.create_request(survey_response_form,
                                                    request.user.username)

            additional_feed_dictionary = get_project_details_dict_for_feed(
                project)
            user_profile = NGOUserProfile.objects.get(user=request.user)
            feeds_dbm = get_feeds_database(request.user)
            if questionnaire_form_model.entity_type == ["reporter"]:
                owner_id = request.POST["eid"]
            else:
                owner_id = None
            response = WebPlayerV2(manager, feeds_dbm, user_profile.reporter_id) \
                .edit_survey_response(created_request, survey_response, owner_id,
                                      additional_feed_dictionary, websubmission_logger)
            mail_feed_errors(response, manager.database_name)
            if response.success:
                build_static_info_context(manager, survey_response,
                                          form_ui_model)
                ReportRouter().route(
                    get_organization(request).org_id, response)
                _update_static_info_block_status(form_ui_model,
                                                 is_errored_before_edit)
                log_edit_action(original_survey_response, survey_response,
                                request, project.name,
                                questionnaire_form_model)
                if request.POST.get("redirect_url"):
                    return HttpResponseRedirect(
                        request.POST.get("redirect_url"))
            else:
                del form_ui_model["success_message"]
                survey_response_form._errors = helper.errors_to_list(
                    response.errors, questionnaire_form_model.fields)
        return render_to_response("project/web_questionnaire.html",
                                  form_ui_model,
                                  context_instance=RequestContext(request))