Skip to content

Report

hypha.apply.projects.views.report

ReportingMixin

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/report.py
def dispatch(self, *args, **kwargs):
    project = self.get_object()
    if project.is_in_progress:
        if not hasattr(project, "report_config"):
            ReportConfig.objects.create(project=project)

    return super().dispatch(*args, **kwargs)

ReportAccessMixin

Bases: UserPassesTestMixin

model class-attribute instance-attribute

model = Report

test_func

test_func()
Source code in hypha/apply/projects/views/report.py
def test_func(self):
    if self.request.user.is_apply_staff:
        return True

    if self.request.user.is_finance:
        return True

    if self.request.user == self.get_object().project.user:
        return True

    return False

ReportDetailView

Bases: DetailView

model class-attribute instance-attribute

model = Report

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/report.py
def dispatch(self, *args, **kwargs):
    report = self.get_object()
    permission, _ = has_permission(
        "report_view", self.request.user, object=report, raise_exception=True
    )
    return super().dispatch(*args, **kwargs)

ReportUpdateView

Bases: UpdateView

form_class class-attribute instance-attribute

form_class = ReportEditForm

model class-attribute instance-attribute

model = Report

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/report.py
def dispatch(self, *args, **kwargs):
    report = self.get_object()
    permission, _ = has_permission(
        "report_update", self.request.user, object=report, raise_exception=True
    )
    return super().dispatch(*args, **kwargs)

get_initial

get_initial()
Source code in hypha/apply/projects/views/report.py
def get_initial(self):
    if self.object.draft:
        current = self.object.draft
    else:
        current = self.object.current

    if current:
        return {
            "public_content": current.public_content,
            "private_content": current.private_content,
            "file_list": current.files.all(),
        }

    return {}

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/projects/views/report.py
def get_form_kwargs(self):
    return {
        "user": self.request.user,
        **super().get_form_kwargs(),
    }

get_success_url

get_success_url()
Source code in hypha/apply/projects/views/report.py
def get_success_url(self):
    return self.object.project.get_absolute_url()

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/report.py
def form_valid(self, form):
    response = super().form_valid(form)

    should_notify = True
    if self.object.draft:
        # It was a draft submission
        should_notify = False
    else:
        if self.object.submitted != self.object.current.submitted:
            # It was a staff edit - post submission
            should_notify = False

    if should_notify:
        messenger(
            MESSAGES.SUBMIT_REPORT,
            request=self.request,
            user=self.request.user,
            source=self.object.project,
            related=self.object,
        )

    # Required for django-file-form: delete temporary files for the new files
    # that are uploaded.
    form.delete_temporary_files()
    return response

ReportPrivateMedia

Bases: ReportAccessMixin, PrivateMediaView

storage class-attribute instance-attribute

storage = PrivateStorage()

model class-attribute instance-attribute

model = Report

get

get(*args, **kwargs)
Source code in hypha/apply/utils/storage.py
def get(self, *args, **kwargs):
    file_to_serve = self.get_media(*args, **kwargs)
    return FileResponse(file_to_serve)

test_func

test_func()
Source code in hypha/apply/projects/views/report.py
def test_func(self):
    if self.request.user.is_apply_staff:
        return True

    if self.request.user.is_finance:
        return True

    if self.request.user == self.get_object().project.user:
        return True

    return False

dispatch

dispatch(*args, **kwargs)
Source code in hypha/apply/projects/views/report.py
def dispatch(self, *args, **kwargs):
    report_pk = self.kwargs["pk"]
    self.report = get_object_or_404(Report, pk=report_pk)
    file_pk = kwargs.get("file_pk")
    self.document = get_object_or_404(
        ReportPrivateFiles.objects, report__report=self.report, pk=file_pk
    )

    if not hasattr(self.document.report, "live_for_report"):
        # this is not a document in the live report
        # send the user to the report page to see latest version
        return redirect(self.report.get_absolute_url())

    return super().dispatch(*args, **kwargs)

get_media

get_media(*args, **kwargs)
Source code in hypha/apply/projects/views/report.py
def get_media(self, *args, **kwargs):
    return self.document.document

ReportSkipView

Bases: SingleObjectMixin, View

model class-attribute instance-attribute

model = Report

post

post(*args, **kwargs)
Source code in hypha/apply/projects/views/report.py
def post(self, *args, **kwargs):
    report = self.get_object()
    unsubmitted = not report.current
    not_current = report.project.report_config.current_due_report() != report
    if unsubmitted and not_current:
        report.skipped = not report.skipped
        report.save()
        messenger(
            MESSAGES.SKIPPED_REPORT,
            request=self.request,
            user=self.request.user,
            source=report.project,
            related=report,
        )
    return redirect(report.project.get_absolute_url())

