Compare commits

..

No commits in common. "5fa3d32c57549b11c48bc285a09616c59150a0ce" and "afde1a5f962a3b6f9e436d62e850cc8a7f9f903a" have entirely different histories.

4 changed files with 28 additions and 93 deletions

View file

@ -10,7 +10,6 @@ from django.core.exceptions import ValidationError
from django.db import IntegrityError, models, transaction
from django.utils import timezone
from django.utils.functional import cached_property
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
from encrypted_fields.fields import EncryptedJSONField
from kubernetes import client, config
@ -20,10 +19,6 @@ from servala.core import rules as perms
from servala.core.models.mixins import ServalaModelMixin
from servala.core.validators import kubernetes_name_validator
SUPPORT_MESSAGE_TEMPLATE = _(
"Need help? We're happy to help via the <a href='{support_url}'>support form</a>."
)
class ServiceCategory(ServalaModelMixin, models.Model):
"""
@ -620,9 +615,10 @@ class ServiceInstance(ServalaModelMixin, models.Model):
context=context,
)
except IntegrityError:
raise cls._format_error_with_support(
"An instance with this name already exists in this organization. Please choose a different name.",
organization,
raise ValidationError(
_(
"An instance with this name already exists in this organization. Please choose a different name."
)
)
try:
@ -661,16 +657,10 @@ class ServiceInstance(ServalaModelMixin, models.Model):
try:
error_body = json.loads(e.body)
reason = error_body.get("message", str(e))
raise cls._format_error_with_support(
"Kubernetes API error: {error}.", organization, error=reason
)
raise ValidationError(_("Kubernetes API error: {}").format(reason))
except (ValueError, TypeError):
raise cls._format_error_with_support(
"Kubernetes API error: {error}.", organization, error=str(e)
)
raise cls._format_error_with_support(
"Error creating instance: {error}.", organization, error=str(e)
)
raise ValidationError(_("Kubernetes API error: {}").format(str(e)))
raise ValidationError(_("Error creating instance: {}").format(str(e)))
return instance
def update_spec(self, spec_data, updated_by):
@ -691,27 +681,28 @@ class ServiceInstance(ServalaModelMixin, models.Model):
self.save() # Updates updated_at timestamp
except ApiException as e:
if e.status == 404:
raise self._format_error_with_support(
"Service instance not found in Kubernetes. It may have been deleted externally.",
self.organization,
raise ValidationError(
_(
"Service instance not found in Kubernetes. It may have been deleted externally."
)
)
try:
error_body = json.loads(e.body)
reason = error_body.get("message", str(e))
raise self._format_error_with_support(
"Kubernetes API error updating instance: {error}.",
self.organization,
error=reason,
raise ValidationError(
_("Kubernetes API error updating instance: {error}").format(
error=reason
)
)
except (ValueError, TypeError):
raise self._format_error_with_support(
"Kubernetes API error updating instance: {error}.",
self.organization,
error=str(e),
raise ValidationError(
_("Kubernetes API error updating instance: {error}").format(
error=str(e)
)
)
except Exception as e:
raise self._format_error_with_support(
"Error updating instance: {error}.", self.organization, error=str(e)
raise ValidationError(
_("Error updating instance: {error}").format(error=str(e))
)
@transaction.atomic
@ -863,24 +854,3 @@ class ServiceInstance(ServalaModelMixin, models.Model):
return {"error": str(e)}
except Exception as e:
return {"error": str(e)}
@classmethod
def _format_error_with_support(cls, message, organization, **kwargs):
"""
Helper method to format error messages with support links.
Args:
message: The error message template (without support text)
organization: The organization object to get the support URL
**kwargs: Additional format parameters for the message
Returns:
A ValidationError with the formatted message including support link
"""
support_url = organization.urls.support
# Combine the main message with the support message template
full_message = _("{message} {support_message}").format(
message=_(message).format(**kwargs),
support_message=SUPPORT_MESSAGE_TEMPLATE.format(support_url=support_url),
)
return ValidationError(mark_safe(full_message))

View file

@ -9,7 +9,7 @@
<script>
document.addEventListener('DOMContentLoaded', function() {
const alert = document.getElementById('auto-dismiss-alert-{{ forloop.counter0|default:'0' }}');
if (alert && !alert.classList.contains('alert-danger')) {
if (alert) {
setTimeout(function() {
let opacity = 1;
const fadeOutInterval = setInterval(function() {

View file

@ -1,14 +1,9 @@
from django.utils.functional import cached_property
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
from django.views.generic import UpdateView
from rules.contrib.views import AutoPermissionRequiredMixin, PermissionRequiredMixin
from servala.core.models import Organization
# Import the support message template from the service model
from servala.core.models.service import SUPPORT_MESSAGE_TEMPLATE
class HtmxViewMixin:
fragments = []
@ -95,22 +90,3 @@ class OrganizationViewMixin(PermissionRequiredMixin):
def has_permission(self):
return self.has_organization_permission() and super().has_permission()
def format_error_with_support(self, message, **kwargs):
"""
Helper method to format error messages with support links for frontend views.
Args:
message: The error message template (without support text)
**kwargs: Additional format parameters for the message
Returns:
A formatted message with support link
"""
support_url = self.organization.urls.support
# Combine the main message with the support message template
full_message = _("{message} {support_message}").format(
message=_(message).format(**kwargs),
support_message=SUPPORT_MESSAGE_TEMPLATE.format(support_url=support_url),
)
return mark_safe(full_message)

View file

@ -144,10 +144,7 @@ class ServiceOfferingDetailView(OrganizationViewMixin, HtmxViewMixin, DetailView
form = self.get_instance_form()
if not form: # Should not happen if context_object is valid, but as a safeguard
messages.error(
self.request,
self.format_error_with_support("Could not initialize service form."),
)
messages.error(self.request, _("Could not initialize service form."))
return self.render_to_response(context)
if form.is_valid():
@ -164,10 +161,7 @@ class ServiceOfferingDetailView(OrganizationViewMixin, HtmxViewMixin, DetailView
messages.error(self.request, e.message or str(e))
except Exception as e:
messages.error(
self.request,
self.format_error_with_support(
"Error creating instance: {error}.", error=str(e)
),
self.request, _("Error creating instance: {}").format(str(e))
)
# If the form is not valid or if the service creation failed, we render it again
@ -372,10 +366,7 @@ class ServiceInstanceUpdateView(
return self.form_invalid(form)
except Exception as e:
messages.error(
self.request,
self.format_error_with_support(
"Error updating instance: {error}.", error=str(e)
),
self.request, _("Error updating instance: {error}").format(error=str(e))
)
return self.form_invalid(form)
@ -444,11 +435,9 @@ class ServiceInstanceDeleteView(
except Exception as e:
messages.error(
self.request,
self.format_error_with_support(
"An error occurred while trying to delete instance '{name}': {error}.",
name=self.object.name,
error=str(e),
),
_(
"An error occurred while trying to delete instance '{name}': {error}"
).format(name=self.object.name, error=str(e)),
)
response = HttpResponse()
response["HX-Redirect"] = str(self.object.urls.base)