Giter Site home page Giter Site logo

status-page / status-page Goto Github PK

View Code? Open in Web Editor NEW
49.0 4.0 11.0 7.23 MB

Open Source Statuspage Software

Home Page: https://docs.status-page.dev

License: Apache License 2.0

Shell 0.47% TypeScript 12.62% Python 65.76% JavaScript 1.65% SCSS 1.03% CSS 0.13% HTML 18.34%
translation queued-jobs statuspage incident tailwind-ui

status-page's People

Contributors

dependabot[bot] avatar emma0z avatar herrtxbias avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

status-page's Issues

[Bug]: Subscriber Verification Mail not sent

Description of the Bug

Discussed in #451

Originally posted by sparthe123 December 28, 2022
Hi Team,

I added email configuration in configuration.py, but subscription verification emails are not working.. and also there is no log in mail server from the application. Is there any other place I need to configure mail setup

Where can I check the application logs ?

Expected behavior

.

Reproduction

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Version

2.0.0 (Preview)

Information about your Device

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Relevant log output

No response

[Feature]: Send 1 email instead of 2 when creating a maintenance/incident

Is your feature request related to a problem? Please describe.

I'm always frustrated when creating a new incident/maintenance, I receive 2 emails:

  • Creation email without text information
  • Update email containing text information that I used during initial creation.

Describe the solution you'd like

Receiving only 1 creation email when creating incident/maintenance that contains all the information.
Receiving 1 update email when updating an existing incident/maintenance.

Describe alternatives you've considered

...

Additional context

...

[Bug]: Date formatting ignored

Description of the Bug

While modifying the TIME_ZONE and all date formatting to the configuration.py, the date format and orientation are not applied and stay in original UTC/US way.

# Time zone (default: UTC)
TIME_ZONE = 'CET'

# Date/time formatting. See the following link for supported formats:
# https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date
DATE_FORMAT = 'j N Y'
SHORT_DATE_FORMAT = 'd-m-Y'
TIME_FORMAT = 'G:i a'
SHORT_TIME_FORMAT = 'H:i:s'
DATETIME_FORMAT = 'j N Y, G:i'
SHORT_DATETIME_FORMAT = 'd-m-Y H:i'

I've check the docs of django for cheking what should I put over there :/

Expected behavior

It should be this
image

But it stayed like this
image

Reproduction

  1. Edit /opt/status-page/statuspage/statuspage/configuration.py
  2. Reload services
  3. Check on web page

Version

2.0.0 (Preview)

Information about your Device

Desktop (please complete the following information):

  • OS: Debian 11.7
  • Browser : Firefox
  • Version 116.0.2

Smartphone (please complete the following information):

  • Device: othing Phone (1)
  • OS: Android 13
  • Browser Brave
  • Version 1.56.20

Relevant log output

Not sure if this related


Aug 11 12:31:05 ninja-status-vincent-d01 python3[3114]: 12:31:05 Registering birth
Aug 11 12:31:05 ninja-status-vincent-d01 python3[3114]: /opt/status-page/venv/lib/python3.10/site-packages/rq_scheduler/utils.py:28: FutureWarning: Version 0.22.0+ of crontab will use datetime.utcnow() and
Aug 11 12:31:05 ninja-status-vincent-d01 python3[3114]: datetime.utcfromtimestamp() instead of datetime.now() and
Aug 11 12:31:05 ninja-status-vincent-d01 python3[3114]: datetime.fromtimestamp() as was previous. This had been a bug, which will be
Aug 11 12:31:05 ninja-status-vincent-d01 python3[3114]: remedied. If you would like to keep the *old* behavior:
Aug 11 12:31:05 ninja-status-vincent-d01 python3[3114]: `ct.next(..., default_utc=False)` . If you want to use the new behavior *now*:
Aug 11 12:31:05 ninja-status-vincent-d01 python3[3114]: `ct.next(..., default_utc=True)`. If you pass a datetime object with a tzinfo
Aug 11 12:31:05 ninja-status-vincent-d01 python3[3114]: attribute that is not None, timezones will *just work* to the best of their
Aug 11 12:31:05 ninja-status-vincent-d01 python3[3114]: ability. There are tests...
Aug 11 12:31:05 ninja-status-vincent-d01 python3[3114]:   next_time = cron.next(now=now, return_datetime=True)


(this has already corrected on my side)

[Bug]: Typo in statuspage/utilities/templatetags/helpers.py

Description of the Bug

The file statuspage/utilities/templatetags/helpers.py has the following typo

@register.filter
def get_historic_status(value: Component) -> Any:
    """
    Template to returm historic status
    """
    num_days = 90
    today = make_aware(datetime.datetime.today())
    start_date = today + datetime.timedelta(days=1)
    end_date = start_date - datetime.timedelta(days=num_days)

    date_list = [end_date + datetime.timedelta(days=x) for x in range(num_days)]
    component_incidents = value.incidents.all()
    date_incidents = []
    for date in date_list:
        end = date + datetime.timedelta(days=1)
        incidents = list(filter(lambda i: date <= i.created <= end, component_incidents))

        hover_color = 'hover:bg-green-600'
        color = 'bg-green-500'
        if len(list(filter(lambda i: i.impcat == IncidentImpactChoices.MINOR, incidents))) > 0:
            hover_color = 'hover:bg-yellow-600'
            color = 'bg-yellow-500'
        if len(list(filter(lambda i: i.impcat == IncidentImpactChoices.MAJOR, incidents))) > 0:
            hover_color = 'hover:bg-orange-600'
            color = 'bg-orange-500'
        if len(list(filter(lambda i: i.impcat == IncidentImpactChoices.CRITICAL, incidents))) > 0:
            hover_color = 'hover:bg-red-600'
            color = 'bg-red-500'

        date_incidents.append({
            'date': date,
            'hover_color': hover_color,
            'color': color,
            'incidents': incidents
        })
    return date_incidents

This raises the error that impcat is undefined which results in an http error 500 on the status-page -> I replaced "impcat" with "impact" and it started working again.

Expected behavior

N/A

Reproduction

N/A

Version

2.0.0 (Preview)

Information about your Device

N/A

Relevant log output

