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) }))
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)
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)
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'])
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)
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)
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
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]))
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)
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)
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
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))