예제 #1
0
class RssHistory(View):
    """RSS History Page Controller"""

    @redirect_if_not_installed
    def get(self, request):

        self.__correlation_id = request.META["X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__fg = FeedGenerator()
        self.__context = Context()
        self.__option_entity = OptionEntity()

        self.__context.autoload_options()
        self.__context.push({
            "page_title": self.__context.get("app_name", os.getenv("APP_NAME", "Silverback")),
            "is_authenticated": request.user and request.user.is_authenticated
        })

        self.__fg.id('http://silverbackhq.org')
        self.__fg.title('Some Testfeed')
        self.__fg.author({'name': 'John Doe', 'email': '*****@*****.**'})
        self.__fg.link(href='http://example.com', rel='alternate')
        self.__fg.logo('http://ex.com/logo.jpg')
        self.__fg.subtitle('This is a cool feed!')
        self.__fg.link(href='http://silverbackhq.org/test.atom', rel='self')
        self.__fg.language('en')

        return HttpResponse(self.__fg.atom_str(), content_type='text/xml')
예제 #2
0
class IncidentUpdateAdd(View):
    """Incident Update Add Page Controller"""

    template_name = 'templates/admin/incident/update/add.html'

    @login_if_not_authenticated
    def get(self, request, incident_id):
        self.__context = Context()
        self.__incident = IncidentModule()
        self.__incident_update = IncidentUpdateModule()
        self.__component = ComponentModule()
        self.__component_group = ComponentGroupModule()
        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        incident = self.__incident.get_one_by_id(incident_id)

        if not incident:
            raise Http404("Incident not found.")

        self.__context.autoload_options()
        self.__context.autoload_user(
            request.user.id if request.user.is_authenticated else None)
        self.__context.push({
            "page_title":
            _("Add Incident Update  · %s") % self.__context.get(
                "app_name", os.getenv("APP_NAME", "Silverback")),
            "incident":
            incident
        })

        return render(request, self.template_name, self.__context.get())
예제 #3
0
class Register(View):

    template_name = 'templates/register.html'
    __user = None
    __context = None
    __option_entity = None
    __correlation_id = None

    @redirect_if_not_installed
    @redirect_if_authenticated
    def get(self, request, token):

        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__user = UserModule()
        self.__context = Context()
        self.__option_entity = OptionEntity()

        if not self.__user.check_register_request(token):
            messages.error(
                request,
                _("Register token is expired or invalid, Please contact system administrator!"
                  ))
            return redirect("app.web.login")

        self.__context.autoload_options()
        self.__context.push({
            "page_title":
            _("Register · %s") % self.__context.get(
                "app_name", os.getenv("APP_NAME", "Silverback")),
            "register_request":
            self.__user.get_register_request_by_token(token)
        })

        return render(request, self.template_name, self.__context.get())
예제 #4
0
class SubscriberEdit(View):
    """Subscriber Edit Page Controller"""

    template_name = 'templates/admin/subscriber/edit.html'

    @login_if_not_authenticated
    def get(self, request, subscriber_id):

        self.__context = Context()
        self.__subscriber = SubscriberModule()
        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        subscriber = self.__subscriber.get_one_by_id(subscriber_id)

        if not subscriber:
            raise Http404("Subscriber not found.")

        self.__context.autoload_options()
        self.__context.autoload_user(
            request.user.id if request.user.is_authenticated else None)
        self.__context.push({
            "page_title":
            _("Edit Subscriber · %s") % self.__context.get(
                "app_name", os.getenv("APP_NAME", "Silverback")),
            "subscriber":
            subscriber
        })

        return render(request, self.template_name, self.__context.get())
예제 #5
0
class ResetPassword(View):
    """Reset Password Page Controller"""

    template_name = 'templates/reset_password.html'

    @redirect_if_not_installed
    @redirect_if_authenticated
    def get(self, request, token):

        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__reset_password_core = ResetPasswordModule()
        self.__context = Context()
        self.__option_entity = OptionEntity()

        self.__context.autoload_options()
        self.__context.push({
            "page_title":
            _("Reset Password · %s") % self.__context.get(
                "app_name", os.getenv("APP_NAME", "Silverback")),
            "reset_token":
            token
        })

        if not self.__reset_password_core.check_token(token):
            messages.error(
                request,
                _("Reset token is expired or invalid, Please request another token!"
                  ))
            return redirect("app.web.forgot_password")

        return render(request, self.template_name, self.__context.get())
예제 #6
0
파일: login.py 프로젝트: megamcloud/Kraven
class Login(View):

    template_name = 'templates/login.html'
    __context = None
    __option_entity = None

    @redirect_if_not_installed
    @redirect_if_authenticated
    def get(self, request):

        self.__context = Context()
        self.__option_entity = Option_Entity()

        self.__context.autoload_options()
        self.__context.push({
            "page_title":
            _("Login · %s") %
            self.__context.get("app_name", os.getenv("APP_NAME", "Kraven"))
        })

        if "redirect" in request.GET:
            self.__context.push({"redirect_url": request.GET["redirect"]})
        else:
            self.__context.push(
                {"redirect_url": reverse("app.web.admin.dashboard")})

        return render(request, self.template_name, self.__context.get())
예제 #7
0
class ComponentGroupEdit(View):
    """Component Group Edit Page Controller"""

    template_name = 'templates/admin/component_group/edit.html'

    @login_if_not_authenticated
    def get(self, request, group_id):

        self.__context = Context()
        self.__component_group = ComponentGroupModule()
        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        group = self.__component_group.get_one_by_id(group_id)

        if not group:
            raise Http404("Component group not found.")

        self.__context.autoload_options()
        self.__context.autoload_user(
            request.user.id if request.user.is_authenticated else None)
        self.__context.push({
            "page_title":
            _("Edit Component Group · %s") % self.__context.get(
                "app_name", os.getenv("APP_NAME", "Silverback")),
            "group":
            group
        })

        return render(request, self.template_name, self.__context.get())
예제 #8
0
def handler500(request, exception=None, template_name='templates/500.html'):
    correlation_id = request.META[
        "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
    helpers = Helpers()
    logger = helpers.get_logger(__name__)

    if exception is not None:
        logger.error(
            "Server Error: %(exception)s {'correlationId':'%(correlationId)s'}"
            % {
                "exception": exception,
                "correlationId": correlation_id
            })

    template_name = 'templates/500.html'

    context = Context()

    context.autoload_options()
    context.push({
        "page_title":
        _("500 · %s") %
        context.get("app_name", os.getenv("APP_NAME", "Silverback"))
    })

    return render(request, template_name, context.get(), status=500)
예제 #9
0
파일: login.py 프로젝트: Maxtasy/silverback
class Login(View):
    """Login Page Controller"""

    template_name = 'templates/login.html'

    @redirect_if_not_installed
    @redirect_if_authenticated
    def get(self, request):

        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__context = Context()
        self.__option_entity = OptionEntity()

        self.__context.autoload_options()
        self.__context.push({
            "page_title":
            _("Login · %s") %
            self.__context.get("app_name", os.getenv("APP_NAME", "Silverback"))
        })

        if "redirect" in request.GET:
            self.__context.push({"redirect_url": request.GET["redirect"]})
        else:
            self.__context.push(
                {"redirect_url": reverse("app.web.admin.dashboard")})

        return render(request, self.template_name, self.__context.get())
예제 #10
0
class MetricEdit(View):
    """Metric Edit Page Controller"""

    template_name = 'templates/admin/metric/edit.html'

    @login_if_not_authenticated
    def get(self, request, metric_id):

        self.__context = Context()
        self.__metric = MetricModule()
        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        metric = self.__metric.get_one_by_id(metric_id)

        if not metric:
            raise Http404("Metric not found.")

        self.__context.autoload_options()
        self.__context.autoload_user(
            request.user.id if request.user.is_authenticated else None)
        self.__context.push({
            "page_title":
            _("Edit Metric · %s") % self.__context.get(
                "app_name", os.getenv("APP_NAME", "Silverback")),
            "metric":
            metric
        })

        metric["data"] = json.loads(metric["data"])

        return render(request, self.template_name, self.__context.get())
예제 #11
0
def handler404(request, exception=None, template_name='templates/404.html'):
    """404 Error Page Controller"""

    correlation_id = request.META[
        "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
    helpers = Helpers()
    logger = helpers.get_logger(__name__)

    if exception is not None:
        logger.debug(
            "Route Not Found: %(exception)s {'correlationId':'%(correlationId)s'}"
            % {
                "exception": exception,
                "correlationId": correlation_id
            })

    template_name = 'templates/404.html'

    context = Context()

    context.autoload_options()
    context.push({
        "page_title":
        _("404 · %s") %
        context.get("app_name", os.getenv("APP_NAME", "Silverback"))
    })

    return render(request, template_name, context.get(), status=404)
예제 #12
0
class Reset_Password(View):

    template_name = 'templates/reset_password.html'
    __reset_password_core = None
    __context = None
    __option_entity = None

    @redirect_if_not_installed
    @redirect_if_authenticated
    def get(self, request, token):

        self.__reset_password_core = Reset_Password_Module()
        self.__context = Context()
        self.__option_entity = Option_Entity()

        self.__context.autoload_options()
        self.__context.push({
            "page_title": _("Reset Password · %s") % self.__context.get("app_name", os.getenv("APP_NAME", "Kraven")),
            "reset_token": token
        })

        if not self.__reset_password_core.check_token(token):
            messages.error(request, _("Reset token is expired or invalid, Please request another token!"))
            return redirect("app.web.forgot_password")

        return render(request, self.template_name, self.__context.get())
예제 #13
0
class IncidentList(View):
    """Incident List Page Controller"""

    template_name = 'templates/admin/incident/list.html'

    @login_if_not_authenticated
    def get(self, request):

        self.__context = Context()
        self.__incident = IncidentModule()
        self.__incident_update = IncidentUpdateModule()
        self.__component = ComponentModule()
        self.__component_group = ComponentGroupModule()
        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__context.autoload_options()
        self.__context.autoload_user(
            request.user.id if request.user.is_authenticated else None)
        self.__context.push({
            "page_title":
            _("Incidents · %s") %
            self.__context.get("app_name", os.getenv("APP_NAME", "Silverback"))
        })

        return render(request, self.template_name, self.__context.get())
예제 #14
0
class Dashboard(View):
    """Dashboard Page Controller"""

    template_name = 'templates/admin/dashboard.html'

    @login_if_not_authenticated
    def get(self, request):
        self.__context = Context()
        self.__dashboard = DashboardModule()
        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__context.autoload_options()
        self.__context.autoload_user(
            request.user.id if request.user.is_authenticated else None)
        self.__context.push({
            "page_title":
            _("Dashboard · %s") % self.__context.get(
                "app_name", os.getenv("APP_NAME", "Silverback")),
            "count": {
                "incidents":
                self.__dashboard.incidents_count(),
                "subscribers":
                self.__dashboard.subscribers_count(),
                "components":
                self.__dashboard.components_count(),
                "component_groups":
                self.__dashboard.component_groups_count(),
                "metrics":
                self.__dashboard.metrics_count(),
                "users":
                self.__dashboard.users_count(),
                "delivered_notifications":
                self.__dashboard.notifications_count("success"),
                "failed_notifications":
                self.__dashboard.notifications_count("failed")
            },
            "chart": {
                "subscribers":
                self.__dashboard.subscribers_chart(),
                "components":
                self.__dashboard.components_chart(),
                "delivered_notifications":
                self.__dashboard.notifications_chart("success", 14),
                "failed_notifications":
                self.__dashboard.notifications_chart("failed", 14),
                "incidents":
                self.__dashboard.incidents_chart()
            },
            "open_incidents":
            self.__dashboard.get_open_incidents(),
            "affected_components":
            self.__dashboard.get_affected_components()
        })

        return render(request, self.template_name, self.__context.get())
예제 #15
0
class StatusPageHistory(View):

    template_name = 'templates/status_page_history.html'
    __context = None
    __option_entity = None
    __status_page_module = None
    __correlation_id = None

    @redirect_if_not_installed
    def get(self, request, period):

        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__context = Context()
        self.__option_entity = OptionEntity()
        self.__status_page_module = StatusPageModule()

        period = int(period)

        if period < 1:
            raise Http404("History period not found.")

        data = self.__status_page_module.get_incidents_for_period(period)

        if not data:
            raise Http404("History period not found.")

        self.__context.autoload_options()
        self.__context.push({
            "page_title":
            self.__context.get("app_name", os.getenv("APP_NAME",
                                                     "Silverback")),
            "logo_url":
            self.__status_page_module.get_logo_url(),
            "favicon_url":
            self.__status_page_module.get_favicon_url(),
            "is_authenticated":
            request.user and request.user.is_authenticated,
            "prev_link":
            period + 1,
            "next_link":
            period - 1 if period > 1 else 0,
            "history_period":
            data["period"],
            "past_incidents":
            data["incidents"],
        })

        return render(request, self.template_name, self.__context.get())
예제 #16
0
class Home(View):

    template_name = 'templates/home.html'
    __context = None
    __option_entity = None

    @redirect_if_not_installed
    def get(self, request):

        self.__context = Context()
        self.__option_entity = Option_Entity()

        self.__context.autoload_options()
        self.__context.push({
            "page_title": self.__context.get("app_name", os.getenv("APP_NAME", "Kraven")),
            "is_authenticated": request.user and request.user.is_authenticated
        })

        return render(request, self.template_name, self.__context.get())
예제 #17
0
파일: not_found.py 프로젝트: Clivern/Kevin
def handler404(request, exception=None, template_name='templates/404.html'):

    helpers = Helpers()
    logger = helpers.get_logger(__name__)

    if exception != None:
        logger.debug("Route Not Found: %s" % exception)

    template_name = 'templates/404.html'

    context = Context()

    context.autoload_options()
    context.push({
        "page_title":
        _("404 · %s") % context.get("app_name", os.getenv("APP_NAME", "Kevin"))
    })

    return render(request, template_name, context.get(), status=404)
예제 #18
0
class Forgot_Password(View):

    template_name = 'templates/forgot_password.html'
    __context = None
    __option_entity = None

    @redirect_if_not_installed
    @redirect_if_authenticated
    def get(self, request):

        self.__context = Context()
        self.__option_entity = Option_Entity()

        self.__context.autoload_options()
        self.__context.push({
            "page_title": _("Forgot Password · %s") % self.__context.get("app_name", os.getenv("APP_NAME", "Kraven"))
        })

        return render(request, self.template_name, self.__context.get())
예제 #19
0
def handler500(request, exception=None, template_name='templates/500.html'):

    helpers = Helpers()
    logger = helpers.get_logger(__name__)

    if exception != None:
        logger.error("Server Error: %s" % exception)

    template_name = 'templates/500.html'

    context = Context()

    context.autoload_options()
    context.push({
        "page_title":
        _("500 · %s") % context.get("app_name", os.getenv("APP_NAME", "Kevin"))
    })

    return render(request, template_name, context.get(), status=500)
예제 #20
0
class StatusPageIndex(View):

    template_name = 'templates/status_page_index.html'
    __context = None
    __option_entity = None
    __status_page_module = None
    __correlation_id = None

    @redirect_if_not_installed
    def get(self, request):

        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__context = Context()
        self.__option_entity = OptionEntity()
        self.__status_page_module = StatusPageModule()

        self.__context.autoload_options()
        self.__context.push({
            "page_title":
            self.__context.get("app_name", os.getenv("APP_NAME",
                                                     "Silverback")),
            "is_authenticated":
            request.user and request.user.is_authenticated,
            "system_status":
            self.__status_page_module.get_system_status(),
            "about_site":
            self.__status_page_module.get_about_site(),
            "logo_url":
            self.__status_page_module.get_logo_url(),
            "favicon_url":
            self.__status_page_module.get_favicon_url(),
            "past_incidents":
            self.__status_page_module.get_past_incidents(7),
            "system_metrics":
            self.__status_page_module.get_system_metrics(),
            "services":
            self.__status_page_module.get_services()
        })

        return render(request, self.template_name, self.__context.get())
예제 #21
0
class Settings(View):
    """Settings Page Controller"""

    template_name = 'templates/admin/settings.html'

    @login_if_not_authenticated_or_no_permission("manage_settings")
    def get(self, request):

        self.__context = Context()
        self.__upgrade = Upgrade()
        self.__acl = ACL()
        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__context.autoload_options()
        self.__context.autoload_user(
            request.user.id if request.user.is_authenticated else None)
        self.__context.load_options({
            "app_name": "",
            "app_email": "",
            "app_url": "",
            "app_description": "",
            "google_analytics_account": "",
            "reset_mails_messages_count": "",
            "reset_mails_expire_after": "",
            "access_tokens_expire_after": "",
            "prometheus_token": "",
            "newrelic_api_key": ""
        })

        self.__context.push({
            "current": self.__upgrade.get_current_version(),
            "latest": self.__upgrade.get_latest_version()
        })

        self.__context.push({
            "page_title":
            _("Settings · %s") %
            self.__context.get("app_name", os.getenv("APP_NAME", "Silverback"))
        })

        return render(request, self.template_name, self.__context.get())
예제 #22
0
class MetricAdd(View):
    """Metric Add Page Controller"""

    template_name = 'templates/admin/metric/add.html'

    @login_if_not_authenticated
    def get(self, request):
        self.__context = Context()
        self.__metric = MetricModule()
        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__context.autoload_options()
        self.__context.autoload_user(
            request.user.id if request.user.is_authenticated else None)
        self.__context.push({
            "page_title":
            _("Add a Metric · %s") %
            self.__context.get("app_name", os.getenv("APP_NAME", "Silverback"))
        })

        return render(request, self.template_name, self.__context.get())
예제 #23
0
class ForgotPassword(View):

    template_name = 'templates/forgot_password.html'
    __context = None
    __option_entity = None
    __correlation_id = None

    @redirect_if_not_installed
    @redirect_if_authenticated
    def get(self, request):

        self.__correlation_id = request.META["X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__context = Context()
        self.__option_entity = OptionEntity()

        self.__context.autoload_options()
        self.__context.push({
            "page_title": _("Forgot Password · %s") % self.__context.get("app_name", os.getenv("APP_NAME", "Silverback"))
        })

        return render(request, self.template_name, self.__context.get())
예제 #24
0
class StatusPageSingle(View):

    template_name = 'templates/status_page_single.html'
    __context = None
    __option_entity = None
    __status_page_module = None
    __correlation_id = None

    @redirect_if_not_installed
    def get(self, request, uri):

        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__context = Context()
        self.__option_entity = OptionEntity()
        self.__status_page_module = StatusPageModule()

        incident = self.__status_page_module.get_incident_by_uri(uri)

        if not incident:
            raise Http404("Incident not found.")

        self.__context.autoload_options()
        self.__context.push({
            "page_title":
            self.__context.get("app_name", os.getenv("APP_NAME",
                                                     "Silverback")),
            "logo_url":
            self.__status_page_module.get_logo_url(),
            "favicon_url":
            self.__status_page_module.get_favicon_url(),
            "is_authenticated":
            request.user and request.user.is_authenticated,
            "uri":
            uri,
            "incident":
            incident
        })

        return render(request, self.template_name, self.__context.get())
예제 #25
0
파일: user.py 프로젝트: Maxtasy/silverback
class UserAdd(View):
    """User Add Page Controller"""

    template_name = 'templates/admin/user/add.html'

    @login_if_not_authenticated_or_no_permission("manage_settings")
    def get(self, request):

        self.__context = Context()
        self.__user = UserModule()
        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__context.autoload_options()
        self.__context.autoload_user(
            request.user.id if request.user.is_authenticated else None)
        self.__context.push({
            "page_title":
            _("Add a User · %s") %
            self.__context.get("app_name", os.getenv("APP_NAME", "Silverback"))
        })

        return render(request, self.template_name, self.__context.get())
예제 #26
0
class Notification(View):
    """Notification List Page Controller"""

    template_name = 'templates/admin/notification.html'

    @login_if_not_authenticated
    def get(self, request):

        self.__context = Context()
        self.__acl = ACL()
        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__context.autoload_options()
        self.__context.autoload_user(
            request.user.id if request.user.is_authenticated else None)

        self.__context.push({
            "page_title":
            _("Notification · %s") %
            self.__context.get("app_name", os.getenv("APP_NAME", "Silverback"))
        })

        return render(request, self.template_name, self.__context.get())
예제 #27
0
class Builder(View):
    """Builder Page Controller"""

    template_name = 'templates/admin/builder.html'

    @login_if_not_authenticated_or_no_permission("manage_settings")
    def get(self, request):

        self.__context = Context()
        self.__metric = MetricModule()
        self.__component = ComponentModule()
        self.__component_group = ComponentGroupModule()
        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        self.__context.autoload_options()
        self.__context.autoload_user(
            request.user.id if request.user.is_authenticated else None)
        self.__context.load_options({
            "builder_headline": "",
            "builder_favicon_url": "",
            "builder_logo_url": "",
            "builder_about": "",
            "builder_components": json.dumps([]),
            "builder_metrics": json.dumps([])
        })
        self.__context.push({
            "page_title":
            _("Status Page Builder · %s") % self.__context.get(
                "app_name", os.getenv("APP_NAME", "Silverback")),
            "groups":
            self.__format_groups(self.__component.get_all_groups()),
            "components":
            self.__format_components(self.__component.get_all()),
            "metrics":
            self.__format_metrics(self.__metric.get_all())
        })

        self.__context.push({
            "builder_components":
            json.loads(str(self.__context.get("builder_components"))),
            "builder_metrics":
            json.loads(str(self.__context.get("builder_metrics")))
        })

        return render(request, self.template_name, self.__context.get())

    def __format_components(self, components):
        components_list = []

        for component in components:
            components_list.append({
                "id": "c-%d" % component.id,
                "name": component.name
            })

        return components_list

    def __format_groups(self, groups):
        groups_list = []

        for group in groups:
            groups_list.append({"id": "g-%d" % group.id, "name": group.name})

        return groups_list

    def __format_metrics(self, metrics):
        metrics_list = []

        for metric in metrics:
            metrics_list.append({
                "id": "m-%d" % metric.id,
                "title": metric.title
            })

        return metrics_list
예제 #28
0
class IncidentUpdateView(View):
    """Incident Update View Page Controller"""

    template_name = 'templates/admin/incident/update/view.html'

    @login_if_not_authenticated
    def get(self, request, incident_id, update_id):

        self.__context = Context()
        self.__incident = IncidentModule()
        self.__incident_update = IncidentUpdateModule()
        self.__incident_update_component = IncidentUpdateComponentModule()
        self.__component = ComponentModule()
        self.__component_group = ComponentGroupModule()
        self.__incident_update_notification = IncidentUpdateNotificationModule(
        )
        self.__correlation_id = request.META[
            "X-Correlation-ID"] if "X-Correlation-ID" in request.META else ""
        incident = self.__incident.get_one_by_id(incident_id)

        if not incident:
            raise Http404("Incident not found.")

        update = self.__incident_update.get_one_by_id(update_id)

        if not update:
            raise Http404("Incident update not found.")

        update["datetime"] = update["datetime"].strftime("%b %d %Y %H:%M:%S")
        update["message"] = markdown2.markdown(update["message"])
        update[
            "notified_subscribers"] = self.__incident_update_notification.count_by_update_status(
                update["id"], IncidentUpdateNotificationModule.SUCCESS)
        update[
            "failed_subscribers"] = self.__incident_update_notification.count_by_update_status(
                update["id"], IncidentUpdateNotificationModule.FAILED)

        components = self.__format_components(self.__component.get_all())
        affected_components = self.__format_affected_components(
            self.__incident_update_component.get_all(update_id))

        self.__context.autoload_options()
        self.__context.autoload_user(
            request.user.id if request.user.is_authenticated else None)
        self.__context.push({
            "page_title":
            _("View Incident Update  · %s") % self.__context.get(
                "app_name", os.getenv("APP_NAME", "Silverback")),
            "update":
            update,
            "incident":
            incident,
            "components":
            components,
            "affected_components":
            affected_components
        })

        return render(request, self.template_name, self.__context.get())

    def __format_components(self, components):
        components_list = []

        for component in components:
            components_list.append({
                "id": component.id,
                "name": component.name
            })

        return components_list

    def __format_affected_components(self, affected_components):
        affected_components_list = []

        for affected_component in affected_components:
            affected_components_list.append({
                "id":
                affected_component.id,
                "component_id":
                affected_component.component.id,
                "component_name":
                affected_component.component.name,
                "type":
                affected_component.type
            })

        return affected_components_list