Internal Server Error: /
Traceback (most recent call last):
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/core/handlers/exception.py", line 56, in inner
    response = get_response(request)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/views/generic/base.py", line 103, in view
    return self.dispatch(request, *args, **kwargs)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/views/generic/base.py", line 142, in dispatch
    return handler(request, *args, **kwargs)
  File "/opt/status-page/statuspage/statuspage/views/__init__.py", line 115, in get
    return render(request, self.template_name, {
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/shortcuts.py", line 24, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 175, in render
    return self._render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 167, in _render
    return self.nodelist.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 157, in render
    return compiled_parent._render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 167, in _render
    return self.nodelist.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 157, in render
    return compiled_parent._render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 167, in _render
    return self.nodelist.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 157, in render
    return compiled_parent._render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 167, in _render
    return self.nodelist.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 63, in render
    result = block.nodelist.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 63, in render
    result = block.nodelist.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 63, in render
    result = block.nodelist.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/defaulttags.py", line 238, in render
    nodelist.append(node.render_annotated(context))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/defaulttags.py", line 321, in render
    return nodelist.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/defaulttags.py", line 541, in render
    return self.nodelist.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/defaulttags.py", line 238, in render
    nodelist.append(node.render_annotated(context))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/defaulttags.py", line 321, in render
    return nodelist.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
    return SafeString("".join([node.render_annotated(context) for node in self]))
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
    return self.render(context)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/defaulttags.py", line 189, in render
    values = self.sequence.resolve(context, ignore_failures=True)
  File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 742, in resolve
    new_obj = func(obj, *arg_vals)
  File "/opt/status-page/statuspage/utilities/templatetags/helpers.py", line 262, in get_historic_status
    if len(list(filter(lambda i: i.impcat == IncidentImpactChoices.MINOR, incidents))) > 0:
  File "/opt/status-page/statuspage/utilities/templatetags/helpers.py", line 262, in <lambda>
    if len(list(filter(lambda i: i.impcat == IncidentImpactChoices.MINOR, incidents))) > 0:
AttributeError: 'Incident' object has no attribute 'impcat'

[Bug]: Documentation not working

Description of the Bug

Opening /api/docs/ produces an error message.

Expected behavior

Reproduction

  1. Go to /api/docs/

Version

2.0.0 (Preview)

Information about your Device

Relevant log output

Internal Server Error: /api/docs/
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/django/core/handlers/exception.py", line 56, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.10/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/views.py", line 34, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/utils/decorators.py", line 134, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/views/decorators/vary.py", line 21, in inner_func
    response = func(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/views/decorators/csrf.py", line 55, in wrapped_view
    return view_func(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/views/generic/base.py", line 103, in view
    return self.dispatch(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/usr/local/lib/python3.10/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/usr/local/lib/python3.10/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/usr/local/lib/python3.10/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/views.py", line 94, in get
    schema = generator.get_schema(request, self.public)
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/generators.py", line 248, in get_schema
    paths, prefix = self.get_paths(endpoints, components, request, public)
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/generators.py", line 406, in get_paths
    operation = self.get_operation(view, path, prefix, method, components, request)
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/generators.py", line 448, in get_operation
    operation = view_inspector.get_operation(operation_keys)
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/inspectors/view.py", line 45, in get_operation
    responses = self.get_responses()
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/inspectors/view.py", line 180, in get_responses
    response_serializers = self.get_response_serializers()
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/inspectors/view.py", line 235, in get_response_serializers
    responses = self.get_default_responses()
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/inspectors/view.py", line 211, in get_default_responses
    default_schema = self.serializer_to_schema(default_schema) or ''
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/inspectors/base.py", line 438, in serializer_to_schema
    return self.probe_inspectors(
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/inspectors/base.py", line 110, in probe_inspectors
    result = method(obj, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/inspectors/field.py", line 38, in get_schema
    return self.probe_field_inspectors(serializer, openapi.Schema, self.use_definitions)
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/inspectors/base.py", line 228, in probe_field_inspectors
    return self.probe_inspectors(
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/inspectors/base.py", line 110, in probe_inspectors
    result = method(obj, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/inspectors/field.py", line 129, in field_to_swagger_object
    actual_schema = definitions.setdefault(ref_name, make_schema_definition)
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/openapi.py", line 688, in setdefault
    ret = maker()
  File "/usr/local/lib/python3.10/site-packages/drf_yasg/inspectors/field.py", line 98, in make_schema_definition
    for property_name, child in serializer.fields.items():
  File "/usr/local/lib/python3.10/site-packages/django/utils/functional.py", line 57, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/local/lib/python3.10/site-packages/rest_framework/serializers.py", line 356, in fields
    for key, value in self.get_fields().items():
  File "/usr/local/lib/python3.10/site-packages/rest_framework/serializers.py", line 1076, in get_fields
    field_class, field_kwargs = self.build_field(
  File "/usr/local/lib/python3.10/site-packages/rest_framework/serializers.py", line 1222, in build_field
    return self.build_unknown_field(field_name, model_class)
  File "/usr/local/lib/python3.10/site-packages/rest_framework/serializers.py", line 1340, in build_unknown_field
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Field name `user` is not valid for model `IncidentTemplate`.

[Feature]: Incident/Maintenance Template when updating an existing maintenance/incident

Is your feature request related to a problem? Please describe.

I'm always frustrated when updating an existing maintenance/incident. I cannot use my templates.

Describe the solution you'd like

Have the same option to select a template when updating and creating an incident/maintenance.

Describe alternatives you've considered

...

Additional context

No response

[Feature]: Incident/maintenance templates

Discussed in #466

Originally posted by BornTKill February 16, 2023
Dear,

I would like to have template when opening an incident/maintenance.
Do you plan to do that ? Or only with API ?

[Bug]: Installation broken

Description of the Bug

The installation seems to be currently broken. I'm already trying to figure out the cause of this Issue.

Expected behavior

.

Reproduction

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Version

2.0.0 (Preview)

Information about your Device

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Relevant log output

No response

[Feature]: Translation

Is your feature request related to a problem? Please describe.

It would be nice to have an option to use multiple languages for the ui and also for the incidents and maintenance messages

Describe the solution you'd like

i18n and l19n should both be possible with django itself
https://docs.djangoproject.com/en/4.1/topics/i18n/

Describe alternatives you've considered

Maybe it would be possible to duplicate the message fields for every language

Additional context

No response

[Feature]: Adding CAPTCHA in subscribtion form

Is your feature request related to a problem? Please describe.

Spambots can submit many email addresses through the unprotected subscribtion form and thus send quite a few mails.

Describe the solution you'd like

Adding a (privacy friendly) CAPTCHA to the form.

Describe alternatives you've considered

Disabling subscribtions. (Which isn't a true solution)

Additional context

Maybe I'll find enough time to submit a suitable pull request by myself.

500 SERVER ERROR

Im am delete tetrick group amd create new = error how fix?

**Additional context**
[2021-07-01 22:11:02] production.ERROR: The payload is invalid. {"exception":"[object] (Illuminate\\Contracts\\Encryption\\DecryptException(code: 0): The payload is invalid. at /var/www/statuspage/vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php:196)
[stacktrace]
#0 /var/www/statuspage/vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php(137): Illuminate\\Encryption\\Encrypter->getJsonPayload()
#1 /var/www/statuspage/vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php(165): Illuminate\\Encryption\\Encrypter->decrypt()
#2 /var/www/statuspage/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(261): Illuminate\\Encryption\\Encrypter->decryptString()
#3 /var/www/statuspage/app/Models/Setting.php(22): Illuminate\\Support\\Facades\\Facade::__callStatic()
#4 /var/www/statuspage/app/Console/Commands/FetchUptimeRobotData.php(48): App\\Models\\Setting::getString()
#5 /var/www/statuspage/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): App\\Console\\Commands\\FetchUptimeRobotData->handle()
#6 /var/www/statuspage/vendor/laravel/framework/src/Illuminate/Container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()
#7 /var/www/statuspage/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure()
#8 /var/www/statuspage/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()
#9 /var/www/statuspage/vendor/laravel/framework/src/Illuminate/Container/Container.php(651): Illuminate\\Container\\BoundMethod::call()
#10 /var/www/statuspage/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Illuminate\\Container\\Container->call()
#11 /var/www/statuspage/vendor/symfony/console/Command/Command.php(299): Illuminate\\Console\\Command->execute()
#12 /var/www/statuspage/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\\Component\\Console\\Command\\Command->run()
#13 /var/www/statuspage/vendor/symfony/console/Application.php(978): Illuminate\\Console\\Command->run()
#14 /var/www/statuspage/vendor/symfony/console/Application.php(295): Symfony\\Component\\Console\\Application->doRunCommand()
#15 /var/www/statuspage/vendor/symfony/console/Application.php(167): Symfony\\Component\\Console\\Application->doRun()
#16 /var/www/statuspage/vendor/laravel/framework/src/Illuminate/Console/Application.php(92): Symfony\\Component\\Console\\Application->run()
#17 /var/www/statuspage/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\\Console\\Application->run()
#18 /var/www/statuspage/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle()
#19 {main}
"}

[Feature]: Choose the components status on maintenance/incident without the option "automatic status update"

Is your feature request related to a problem? Please describe.

I'm always frustrated because I want to control our communication.

When I update manually an incedent/ maintenance with an template (starting message, end message...) I cannot change the status of the componant.

I cannot use the "automatic status update" because the communication is not good.

Can you add an item list where we can choose the status of all components ?

Thank you

Describe the solution you'd like

Can you add an item list where we can choose the status of all components ?

Describe alternatives you've considered

Not use an item list but automaticaly change the component status whith the incident's severity or the maintenance's status

Additional context

No response

[Bug]: Maintenance Update shows empty page in the detail view in the dashboard

Description of the Bug

image

Expected behavior

There should be at least something in the detail view.

Reproduction

  1. Create Maintenance
  2. Create Maintenance Update
  3. Go to the detail view of the maintenance update (dashboard/maintenances/update/x/)
  4. Empty page

Version

2.0.0 (Preview)

Information about your Device

Desktop (please complete the following information):

  • OS: Windows
  • Browser: Chrome
  • Version: 111

Relevant log output

No response

[Bug]: In the version 2.3.0 impossible to add subscribers on the backoffice

Description of the Bug

Since version 2.3.0, we had an error (error 500) when we click on "add" on the subscribers menu.

I saw when in this new version there was a refactoring of the subscribers code. Could this be the problem?

Thank you

Expected behavior

Have the form to add subscribers

Reproduction

  1. Go to 'manager'
  2. Click on 'subscribers'
  3. Click on 'add'
  4. See error

Version

2.0.0 (Preview)

Information about your Device

  • OS: windows 11
  • Browser chrome
  • Version last

Relevant log output

No response

[Bug]: Changes are not reflecting.

Description of the Bug

We are trying to remove the Management URL: and Subscriber URL: from the email templates.

We have removed in Created.html and Created.txt file in the incidents folder.

But still we are getting the links in emails.

Expected behavior

Management URL: status-page.fullaw.in/subscribers/54285679-e187-4dd0-b10b-433a9d75783b/manage
Unsubscribe URL: status-page.fullaw.in/subscribers/54285679-e187-4dd0-b10b-433a9d75783b/unsubscribe

I want to remove this from the email templates.

Reproduction

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Version

2.0.0 (Preview)

Information about your Device

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Relevant log output

No response

[Feature]: Add created date in API response

Is your feature request related to a problem? Please describe.

I'm always frustrated when I request incidents list or details and the created date is missing.

Describe the solution you'd like

Add 'created' field for GET /incidents/incidents

Describe alternatives you've considered

none

Additional context

No response

[Bug]: Notifications are ignoring personal settings

Description of the Bug

Situation:
Two components are created: "A" and "B"

When I create an issue for A, people who are only subscribed to B also get the email notification.
This is obviously wrong behaviour.

Expected behavior

Only people who subscribed to A should get an E-Mail notification.

Reproduction

See description.

Version

2.0.0 (Preview)

Information about your Device

Not important.

Relevant log output

No response

[Feature]: Add a suscriber without sending a verification mail

Is your feature request related to a problem? Please describe.

I'm always frustrated when I add a suscriber, I cannot do it without sending a verification email.

Describe the solution you'd like

Have the choice to send or not the verification email. If not send, validate the user in database directly

Describe alternatives you've considered

Have the possibility to validate the verification in the backoffice

Additional context

No response

[Feature]: Allow to don't send email when creating or updating an incident/maintenance

Is your feature request related to a problem? Please describe.

When we create an incident or a maintenance we have the option visibility to show it on the status page.
Is it possible to made an option 'send email' to have the choice to send the email or not ?
So we can add an incident/maintenance on the status page without sending an email.

Thank you!

Describe the solution you'd like

Add a checkbox on indident/maintenance creation and editing forms.
I think it is no necessary to add this checkbox on templates.

Describe alternatives you've considered

Add a checkbox on indident/maintenance creation and editing forms.
I think it is no necessary to add this checkbox on templates.

Additional context

No response

[Bug]: Duplicate message-id in email #2

Description of the Bug

Dear @herrtxbias

I reopen the issue because I have upgrade to 2.2.4 and I still have the issue

When I create a maintenance/incident, only 2 of 3 subscribers (randomly) are receiving the emails.

For my test I have 3 subscribers with same notification options.

No failed task in the admin.

I have upgrade to 2.2.4 and I still have the issue :

Mar 30 15:12:10 prod-XXXX-01 postfix/smtpd[103200]: connect from localhost[127.0.0.1]
Mar 30 15:12:10 prod-XXXX-01 postfix/smtpd[103200]: 329237CE74: client=localhost[127.0.0.1]
Mar 30 15:12:10 prod-XXXX-01 postfix/cleanup[103203]: 329237CE74: [email protected]
Mar 30 15:12:10 prod-XXXX-01 postfix/qmgr[61915]: 329237CE74: from=<demo-status@ xxx.fr>, size=6020, nrcpt=1 (queue active)
Mar 30 15:12:10 prod-XXXX-01 postfix/smtpd[103200]: disconnect from localhost[127.0.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
Mar 30 15:12:10 prod-XXXX-01 postfix/smtpd[103200]: connect from localhost[127.0.0.1]
Mar 30 15:12:10 prod-XXXX-01 postfix/smtpd[103200]: 3B7647E605: client=localhost[127.0.0.1]
Mar 30 15:12:10 prod-XXXX-01 postfix/cleanup[103203]: 3B7647E605: [email protected]
Mar 30 15:12:10 prod-XXXX-01 postfix/qmgr[61915]: 3B7647E605: from=<[email protected]>, size=6026, nrcpt=1 (queue active)
Mar 30 15:12:10 prod-XXXX-01 postfix/smtpd[103200]: disconnect from localhost[127.0.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
Mar 30 15:12:10 prod-XXXX-01 postfix/smtpd[103200]: connect from localhost[127.0.0.1]
Mar 30 15:12:10 prod-XXXX-01 postfix/smtpd[103200]: 4448C7E606: client=localhost[127.0.0.1]
Mar 30 15:12:10 prod-XXXX-01 postfix/cleanup[103203]: 4448C7E606: [email protected]
Mar 30 15:12:10 prod-XXXX-01 postfix/qmgr[61915]: 4448C7E606: from=<demo-status@ xxx.fr>, size=6002, nrcpt=1 (queue active)
Mar 30 15:12:10 prod-XXXX-01 postfix/smtpd[103200]: disconnect from localhost[127.0.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
Mar 30 15:12:10 prod-XXXX-01 postfix/smtpd[103200]: connect from localhost[127.0.0.1]
Mar 30 15:12:10 prod-XXXX-01 postfix/smtpd[103200]: 4D4F17E607: client=localhost[127.0.0.1]
Mar 30 15:12:10 prod-XXXX-01 postfix/cleanup[103203]: 4D4F17E607: [email protected]
Mar 30 15:12:10 prod-XXXX-01 postfix/qmgr[61915]: 4D4F17E607: from=<demo-status@ xxx.fr >, size=6006, nrcpt=1 (queue active)
Mar 30 15:12:10 prod-XXXX-01 postfix/smtpd[103200]: disconnect from localhost[127.0.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
Mar 30 15:12:10 prod-XXXX-01 postfix/smtp[103206]: 3B7647E605: to=<**subcriber1**@xxx>, relay=aspmx.l.google.com[173.194.76.27]:25, delay=0.35, delays=0/0.01/0.11/0.22, dsn=2.0.0, status=sent (250 2.0.0 OK  1680189130 j10-20020adfe50a000000b002c57de36900si26514979wrm.1008 - gsmtp)
Mar 30 15:12:10 prod-XXXX-01 postfix/qmgr[61915]: 3B7647E605: removed

Mar 30 15:12:10 prod-XXXX-01 postfix/smtp[103204]: 329237CE74: to=< **subcriber2**@xxx>, relay=aspmx.l.google.com[2a00:1450:400c:c07::1a]:25, delay=0.41, delays=0.01/0.01/0.14/0.24, dsn=2.0.0, status=sent (250 2.0.0 OK  1680189130 p9-20020a5d4589000000b002c6eb5a2d5esi26459093wrq.710 - gsmtp)
Mar 30 15:12:10 prod-XXXX-01 postfix/qmgr[61915]: 329237CE74: removed

Mar 30 15:12:10 prod-XXXX-01 postfix/smtp[103210]: 4D4F17E607: to=< **subcriber3**@xxx>, relay=gmail-smtp-in.l.google.com[2a00:1450:400c:c07::1b]:25, delay=0.42, delays=0/0.02/0.27/0.13, dsn=5.7.1, status=bounced (host gmail-smtp-in.l.google.com[2a00:1450:400c:c07::1b] said: 550-5.7.1 [2001:41d0:302:1000::21a9] Messages missing a valid messageId header 550 5.7.1 are not accepted. w13-20020adfec4d000000b002d789ce832dsi22225037wrn.89 - gsmtp (in reply to end of DATA command))
Mar 30 15:12:10 prod-XXXX-01 postfix/cleanup[103203]: B5EBE7E605: message-id=<[email protected]>
Mar 30 15:12:10 prod-XXXX-01 postfix/bounce[103211]: 4D4F17E607: sender non-delivery notification: B5EBE7E605
Mar 30 15:12:10 prod-XXXX-01 postfix/qmgr[61915]: B5EBE7E605: from=<>, size=8413, nrcpt=1 (queue active)
Mar 30 15:12:10 prod-XXXX-01 postfix/qmgr[61915]: 4D4F17E607: removed


Mar 30 15:12:10 prod-XXXX-01 postfix/smtp[103208]: 4448C7E606: to=< **subcriber4**@xxx>, relay=gmail-smtp-in.l.google.com[2a00:1450:400c:c07::1b]:25, delay=0.51, delays=0/0.01/0.31/0.18, dsn=5.7.1, status=bounced (host gmail-smtp-in.l.google.com[2a00:1450:400c:c07::1b] said: 550-5.7.1 [2001:41d0:302:1000::21a9] Messages missing a valid messageId header 550 5.7.1 are not accepted. j11-20020a056000124b00b002d312631370si27026380wrx.279 - gsmtp (in reply to end of DATA command))
Mar 30 15:12:10 prod-XXXX-01 postfix/cleanup[103203]: C173A7E605: message-id=<[email protected]>
Mar 30 15:12:10 prod-XXXX-01 postfix/bounce[103211]: 4448C7E606: sender non-delivery notification: C173A7E605
Mar 30 15:12:10 prod-XXXX-01 postfix/qmgr[61915]: C173A7E605: from=<>, size=8405, nrcpt=1 (queue active)
Mar 30 15:12:10 prod-XXXX-01 postfix/qmgr[61915]: 4448C7E606: removed

I have removed working subscribers (1 and 2), updated twice the same maintenance and I had this :

First update only subsriber3 received email :

Mar 30 15:26:16 prod-xxx-01 postfix/smtpd[103342]: connect from localhost[127.0.0.1]
Mar 30 15:26:16 prod-xxx-01 postfix/smtpd[103342]: A6F317E605: client=localhost[127.0.0.1]
Mar 30 15:26:16 prod-xxx-01 postfix/cleanup[103345]: A6F317E605: [email protected]
Mar 30 15:26:16 prod-xxx-01 postfix/qmgr[61915]: A6F317E605: from=<[email protected]>, size=4979, nrcpt=1 (queue active)
Mar 30 15:26:16 prod-xxx-01 postfix/smtpd[103342]: disconnect from localhost[127.0.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
Mar 30 15:26:16 prod-xxx-01 postfix/smtpd[103342]: connect from localhost[127.0.0.1]
Mar 30 15:26:16 prod-xxx-01 postfix/smtpd[103342]: B36187E607: client=localhost[127.0.0.1]
Mar 30 15:26:16 prod-xxx-01 postfix/cleanup[103345]: B36187E607: [email protected]
Mar 30 15:26:16 prod-xxx-01 postfix/qmgr[61915]: B36187E607: from=<[email protected]>, size=4983, nrcpt=1 (queue active)
Mar 30 15:26:16 prod-xxx-01 postfix/smtpd[103342]: disconnect from localhost[127.0.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
Mar 30 15:26:17 prod-xxx-01 postfix/smtp[103348]: B36187E607: to=<**subsriber3**@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.133.27]:25, delay=0.66, delays=0/0.02/0.37/0.27, dsn=2.0.0, status=sent (250 2.0.0 OK  1680189977 t7-20020adff047000000b002da650f451csi19273855wro.284 - gsmtp)
Mar 30 15:26:17 prod-xxx-01 postfix/qmgr[61915]: B36187E607: removed

Mar 30 15:26:17 prod-xxx-01 postfix/smtp[103346]: A6F317E605: to=<**subsriber4**@gmail.com>, relay=gmail-smtp-in.l.google.com[2a00:1450:400c:c07::1a]:25, delay=0.78, delays=0.01/0.01/0.41/0.34, dsn=5.7.1, status=bounced (host gmail-smtp-in.l.google.com[2a00:1450:400c:c07::1a] said: 550-5.7.1 [2001:41d0:302:1000::21a9] Messages missing a valid messageId header 550 5.7.1 are not accepted. a5-20020a5d5085000000b002d1a77f97c8si29352479wrt.341 - gsmtp (in reply to end of DATA command))
Mar 30 15:26:17 prod-xxx-01 postfix/cleanup[103345]: 724477E784: message-id=<[email protected]>
Mar 30 15:26:17 prod-xxx-01 postfix/bounce[103349]: A6F317E605: sender non-delivery notification: 724477E784
Mar 30 15:26:17 prod-xxx-01 postfix/qmgr[61915]: 724477E784: from=<>, size=7380, nrcpt=1 (queue active)
Mar 30 15:26:17 prod-xxx-01 postfix/qmgr[61915]: A6F317E605: removed

Second Update both receive email :

Mar 30 15:27:43 prod-xxx-01 postfix/smtpd[103342]: connect from localhost[127.0.0.1]
Mar 30 15:27:43 prod-xxx-01 postfix/smtpd[103342]: AB2507CE74: client=localhost[127.0.0.1]
Mar 30 15:27:43 prod-xxx-01 postfix/cleanup[103345]: AB2507CE74: [email protected]
Mar 30 15:27:43 prod-xxx-01 postfix/qmgr[61915]: AB2507CE74: from=<[email protected]>, size=4995, nrcpt=1 (queue active)
Mar 30 15:27:43 prod-xxx-01 postfix/smtpd[103342]: disconnect from localhost[127.0.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
Mar 30 15:27:43 prod-xxx-01 postfix/smtpd[103342]: connect from localhost[127.0.0.1]
Mar 30 15:27:43 prod-xxx-01 postfix/smtpd[103342]: B52AF7E607: client=localhost[127.0.0.1]
Mar 30 15:27:43 prod-xxx-01 postfix/cleanup[103345]: B52AF7E607: [email protected]
Mar 30 15:27:43 prod-xxx-01 postfix/qmgr[61915]: B52AF7E607: from=<demo-status@ xxx.fr >, size=4999, nrcpt=1 (queue active)
Mar 30 15:27:43 prod-xxx-01 postfix/smtpd[103342]: disconnect from localhost[127.0.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
Mar 30 15:27:44 prod-xxx-01 postfix/smtp[103346]: B52AF7E607: to=<**subsriber3**@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.133.27]:25, delay=0.27, delays=0/0/0.08/0.18, dsn=2.0.0, status=sent (250 2.0.0 OK  1680190064 e5-20020adffc45000000b002d9033d5eb6si20446202wrs.191 - gsmtp)
Mar 30 15:27:44 prod-xxx-01 postfix/qmgr[61915]: B52AF7E607: removed

Mar 30 15:27:44 prod-xxx-01 postfix/smtp[103348]: AB2507CE74: to=<**subsriber4**@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.133.27]:25, delay=0.58, delays=0/0/0.08/0.49, dsn=2.0.0, status=sent (250 2.0.0 OK  1680190064 v20-20020a5d5914000000b002c5587cbe64si30747698wrd.186 - gsmtp)
Mar 30 15:27:44 prod-xxx-01 postfix/qmgr[61915]: AB2507CE74: removed

Any ideas ?

Expected behavior

Reproduction

Version

2.0.0 (Preview)

Information about your Device

Relevant log output

No response

[Bug]: Text block when editing a maintenance

Description of the Bug

Dear,

I have created a maintenance with markdown inside.

image

When I want to edit an existing deduction the back text is not large well formatted.

image

Expected behavior

...

Reproduction

...

Version

2.0.0 (Preview)

Information about your Device

...

Relevant log output

No response

Issues with Texts on Incident / Maintenance Create / Update

Describe the bug

[previous exception] [object] (PDOException(code: 22001): SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'text' at row 1 at /var/www/status-page/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:115)

[Bug]: Incident/Maintenance template character escaping

Description of the Bug

Dear,

i have create a incident template and a maintenance template.

image

But when creating an incident/maintenance from this template is not working

image

image

it's empty.

image

Expected behavior

Pre fill incident/maintenance from template.

Reproduction

.

Version

2.0.0 (Preview)

Information about your Device

.

Relevant log output

No response

[Bug]: Text area - Problems with string length

Description of the Bug

Please extend the string length for Text aria in Incidents and Maintenance.
Now you can post a maximum of 1024 characters.

Expected behavior

Also if this is possible, please set simple text without Markdown syntax. Because it does not work fine.

Otherwise the panel is very cool, you are a very cool expert, thank you in advance.

Reproduction

  1. Go to 'Maintenances -> Maintenances'
  2. Click on 'Add'
  3. Scroll down to 'Maintenance Update'
  4. Insert in Text area more than 1024 characters, and try to create the new Maintenance.
  5. See error

Version

= 2.0.0 (Stable)

Information about your Device

Desktop (please complete the following information):

  • OS: [MacOS]
  • Browser [safari]
  • Version [e.g. 22]

Relevant log output

statuspage@statuspage ERROR:  value too long for type character varying(1024)
statuspage@statuspage STATEMENT:  INSERT INTO "maintenances_maintenanceupdate" ("created", "last_updated", "text", "new_status", "maintenance_id", "status", "user_id") VALUES ('2022-12-16T12:40:15.976833+00:00'::timestamptz, '2022-12-16T12:40:15.976845+00:00'::timestamptz, 'yuxepknagwckwgfsehlrvqwklfrkskqbcwtdiqdepiugjwwrshpnpibqcbssliidjnrvdeakpmjsmbylbkjhlooogphgwqljndmsgcupmisnnsnpemtaalxckeveesaklyflhmmtiiofpzmqrycvimuqbdbulokcgqbvnsosbiyxxwhtefqvgipqfaubfzistyynduixzzytjytsvurwcwsliqvhinnvjgqiynsznqtbmfoqxqmqkrmtobzndfgdrtkdcesmoqkyafgoavsygdgowjbwevlqeljfoulzgabvdlyzrrumztgledosvqkeufxlpqbvatrfvwkgszeujqdvxifialtwklfdgqrqvyouabobwmmjydrzerapqbkixsdcbsouycabamdcayyudrsxwtjhvnjziqwbncivdyrhsoagzucjveuwdmnfhuyappdiykhgjnhyabfjvsoilopjwsjveoylefugsplvkmnwlutxsscmfikuilbgxowzloverxnjaynkvkupdbwniwjhaxdgubntiaoswdysanjyjbtnscwqptxtehevdjexeywberwdfbhudizalzlabugesujnoysyjdqsjwyvxyfjrfsauntngxhznrqkretoszymssiwgcjdghgllqxhrrquqsyazhcbwomftujjqkxuvatnjhncfpisulaobxpthsgslsksmxmnrqdaviqilbjhdelgiglyusveanrmrbhjnxlqxptqwvikbypnhwukatwryjxgwyeitpafaazanlclqbxsuyrxlacucnniwasfumbvxcuprrfkslhvxjpznjbeyuvxrokzfrqtxrhcqofyrxpcxxgvdchyuzbbitylsdsrfdpnbfaxqbmezyonuhbzgjvvrmsromekpwerferztycpcnkdfrchpykdtidoeoekzqcutlhrltxknqcgdegzhsqrdlipnjgbpseosnkxtubfeiwkenmkkhwjvfmbigsghyrdtnyngdsfgkjgg', false, 26, 'schedule', 1) RETURNING "maintenances_maintenanceupdate"."id"

[Feature]: Make 2FA deactivatable

Is your feature request related to a problem? Please describe.

It is certainly a useful feature, but it would be better if you could disable it. Especially when multiple people use the same access, it is not possible to use 2FA properly.

Apart from that, 2FA is fatally broken, but that's another topic.

Describe the solution you'd like

An configuration option to disable 2FA.
Alternatively a per account setting, if this is possible in Django.

Describe alternatives you've considered

Right now I just abuse a bug or I use the backup tokens.

Additional context

No response

[Bug]: Resend Verification Mail not working

Description of the Bug

Hi @herrtxbias,

When I clear on [Resend Verification Mail] button from subscriber menu, I do not receive any email.
No failed task in the admin, and no log on my mail server.

image

Best regards.

Expected behavior

Receive verification email when clicking on [Resend Verification Mail] button
image

Reproduction

...

Version

2.0.0 (Preview)

Information about your Device

...

Relevant log output

No response

[Bug]: wrong date for incidents in the history of components

Description of the Bug

Hello,
When we create an incident, it does not appear correctly in the history of the page.
It is always 1 day before the real date.
For example, if I create a critical incident on May 17th, it appears in the history as having arrived on May 16th.

Capture d'écran 2023-05-17 093619
Capture d'écran 2023-05-17 093756
Capture d'écran 2023-05-17 093809

Thank you

Expected behavior

If we create an incident the May 17th, see it in the components history at May 17th.

Reproduction

  1. Go to dashboard and create an accident on components
  2. Go to Home page and see the components history
  3. See error

Version

2.0.0 (Preview)

Information about your Device

Desktop (please complete the following information):

  • OS: Windows 11
  • Browser Chrome
  • Version 113

Relevant log output

No response

[Bug]: Emails are not being delivered.

Description of the Bug

The emails have suddenly ceased triggering.

We have received emails previously. We edited the created.html and created.txt file for the format changes and the emails are stopped triggering..

Expected behavior

Can someone help us with the logs path. We are not sure, where to check the email logs.

Reproduction

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Version

2.0.0 (Preview)

Information about your Device

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Relevant log output

No response

[Bug]: HTML in header/footer

Description of the Bug

TO have HTML rendering in header and footer, you need to escape the html with:
in statuspage/templates/base/home.html change ({{ config.CUSTOM_STYLE_HEADER**|safe** }} and {{ config.CUSTOM_STYLE_FOOTER**|safe** }}

{% extends 'base/layout.html' %}

{% block content %}
  {% if config.CUSTOM_STYLE_CSS %}
    <style>{{ config.CUSTOM_STYLE_CSS }}</style>
  {% endif %}
  <div class="container mx-auto max-w-4xl pb-8">
    <div class="flex flex-col space-y-8 pt-6">
      {{ config.CUSTOM_STYLE_HEADER|safe }}

...


      {% block home_content %}{% endblock %}
      {{ config.CUSTOM_STYLE_FOOTER|safe }}
      {% if not config.CUSTOM_STYLE_FOOTER_DISABLE_CORE %}
      {% endif %}
    </div>
  </div>
{% endblock content %}

Expected behavior

N/A

Reproduction

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Version

2.0.0 (Preview)

Information about your Device

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Relevant log output

No response

[Bug]: Linebreak missing in incident updates

Description of the Bug

When creating an incident with a long message, the message doesnt get cut of when it's to long to match into the field, resulting in the following visual bug:
image

Expected behavior

The text gets broken correctly or cut off.

Reproduction

  1. Go to 'Incidents'
  2. Create a new incident
  3. Enter a long update message
  4. Observe that the line doesn't get broken

Version

2.0.0 (Preview)

Information about your Device

Desktop (please complete the following information):

  • OS: Windows
  • Browser Edge
  • Version 111.0.1661.54

Relevant log output

No response

[Bug]: Bulk edit component

Description of the Bug

Dear,

When bulk edit component to update state, I got 500

Internal Server Error: /dashboard/components/edit/

KeyError at /dashboard/components/edit/
"Key 'show_historic_incidents' not found in 'ComponentBulkEditForm'. Choices are: component_group, description, link, order, pk, status, visibility."

Request Method: POST
Request URL: https://demo2-statuspage.quicksign.fr/dashboard/components/edit/
Django Version: 4.1.4
Python Executable: /opt/status-page/venv/bin/python3
Python Version: 3.10.6
Python Path: ['/opt/status-page/statuspage', '/opt/status-page', '/opt/status-page/venv/bin', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/opt/status-page/venv/lib/python3.10/site-packages']
Server time: Fri, 17 Feb 2023 16:13:25 +0100
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'django_browser_reload',
'django_tables2',
'components',
'extras',
'incidents',
'maintenances',
'users',
'utilities',
'metrics',
'subscribers',
'django_rq',
'drf_yasg',
'queuing',
'django_otp',
'django_otp.plugins.otp_static',
'django_otp.plugins.otp_totp',
'otp_yubikey']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django_otp.middleware.OTPMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django_browser_reload.middleware.BrowserReloadMiddleware',
'statuspage.middleware.APIVersionMiddleware',
'statuspage.middleware.ObjectChangeMiddleware',
'statuspage.middleware.DynamicConfigMiddleware']


Traceback (most recent call last):
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/forms/forms.py", line 182, in __getitem__
   field = self.fields[name]

During handling of the above exception ('show_historic_incidents'), another exception occurred:
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner
   response = get_response(request)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/core/handlers/base.py", line 197, in _get_response
   response = wrapped_callback(request, *callback_args, **callback_kwargs)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/views/generic/base.py", line 103, in view
   return self.dispatch(request, *args, **kwargs)
 File "/opt/status-page/statuspage/utilities/views.py", line 50, in dispatch
   return super().dispatch(request, *args, **kwargs)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/views/generic/base.py", line 142, in dispatch
   return handler(request, *args, **kwargs)
 File "/opt/status-page/statuspage/statuspage/views/generic/bulk_views.py", line 210, in post
   return render(request, self.template_name, {
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/shortcuts.py", line 24, in render
   content = loader.render_to_string(template_name, context, request, using=using)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader.py", line 62, in render_to_string
   return template.render(context, request)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/backends/django.py", line 62, in render
   return self.template.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 175, in render
   return self._render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 167, in _render
   return self.nodelist.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 157, in render
   return compiled_parent._render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 167, in _render
   return self.nodelist.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 157, in render
   return compiled_parent._render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 167, in _render
   return self.nodelist.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 157, in render
   return compiled_parent._render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 167, in _render
   return self.nodelist.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 63, in render
   result = block.nodelist.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 63, in render
   result = block.nodelist.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 63, in render
   result = block.nodelist.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 63, in render
   result = block.nodelist.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/defaulttags.py", line 322, in render
   return nodelist.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
   return SafeString("".join([node.render_annotated(context) for node in self]))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/defaulttags.py", line 238, in render
   nodelist.append(node.render_annotated(context))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/defaulttags.py", line 238, in render
   nodelist.append(node.render_annotated(context))
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
   return self.render(context)
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/defaulttags.py", line 540, in render
   values = {key: val.resolve(context) for key, val in self.extra_context.items()}
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/defaulttags.py", line 540, in <dictcomp>
   values = {key: val.resolve(context) for key, val in self.extra_context.items()}
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/template/base.py", line 742, in resolve
   new_obj = func(obj, *arg_vals)
 File "/opt/status-page/statuspage/utilities/templatetags/form_helpers.py", line 16, in getfield
   return form[fieldname]
 File "/opt/status-page/venv/lib/python3.10/site-packages/django/forms/forms.py", line 184, in __getitem__
   raise KeyError(

Exception Type: KeyError at /dashboard/components/edit/
Exception Value: "Key 'show_historic_incidents' not found in 'ComponentBulkEditForm'. Choices are: component_group, description, link, order, pk, status, visibility."
Raised during: components.views.ComponentBulkEditView
Request information:
USER: ngirardi

GET: No GET data

POST:
csrfmiddlewaretoken = 'P80ERPwCFeRRrTvaGwp3Xbad0EKZt1Uk7uLkyeDzvEJ2FMjCaDO9d6FcHDrqRgGD'
return_url = '/dashboard/components/'
pk = '5'
_delete = ''

FILES: No FILES data

COOKIES:
csrftoken = 'swVQRzh70A2lo3YCEhzgq5F9R9RBypWt'
sessionid = 'ebxgmzv9xlrzt19y66d6akycn5vsiowz'

META:
CONTENT_LENGTH = '158'
CONTENT_TYPE = 'application/x-www-form-urlencoded'
CSRF_COOKIE = 'swVQRzh70A2lo3YCEhzgq5F9R9RBypWt'
CSRF_COOKIE_NEEDS_UPDATE = False
HTTP_ACCEPT = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
HTTP_ACCEPT_ENCODING = 'gzip, deflate, br'
HTTP_ACCEPT_LANGUAGE = 'fr-FR,fr;q=0.9'
HTTP_CONNECTION = 'close'
HTTP_COOKIE = 'csrftoken=swVQRzh70A2lo3YCEhzgq5F9R9RBypWt; sessionid=ebxgmzv9xlrzt19y66d6akycn5vsiowz'
HTTP_HOST = '127.0.0.1:8001'
HTTP_ORIGIN = 'https://demo2-statuspage.quicksign.fr/'
HTTP_REFERER = 'https://demo2-statuspage.quicksign.fr/dashboard/components/'
HTTP_USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15'
HTTP_X_FORWARDED_HOST = '[demo2-statuspage.quicksign.fr](http://demo2-statuspage.quicksign.fr/)'
HTTP_X_FORWARDED_PROTO = 'https'
HTTP_X_REAL_IP = '::ffff:10.10.7.113'
HTTP_X_SSL = '1'
HTTP_X_SSL_CLIENT_CN = '[ssl_c_s_dn(cn)]'
HTTP_X_SSL_CLIENT_DN = '[ssl_c_s_dn]'
HTTP_X_SSL_CLIENT_NOT_BEFORE = '[ssl_c_notbefore]'
HTTP_X_SSL_CLIENT_SERIAL = '[ssl_c_serial,hex]'
HTTP_X_SSL_CLIENT_SHA1 = '[ssl_c_sha1]'
HTTP_X_SSL_CLIENT_VERIFY = '0'
HTTP_X_SSL_CLIENT_VERSION = '[ssl_c_version]'
HTTP_X_SSL_ISSUER = '[ssl_c_i_dn]'
PATH_INFO = '/dashboard/components/edit/'
QUERY_STRING = ''
RAW_URI = '/dashboard/components/edit/'
REMOTE_ADDR = '127.0.0.1'
REMOTE_PORT = '57208'
REQUEST_METHOD = 'POST'
SCRIPT_NAME = ''
SERVER_NAME = '127.0.0.1'
SERVER_PORT = '8001'
SERVER_PROTOCOL = 'HTTP/1.0'
SERVER_SOFTWARE = 'gunicorn/20.1.0'
gunicorn.socket = <socket.socket fd=10, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8001), raddr=('127.0.0.1', 57208)>
wsgi.errors = <gunicorn.http.wsgi.WSGIErrorsWrapper object at 0x7f094259dba0>
wsgi.file_wrapper = <class 'gunicorn.http.wsgi.FileWrapper'>
wsgi.input = <gunicorn.http.body.Body object at 0x7f09425cf970>
wsgi.input_terminated = True
wsgi.multiprocess = True
wsgi.multithread = True
wsgi.run_once = False
wsgi.url_scheme = 'https'
wsgi.version = '(1, 0)'

Settings:
Using settings module statuspage.settings
ABSOLUTE_URL_OVERRIDES = {}
ADMINS = [('Nicolas Girardi', '[[email protected]](mailto:[email protected])')]
ALLOWED_HOSTS = ['[demo2-statuspage.quicksign.fr](http://demo2-statuspage.quicksign.fr/)', '10.10.0.5']
APPEND_SLASH = True
AUTHENTICATION_BACKENDS = ['statuspage.authentication.ObjectPermissionBackend']
AUTH_PASSWORD_VALIDATORS = '********************'
AUTH_USER_MODEL = 'auth.User'
BASE_DIR = '/opt/status-page/statuspage'
BASE_PATH = ''
CACHES = {'default': {'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://localhost:6379/1', 'OPTIONS': {'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'PASSWORD': '********************'}}}
CACHE_MIDDLEWARE_ALIAS = 'default'
CACHE_MIDDLEWARE_KEY_PREFIX = '********************'
CACHE_MIDDLEWARE_SECONDS = 600
CACHING_REDIS_DATABASE = 1
CACHING_REDIS_HOST = 'localhost'
CACHING_REDIS_PASSWORD = '********************'
CACHING_REDIS_PORT = 6379
CACHING_REDIS_PROTO = 'redis'
CACHING_REDIS_SENTINELS = []
CACHING_REDIS_SENTINEL_SERVICE = 'default'
CACHING_REDIS_SKIP_TLS_VERIFY = False
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_REGEX_WHITELIST = []
CORS_ORIGIN_WHITELIST = []
CSRF_COOKIE_AGE = 31449600
CSRF_COOKIE_DOMAIN = None
CSRF_COOKIE_HTTPONLY = False
CSRF_COOKIE_MASKED = False
CSRF_COOKIE_NAME = 'csrftoken'
CSRF_COOKIE_PATH = '/'
CSRF_COOKIE_SAMESITE = 'Lax'
CSRF_COOKIE_SECURE = False
CSRF_FAILURE_VIEW = 'django.views.csrf.csrf_failure'
CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'
CSRF_TRUSTED_ORIGINS = []
CSRF_USE_SESSIONS = False
DATABASE = {'NAME': 'statuspage', 'USER': 'statuspage', 'PASSWORD': '********************', 'HOST': '10.10.0.5', 'PORT': '', 'CONN_MAX_AGE': 300}
DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql', 'NAME': 'statuspage', 'USER': 'statuspage', 'PASSWORD': '********************', 'HOST': '10.10.0.5', 'PORT': '', 'CONN_MAX_AGE': 300, 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'CONN_HEALTH_CHECKS': False, 'OPTIONS': {}, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}}
DATABASE_ROUTERS = []
DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440
DATA_UPLOAD_MAX_NUMBER_FIELDS = None
DATETIME_FORMAT = 'N j, Y g:i a'
DATETIME_INPUT_FORMATS = ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S.%f', '%m/%d/%Y %H:%M', '%m/%d/%y %H:%M:%S', '%m/%d/%y %H:%M:%S.%f', '%m/%d/%y %H:%M']
DATE_FORMAT = 'N j, Y'
DATE_INPUT_FORMATS = ['%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', '%b %d %Y', '%b %d, %Y', '%d %b %Y', '%d %b, %Y', '%B %d %Y', '%B %d, %Y', '%d %B %Y', '%d %B, %Y']
DEBUG = False
DEBUG_PROPAGATE_EXCEPTIONS = False
DECIMAL_SEPARATOR = '.'
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
DEFAULT_CHARSET = 'utf-8'
DEFAULT_EXCEPTION_REPORTER = 'django.views.debug.ExceptionReporter'
DEFAULT_EXCEPTION_REPORTER_FILTER = 'django.views.debug.SafeExceptionReporterFilter'
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
DEFAULT_FROM_EMAIL = '[[email protected]](mailto:[email protected])'
DEFAULT_INDEX_TABLESPACE = ''
DEFAULT_TABLESPACE = ''
DEVELOPER = False
DISALLOWED_USER_AGENTS = []
EMAIL = {'SERVER': 'localhost', 'PORT': 25, 'USERNAME': '', 'PASSWORD': '********************', 'USE_SSL': False, 'USE_TLS': False, 'TIMEOUT': 10, 'FROM_EMAIL': '[[email protected]](mailto:[email protected])'}
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_HOST_PASSWORD = '********************'
EMAIL_HOST_USER = ''
EMAIL_PORT = 25
EMAIL_SSL_CERTFILE = None
EMAIL_SSL_KEYFILE = '********************'
EMAIL_SUBJECT_PREFIX = '[Status-Page] '
EMAIL_TIMEOUT = 10
EMAIL_USE_LOCALTIME = False
EMAIL_USE_SSL = False
EMAIL_USE_TLS = False
EXEMPT_VIEW_PERMISSIONS = []
FIELD_CHOICES = {}
FILE_UPLOAD_DIRECTORY_PERMISSIONS = None
FILE_UPLOAD_HANDLERS = ['django.core.files.uploadhandler.MemoryFileUploadHandler', 'django.core.files.uploadhandler.TemporaryFileUploadHandler']
FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440
FILE_UPLOAD_PERMISSIONS = 420
FILE_UPLOAD_TEMP_DIR = None
FILTERS_NULL_CHOICE_LABEL = 'None'
FILTERS_NULL_CHOICE_VALUE = 'null'
FIRST_DAY_OF_WEEK = 0
FIXTURE_DIRS = []
FORCE_SCRIPT_NAME = None
FORMAT_MODULE_PATH = None
FORM_RENDERER = 'django.forms.renderers.DjangoTemplates'
HOSTNAME = 'poc-statuspage-01'
IGNORABLE_404_URLS = []
INSTALLED_APPS = ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'django_browser_reload', 'django_tables2', 'components', 'extras', 'incidents', 'maintenances', 'users', 'utilities', 'metrics', 'subscribers', 'django_rq', 'drf_yasg', 'queuing', 'django_otp', 'django_otp.plugins.otp_static', 'django_otp.plugins.otp_totp', 'otp_yubikey']
INTERNAL_IPS = "('127.0.0.1', '::1')"
LANGUAGES = [('af', 'Afrikaans'), ('ar', 'Arabic'), ('ar-dz', 'Algerian Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('en', 'English'), ('en-au', 'Australian English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('hy', 'Armenian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('ig', 'Igbo'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kab', 'Kabyle'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('ky', 'Kyrgyz'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('ms', 'Malay'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmål'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('tg', 'Tajik'), ('th', 'Thai'), ('tk', 'Turkmen'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('uz', 'Uzbek'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')]
LANGUAGES_BIDI = ['he', 'ar', 'ar-dz', 'fa', 'ur']
LANGUAGE_CODE = 'en-us'
LANGUAGE_COOKIE_AGE = None
LANGUAGE_COOKIE_DOMAIN = None
LANGUAGE_COOKIE_HTTPONLY = False
LANGUAGE_COOKIE_NAME = 'django_language'
LANGUAGE_COOKIE_PATH = '/'
LANGUAGE_COOKIE_SAMESITE = None
LANGUAGE_COOKIE_SECURE = False
LOCALE_PATHS = []
LOGGING = {}
LOGGING_CONFIG = 'logging.config.dictConfig'
LOGIN_REDIRECT_URL = '/dashboard/'
LOGIN_REQUIRED = True
LOGIN_TIMEOUT = None
LOGIN_URL = '/dashboard/login/'
LOGOUT_REDIRECT_URL = None
MANAGERS = []
MEDIA_ROOT = '/opt/status-page/statuspage/media'
MEDIA_URL = '/media/'
MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage'
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django_otp.middleware.OTPMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django_browser_reload.middleware.BrowserReloadMiddleware', 'statuspage.middleware.APIVersionMiddleware', 'statuspage.middleware.ObjectChangeMiddleware', 'statuspage.middleware.DynamicConfigMiddleware']
MIGRATION_MODULES = {}
MONTH_DAY_FORMAT = 'F j'
NUMBER_GROUPING = 0
OTP_ADMIN_HIDE_SENSITIVE_DATA = True
PARAMS = '(<statuspage.config.parameters.ConfigParam object at 0x7f0945ae5090>, <statuspage.config.parameters.ConfigParam object at 0x7f0945ae5060>, <statuspage.config.parameters.ConfigParam object at 0x7f0945ae52a0>, <statuspage.config.parameters.ConfigParam object at 0x7f0945ae5270>, <statuspage.config.parameters.ConfigParam object at 0x7f0945b10910>, <statuspage.config.parameters.ConfigParam object at 0x7f0945b109a0>, <statuspage.config.parameters.ConfigParam object at 0x7f0945155270>, <statuspage.config.parameters.ConfigParam object at 0x7f0945155360>, <statuspage.config.parameters.ConfigParam object at 0x7f09451553c0>, <statuspage.config.parameters.ConfigParam object at 0x7f09451553f0>, <statuspage.config.parameters.ConfigParam object at 0x7f0945155420>, <statuspage.config.parameters.ConfigParam object at 0x7f0945155450>, <statuspage.config.parameters.ConfigParam object at 0x7f0945155480>)'
PASSWORD_HASHERS = '********************'
PASSWORD_RESET_TIMEOUT = '********************'
PLUGINS = []
PLUGINS_CONFIG = {'sp_uptimerobot': {'uptime_robot_api_key': '********************'}}
PREPEND_WWW = False
REDIS = {'tasks': {'HOST': 'localhost', 'PORT': 6379, 'PASSWORD': '********************', 'DATABASE': 0, 'SSL': False}, 'caching': {'HOST': 'localhost', 'PORT': 6379, 'PASSWORD': '********************', 'DATABASE': 1, 'SSL': False}}
REST_FRAMEWORK = {'ALLOWED_VERSIONS': ['2.1'], 'COERCE_DECIMAL_TO_STRING': False, 'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.SessionAuthentication', 'statuspage.api.authentication.TokenAuthentication'), 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend', 'rest_framework.filters.OrderingFilter'), 'DEFAULT_METADATA_CLASS': 'statuspage.api.metadata.BulkOperationMetadata', 'DEFAULT_PAGINATION_CLASS': 'statuspage.api.pagination.OptionalLimitOffsetPagination', 'DEFAULT_PARSER_CLASSES': ('rest_framework.parsers.JSONParser', 'rest_framework.parsers.MultiPartParser'), 'DEFAULT_PERMISSION_CLASSES': ('statuspage.api.authentication.TokenPermissions',), 'DEFAULT_RENDERER_CLASSES': ('rest_framework.renderers.JSONRenderer', 'statuspage.api.renderers.FormlessBrowsableAPIRenderer'), 'DEFAULT_VERSION': '2.1', 'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.AcceptHeaderVersioning', 'SCHEMA_COERCE_METHOD_NAMES': {'retrieve': 'read', 'destroy': 'delete', 'bulk_destroy': 'bulk_delete'}, 'VIEW_NAME_FUNCTION': 'utilities.api.get_view_name'}
REST_FRAMEWORK_VERSION = '2.1'
ROOT_URLCONF = 'statuspage.urls'
RQ_DEFAULT_TIMEOUT = 300
RQ_PARAMS = {'HOST': 'localhost', 'PORT': 6379, 'DB': 0, 'PASSWORD': '********************', 'SSL': False, 'SSL_CERT_REQS': 'required', 'DEFAULT_TIMEOUT': 300}
RQ_QUEUES = {'high': {'HOST': 'localhost', 'PORT': 6379, 'DB': 0, 'PASSWORD': '********************', 'SSL': False, 'SSL_CERT_REQS': 'required', 'DEFAULT_TIMEOUT': 300}, 'default': {'HOST': 'localhost', 'PORT': 6379, 'DB': 0, 'PASSWORD': '********************', 'SSL': False, 'SSL_CERT_REQS': 'required', 'DEFAULT_TIMEOUT': 300}, 'low': {'HOST': 'localhost', 'PORT': 6379, 'DB': 0, 'PASSWORD': '********************', 'SSL': False, 'SSL_CERT_REQS': 'required', 'DEFAULT_TIMEOUT': 300}}
SECRET_KEY = '********************'
SECRET_KEY_FALLBACKS = '********************'
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_CROSS_ORIGIN_OPENER_POLICY = 'same-origin'
SECURE_HSTS_INCLUDE_SUBDOMAINS = False
SECURE_HSTS_PRELOAD = False
SECURE_HSTS_SECONDS = 0
SECURE_PROXY_SSL_HEADER = "('HTTP_X_FORWARDED_PROTO', 'https')"
SECURE_REDIRECT_EXEMPT = []
SECURE_REFERRER_POLICY = 'same-origin'
SECURE_SSL_HOST = None
SECURE_SSL_REDIRECT = False
SERVER_EMAIL = '[[email protected]](mailto:[email protected])'
SESSION_CACHE_ALIAS = 'default'
SESSION_COOKIE_AGE = 1209600
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_PATH = '/'
SESSION_COOKIE_SAMESITE = 'Lax'
SESSION_COOKIE_SECURE = False
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_FILE_PATH = None
SESSION_SAVE_EVERY_REQUEST = False
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
SETTINGS_MODULE = 'statuspage.settings'
SHORT_DATETIME_FORMAT = 'Y-m-d H:i'
SHORT_DATE_FORMAT = 'Y-m-d'
SHORT_TIME_FORMAT = 'H:i:s'
SIGNING_BACKEND = 'django.core.signing.TimestampSigner'
SILENCED_SYSTEM_CHECKS = []
SITE_URL = 'https://demo2-statuspage.quicksign.fr/'
STATICFILES_DIRS = "('/opt/status-page/statuspage/project-static/dist', '/opt/status-page/statuspage/project-static/img', ('docs', '/opt/status-page/statuspage/project-static/docs'))"
STATICFILES_FINDERS = ['django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder']
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
STATIC_ROOT = '/opt/status-page/statuspage/static'
STATIC_URL = '/static/'
SWAGGER_SETTINGS = {'DEFAULT_AUTO_SCHEMA_CLASS': 'utilities.custom_inspectors.StatusPageSwaggerAutoSchema', 'DEFAULT_FIELD_INSPECTORS': ['utilities.custom_inspectors.NullableBooleanFieldInspector', 'utilities.custom_inspectors.ChoiceFieldInspector', 'utilities.custom_inspectors.SerializedPKRelatedFieldInspector', 'drf_yasg.inspectors.CamelCaseJSONFilter', 'drf_yasg.inspectors.ReferencingSerializerInspector', 'drf_yasg.inspectors.RelatedFieldInspector', 'drf_yasg.inspectors.ChoiceFieldInspector', 'drf_yasg.inspectors.FileFieldInspector', 'drf_yasg.inspectors.DictFieldInspector', 'drf_yasg.inspectors.JSONFieldInspector', 'drf_yasg.inspectors.SerializerMethodFieldInspector', 'drf_yasg.inspectors.SimpleFieldInspector', 'drf_yasg.inspectors.StringDefaultFieldInspector'], 'DEFAULT_FILTER_INSPECTORS': ['drf_yasg.inspectors.CoreAPICompatInspector'], 'DEFAULT_INFO': 'statuspage.urls.openapi_info', 'DEFAULT_MODEL_DEPTH': 1, 'DEFAULT_PAGINATOR_INSPECTORS': ['utilities.custom_inspectors.NullablePaginatorInspector', 'drf_yasg.inspectors.DjangoRestResponsePagination', 'drf_yasg.inspectors.CoreAPICompatInspector'], 'SECURITY_DEFINITIONS': {'Token': '********************'}, 'VALIDATOR_URL': None}
TASKS_REDIS = {'HOST': 'localhost', 'PORT': 6379, 'PASSWORD': '********************', 'DATABASE': 0, 'SSL': False}
TASKS_REDIS_DATABASE = 0
TASKS_REDIS_HOST = 'localhost'
TASKS_REDIS_PASSWORD = '********************'
TASKS_REDIS_PORT = 6379
TASKS_REDIS_SENTINELS = []
TASKS_REDIS_SENTINEL_SERVICE = 'default'
TASKS_REDIS_SENTINEL_TIMEOUT = 10
TASKS_REDIS_SKIP_TLS_VERIFY = False
TASKS_REDIS_SSL = False
TASKS_REDIS_USING_SENTINEL = False
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': ['/opt/status-page/statuspage/templates'], 'APP_DIRS': True, 'OPTIONS': {'builtins': ['utilities.templatetags.builtins.filters', 'utilities.templatetags.builtins.tags'], 'context_processors': ['django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'statuspage.context_processors.settings_and_registry']}}]
TEMPLATES_DIR = '/opt/status-page/statuspage/templates'
TEST_NON_SERIALIZED_APPS = []
TEST_RUNNER = 'django.test.runner.DiscoverRunner'
THOUSAND_SEPARATOR = ','
TIME_FORMAT = 'g:i a'
TIME_INPUT_FORMATS = ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
TIME_ZONE = 'Europe/Paris'
USE_DEPRECATED_PYTZ = True
USE_I18N = True
USE_L10N = False
USE_THOUSAND_SEPARATOR = False
USE_TZ = True
USE_X_FORWARDED_HOST = True
USE_X_FORWARDED_PORT = False
VERSION = '2.1.0'
WSGI_APPLICATION = 'statuspage.wsgi.application'
X_FRAME_OPTIONS = 'SAMEORIGIN'
YEAR_MONTH_FORMAT = 'F Y'

Expected behavior

.

Reproduction

.

Version

2.0.0 (Preview)

Information about your Device

.

Relevant log output

No response

Metric: Expand Select causes 500 Internal Server Error

Currently, trying to change the Expand value of the metric results in a 500 Internal Server Error.

Message:

[2021-04-12 13:15:09] production.ERROR: Cannot bind property [metric.collapse] without a validation rule present in the [$rules] array on Livewire component: [dashboard.metrics.modals.metric-update-modal]. {"userId":2,"exception":"[object] (Livewire\\Exceptions\\CannotBindToModelDataWithoutValidationRuleException(code: 0): Cannot bind property [metric.collapse] without a validation rule present in the [$rules] array on Livewire component: [dashboard.metrics.modals.metric-update-modal]. at /var/www/status-page/vendor/livewire/livewire/src/ComponentConcerns/HandlesActions.php:25)

[Bug]: Unable to subscribe if not connected on dashboard

Description of the Bug

So it's been a whole day, during the test we see this behavior.
We are now sure it was a thing.

When you aren't connected on Dashboard, you get an error 500 while you are trying to subscribe yourself.
Go back and retry. You have a print that you are now subscribe.

In fact, when you are back into the dashboard and go to subscribers section, you see the email address.
But with this behavior, you will not be able to receive any alert because, you can't verify your email (it's blocked before).

With the output print, you will see the subscribers section, need to be logged in for subscribing.
For seeing the error, don't forget to enable DEBUG mode into the configuration.py

I'll do a PR right after, we solved this by restoring some codes.

Expected behavior

When you subscribe, you'll be able to receive instantly your email verification.

Reproduction

  1. Go to 'your status page'
  2. Verify you are not logged into dashboard
  3. Then click son subscribe
  4. Enter email and click subscribe
  5. See error

Version

2.0.0 (Preview)

Information about your Device

Desktop (please complete the following information):

  • OS: Ubuntu 23.04
  • Browser Firefox
  • Version 116.0.2

Smartphone (please complete the following information):

  • Device: Nothing Phone (1)
  • OS: Android 13
  • Browser Brave
  • Version 1.56.20

Relevant log output

Aug 17 13:22:42 some-server gunicorn[6716]: Internal Server Error: /subscribers/subscribe
Aug 17 13:22:42 some-server gunicorn[6716]: Traceback (most recent call last):
Aug 17 13:22:42 some-server gunicorn[6716]:   File "/opt/status-page/venv/lib/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner
Aug 17 13:22:42 some-server gunicorn[6716]:     response = get_response(request)
Aug 17 13:22:42 some-server gunicorn[6716]:                ^^^^^^^^^^^^^^^^^^^^^
Aug 17 13:22:42 some-server gunicorn[6716]:   File "/opt/status-page/venv/lib/python3.11/site-packages/django/core/handlers/base.py", line 197, in _get_response
Aug 17 13:22:42 some-server gunicorn[6716]:     response = wrapped_callback(request, *callback_args, **callback_kwargs)
Aug 17 13:22:42 some-server gunicorn[6716]:                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Aug 17 13:22:42 some-server gunicorn[6716]:   File "/opt/status-page/venv/lib/python3.11/site-packages/django/views/generic/base.py", line 104, in view
Aug 17 13:22:42 some-server gunicorn[6716]:     return self.dispatch(request, *args, **kwargs)
Aug 17 13:22:42 some-server gunicorn[6716]:            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Aug 17 13:22:42 some-server gunicorn[6716]:   File "/opt/status-page/venv/lib/python3.11/site-packages/django/views/generic/base.py", line 143, in dispatch
Aug 17 13:22:42 some-server gunicorn[6716]:     return handler(request, *args, **kwargs)
Aug 17 13:22:42 some-server gunicorn[6716]:            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Aug 17 13:22:42 some-server gunicorn[6716]:   File "/opt/status-page/statuspage/statuspage/views/subscriber.py", line 70, in post
Aug 17 13:22:42 some-server gunicorn[6716]:     subscriber.save()
Aug 17 13:22:42 some-server gunicorn[6716]:   File "/opt/status-page/statuspage/subscribers/models.py", line 56, in save
Aug 17 13:22:42 some-server gunicorn[6716]:     super().save(*args, **kwargs)
Aug 17 13:22:42 some-server gunicorn[6716]:   File "/opt/status-page/venv/lib/python3.11/site-packages/django/db/models/base.py", line 814, in save
Aug 17 13:22:42 some-server gunicorn[6716]:     self.save_base(
Aug 17 13:22:42 some-server gunicorn[6716]:   File "/opt/status-page/venv/lib/python3.11/site-packages/django/db/models/base.py", line 892, in save_base
Aug 17 13:22:42 some-server gunicorn[6716]:     post_save.send(
Aug 17 13:22:42 some-server gunicorn[6716]:   File "/opt/status-page/venv/lib/python3.11/site-packages/django/dispatch/dispatcher.py", line 176, in send
Aug 17 13:22:42 some-server gunicorn[6716]:     return [
Aug 17 13:22:42 some-server gunicorn[6716]:            ^
Aug 17 13:22:42 some-server gunicorn[6716]:   File "/opt/status-page/venv/lib/python3.11/site-packages/django/dispatch/dispatcher.py", line 177, in <listcomp>
Aug 17 13:22:42 some-server gunicorn[6716]:     (receiver, receiver(signal=self, sender=sender, **named))
Aug 17 13:22:42 some-server gunicorn[6716]:                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Aug 17 13:22:42 some-server gunicorn[6716]:   File "/opt/status-page/statuspage/extras/signals.py", line 71, in handle_changed_object
Aug 17 13:22:42 some-server gunicorn[6716]:     objectchange.user = request.user
Aug 17 13:22:42 some-server gunicorn[6716]:     ^^^^^^^^^^^^^^^^^
Aug 17 13:22:42 some-server gunicorn[6716]:   File "/opt/status-page/venv/lib/python3.11/site-packages/django/db/models/fields/related_descriptors.py", line 266, in __set__
Aug 17 13:22:42 some-server gunicorn[6716]:     raise ValueError(
Aug 17 13:22:42 some-server gunicorn[6716]: ValueError: Cannot assign "<SimpleLazyObject: <SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x7f76c7895490>>>": "ObjectChange.user" must be a "User" instance.

[Feature]: Make templates more practical to use

Is your feature request related to a problem? Please describe.

Hello,
Is it possible to make these changes to the templates?

  1. When we do an update of a maintenance or an incident, if the title or component fields are not empty, do not replace them. This will avoid having to fill them again when we select a template
  2. When creating a template, allow to choose the fields "Start automatically" and "End automatically".

Thank you very much!

Describe the solution you'd like

  1. When we do an update of a maintenance or an incident, if the title or component fields are not empty, do not replace them. This will avoid having to fill them again when we select a template
  2. When creating a template, allow to choose the fields "Start automatically" and "End automatically".

Describe alternatives you've considered

  1. When we do an update of a maintenance or an incident, if the title or component fields are not empty, do not replace them. This will avoid having to fill them again when we select a template
  2. When creating a template, allow to choose the fields "Start automatically" and "End automatically".

Additional context

No response

[Feature]: Choose the components status on maintenance/incident

Is your feature request related to a problem? Please describe.

I'm always frustrated when I make a maintenance or an incident. I can not choose the components status.

For maintenance, the status is always to "Operational"
For incident, the status is always to "Degraded Performance"

Is it possible to do a drop menu to choose the status?

Thank you.

Describe the solution you'd like

Describe alternatives you've considered

Additional context

No response

Metric Data Caching

Problem

Currently, the metric points (if you have activated the feature) are written to the cache every 15 minutes. However, problems can occur if too many points are added within one minute. The job may stop and not finish the cache process, leaving outdated data in the cache.

Current Workaround

Deactivate the Metric Cache. Unfortunately, there is currently no other option except to deactivate the metrics cache. If you do not have any problems with the caching process, you can leave this function activated, but please note that this problem may occur sooner or later.

Possible fix

We need to change the way the metric points are loaded from the database. Currently, this process is not very performant and takes a long time. In the next minor release (v1.8.0) this problem will hopefully be solved.

[Bug]: Markdown rendering is not applied in email

Description of the Bug

Good morning @herrtxbias

When adding a markdown content, the text is well formatted in status page but the email is not.

Here the result on my status page

image

Corresponding code :

image

Email rendering :

image

Here is the email source

image

Expected behavior

...

Reproduction

...

Version

2.0.0 (Preview)

Information about your Device

...

Relevant log output

No response

[Feature]: Add Historic Data Bars

Is your feature request related to a problem? Please describe.

No Ability to see historic status of a component from the public view

Describe the solution you'd like

Add historic Data bars that show when a Component has been down either across 30,60 or 90 days. Similar to other public offerings like statuspage.io, freshstatus and the likes of

Describe alternatives you've considered

N/A

Additional context

No response

Wrong update note in Dashboard

Describe the bug
Currently, the update note shows up, even if you are running the latest Version.

Screenshots
image

Additional context
This is due how we get the Current Version. We will change this behaviour in the next fix Update (v1.8.1).

If you are running the latest Version, you can ignore this Message.

[Bug]: Unusable with many components

Description of the Bug

We added 140 components with the api and now the website is not useable any more.

https://status.test.hhu.de/

I think the many small bars for incidents cause an issue

Expected behavior

Website should work normally

Reproduction

  1. Go to Backend and create many components in some component groups
  2. Go to website
  3. See error: Page is not loading

Version

2.0.0 (Preview)

Information about your Device

Desktop (please complete the following information):

  • OS: ArchLinux
  • Browser: Firefox
  • Version: 111.0.1

Relevant log output

No response

[Feature]: Add backdated Incidents and Maintenance

Is your feature request related to a problem? Please describe.

When I try to add some Incident or Maintenance which Resolved/Completed.
I expect it will be added in Datebare on the date I set up.
But it is adding in Datebare as today's.

Describe the solution you'd like

Example: I have the incident, which was 17.02.23 at 17:00, but I forgot to add it to status page, and when I tried to add it today, it added it as today's

Create:
image

Result:
image

Describe alternatives you've considered

Mentioned problem is actual and for Maintenance.

Thank you in advance.

Additional context

No response

[Bug]: Duplicate message-id in email

Description of the Bug

Dear @herrtxbias

For my test I have 3 subscribers with same notification options.

When I create a maintenance/incident, only 2 of 3 subscribers are receiving the emails.
Here is the log for the subscriber that is not receiving email :

Mar 30 07:32:54 XXXXX postfix/smtp[97636]: B911385C63: to=[email protected], relay=gmail-smtp-in.l.google.com[2a00:1450:400c:c07::1b]:25, delay=0.65, delays=0.01/0.02/0.43/0.19, dsn=5.7.1, status=bounced (host gmail-smtp-in.l.google.com[2a00:1450:400c:c07::1b] said: 550-5.7.1 [2001:41d0:302:1000::21a9] Messages missing a valid messageId header 550 5.7.1 are not accepted. n15-20020a5d4c4f000000b002d4a890394asi25563373wrt.324 - gsmtp (in reply to end of DATA command))

No failed task in the admin.

Any ideas ?

Expected behavior

...

Reproduction

...

Version

2.0.0 (Preview)

Information about your Device

...

Relevant log output

No response

[Feature]: Hide days with not incidents

Is your feature request related to a problem? Please describe.

When no incidents happen there is a quiet long "empty" list with only dates.

Describe the solution you'd like

It would be nice to have an option to hide the past days with no incidents.

Describe alternatives you've considered

No idea yet

Additional context

No response

[Feature]: Can we show the timezone with the incidents.

Is your feature request related to a problem? Please describe.

It will be much helpful when we mention the time zone of the issue happening. So it will be more clear to the readers to understand the time of the issue occurrence.

Describe the solution you'd like

My suggestion will be either we need to have the option to show the time zone there in the status page.

In the dashboard, we can choose/select the timezone.

or we need option to either show the timing as UTC or IST etc..

Describe alternatives you've considered

The option to show the timezone of the issue occurrence.

Additional context

No response

[Bug]: Unable to login after install

Description of the Bug

The first login requires a otp pin but it is not possible to add a device without login

Expected behavior

Manage.py command should be available to setup otp or disable otp

Reproduction

  1. Install
  2. Login at /admin/

Version

2.0.0 (Preview)

Information about your Device

Desktop (please complete the following information):

  • OS: [e.g. iOS] Linux
  • Browser [e.g. chrome, safari] Firefox
  • Version [e.g. 22] 100+

Relevant log output

No response

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.