ReportFrequencyUpdate

Bases: DelegatedViewMixin, UpdateView

form_class class-attribute instance-attribute

form_class = ReportFrequencyForm

context_name class-attribute instance-attribute

context_name = 'update_frequency_form'

model class-attribute instance-attribute

model = ReportConfig

setup

setup(request, *args, **kwargs)

Initialize attributes shared by all view methods.

Source code in hypha/apply/utils/views.py
def setup(self, request, *args, **kwargs):
    """Initialize attributes shared by all view methods."""
    self.request = request
    self.args = args
    self.kwargs = kwargs

get_template_names

get_template_names()
Source code in hypha/apply/utils/views.py
def get_template_names(self):
    return self.kwargs["template_names"]

get_form_name

get_form_name()
Source code in hypha/apply/utils/views.py
def get_form_name(self):
    return self.context_name

get_parent_kwargs

get_parent_kwargs()
Source code in hypha/apply/utils/views.py
def get_parent_kwargs(self):
    try:
        return self.parent.get_form_kwargs()
    except AttributeError:
        return self.kwargs["parent"].get_form_kwargs()

get_parent_object

get_parent_object()
Source code in hypha/apply/utils/views.py
def get_parent_object(self):
    return self.get_parent_kwargs()["instance"]

get_context_data

get_context_data(**kwargs)
Source code in hypha/apply/utils/views.py
def get_context_data(self, **kwargs):
    # Use the previous context but override the validated form
    form = kwargs.pop("form")
    kwargs.update(self.kwargs["context"])
    kwargs.update(**{self.context_name: form})
    return super().get_context_data(**kwargs)

is_model_form classmethod

is_model_form()
Source code in hypha/apply/utils/views.py
@classmethod
def is_model_form(cls):
    return issubclass(cls.form_class, ModelForm)

contribute_form

contribute_form(parent)
Source code in hypha/apply/utils/views.py
def contribute_form(self, parent):
    self.parent = parent

    # We do not want to bind any forms generated this way
    # pretend we are doing a get request to avoid passing data to forms
    old_method = None
    if self.request.method in ("POST", "PUT"):
        old_method = self.request.method
        self.request.method = "GET"

    form = self.get_form()

    if old_method:
        self.request.method = old_method
    return self.context_name, form

get_success_url

get_success_url()
Source code in hypha/apply/utils/views.py
def get_success_url(self):
    query = self.request.GET.urlencode()
    if query:
        query = "?" + query
    return self.request.path + query

get_form_kwargs

get_form_kwargs()
Source code in hypha/apply/projects/views/report.py
def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    kwargs.pop("user")
    project = kwargs["instance"]
    instance = project.report_config
    kwargs["instance"] = instance
    if not instance.disable_reporting:
        # Current due report can be none for ONE_TIME(does not repeat),
        # In case of ONE_TIME, either reporting is already completed(last_report exists)
        # or there should be a current_due_report.
        if instance.current_due_report():
            kwargs["initial"] = {
                "start": instance.current_due_report().end_date,
            }
        else:
            kwargs["initial"] = {
                "start": instance.last_report().end_date,
            }
    else:
        kwargs["initial"] = {
            "start": project.start_date,
        }
    return kwargs

get_object

get_object()
Source code in hypha/apply/projects/views/report.py
def get_object(self):
    project = self.get_parent_object()
    return project.report_config

get_form

get_form()
Source code in hypha/apply/projects/views/report.py
def get_form(self):
    if self.get_parent_object().is_in_progress:
        return super().get_form()
    return None

form_valid

form_valid(form)
Source code in hypha/apply/projects/views/report.py
def form_valid(self, form):
    config = form.instance
    # 'form-submitted-' is set as form_prefix in DelegateBase view
    if "disable-reporting" in self.request.POST.get(
        f"form-submitted-{self.context_name}"
    ):
        form.instance.disable_reporting = True
        form.instance.schedule_start = None
        response = super().form_valid(form)
        messenger(
            MESSAGES.DISABLED_REPORTING,
            request=self.request,
            user=self.request.user,
            source=config.project,
        )
    else:
        form.instance.disable_reporting = False
        form.instance.schedule_start = form.cleaned_data["start"]
        response = super().form_valid(form)
        messenger(
            MESSAGES.REPORT_FREQUENCY_CHANGED,
            request=self.request,
            user=self.request.user,
            source=config.project,
            related=config,
        )

    return response

ReportListView

Bases: SingleTableMixin, FilterView

queryset class-attribute instance-attribute

queryset = for_table()

filterset_class class-attribute instance-attribute

filterset_class = ReportListFilter

table_class class-attribute instance-attribute

table_class = ReportListTable

template_name class-attribute instance-attribute

template_name = 'application_projects/report_list.html'