91 lines
2.9 KiB
Python
91 lines
2.9 KiB
Python
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
|
|
from django.shortcuts import render
|
|
from rest_framework.views import APIView
|
|
|
|
from core.db.storage import db
|
|
from core.forms import NotificationRuleForm, NotificationSettingsForm
|
|
from core.lib.rules import NotificationRuleData
|
|
from core.models import NotificationRule, NotificationSettings
|
|
from core.views.helpers import ObjectCreate, ObjectDelete, ObjectList, ObjectUpdate
|
|
|
|
|
|
# Notifications - we create a new notification settings object if there isn't one
|
|
# Hence, there is only an update view, not a create view.
|
|
class NotificationsUpdate(LoginRequiredMixin, ObjectUpdate):
|
|
model = NotificationSettings
|
|
form_class = NotificationSettingsForm
|
|
|
|
page_title = "Update your notification settings"
|
|
page_subtitle = (
|
|
"At least the topic must be set if you want to receive notifications."
|
|
)
|
|
|
|
submit_url_name = "notifications_update"
|
|
submit_url_args = ["type"]
|
|
|
|
pk_required = False
|
|
|
|
hide_cancel = True
|
|
|
|
def get_object(self, **kwargs):
|
|
notification_settings, _ = NotificationSettings.objects.get_or_create(
|
|
user=self.request.user
|
|
)
|
|
return notification_settings
|
|
|
|
|
|
class RuleList(LoginRequiredMixin, ObjectList):
|
|
list_template = "partials/rule-list.html"
|
|
model = NotificationRule
|
|
page_title = "List of notification rules"
|
|
|
|
list_url_name = "rules"
|
|
list_url_args = ["type"]
|
|
|
|
submit_url_name = "rule_create"
|
|
|
|
|
|
class RuleCreate(LoginRequiredMixin, PermissionRequiredMixin, ObjectCreate):
|
|
permission_required = "use_rules"
|
|
model = NotificationRule
|
|
form_class = NotificationRuleForm
|
|
|
|
submit_url_name = "rule_create"
|
|
|
|
|
|
class RuleUpdate(LoginRequiredMixin, PermissionRequiredMixin, ObjectUpdate):
|
|
permission_required = "use_rules"
|
|
model = NotificationRule
|
|
form_class = NotificationRuleForm
|
|
|
|
submit_url_name = "rule_update"
|
|
|
|
|
|
class RuleDelete(LoginRequiredMixin, PermissionRequiredMixin, ObjectDelete):
|
|
permission_required = "use_rules"
|
|
model = NotificationRule
|
|
|
|
|
|
class RuleClear(LoginRequiredMixin, PermissionRequiredMixin, APIView):
|
|
permission_required = "use_rules"
|
|
|
|
def post(self, request, type, pk):
|
|
template_name = "partials/notify.html"
|
|
rule = NotificationRule.objects.get(pk=pk, user=request.user)
|
|
if isinstance(rule.match, dict):
|
|
for index in rule.match:
|
|
rule.match[index] = None
|
|
rule.save()
|
|
|
|
rule_data = NotificationRuleData(rule.user, rule, db=db)
|
|
rule_data.clear_database_matches()
|
|
|
|
cleared_indices = ", ".join(rule.match)
|
|
context = {
|
|
"message": f"Cleared match status for indices: {cleared_indices}",
|
|
"class": "success",
|
|
}
|
|
response = render(request, template_name, context)
|
|
response["HX-Trigger"] = "notificationruleEvent"
|
|
return response
|