From 7c780f403d9ca03fc58801a9f7e0c6f014510dc8 Mon Sep 17 00:00:00 2001 From: Horilla Date: Tue, 6 May 2025 12:57:27 +0530 Subject: [PATCH] [FIX] BASE: #715 --- base/announcement.py | 11 +- base/forms.py | 3 + base/models.py | 18 ++- .../announcement/announcement_form.html | 25 ++-- .../announcement/announcement_one.html | 2 +- .../announcement_update_form.html | 20 +-- base/templates/announcement/as_p.html | 65 +++++---- base/templates/announcement/comment_view.html | 128 +++++++++--------- static/build/css/sweetalert2.min.css | 2 +- static/images/ui/no_comments.png | Bin 0 -> 22235 bytes 10 files changed, 155 insertions(+), 119 deletions(-) create mode 100644 static/images/ui/no_comments.png diff --git a/base/announcement.py b/base/announcement.py index 48fe65486..6df76eeed 100644 --- a/base/announcement.py +++ b/base/announcement.py @@ -318,14 +318,15 @@ def comment_view(request, anoun_id): """ This method is used to view all comments in the announcements """ + announcement = Announcement.objects.get(id=anoun_id) comments = AnnouncementComment.objects.filter(announcement_id=anoun_id).order_by( "-created_at" ) - announcement = Announcement.objects.get(id=anoun_id) - comments = filter_own_records(request, comments, "base.view_announcementcomment") - no_comments = False - if not comments.exists(): - no_comments = True + if not announcement.public_comments: + comments = filter_own_records( + request, comments, "base.view_announcementcomment" + ) + no_comments = not comments.exists() return render( request, diff --git a/base/forms.py b/base/forms.py index f66a7ef6b..a64c9cbb7 100644 --- a/base/forms.py +++ b/base/forms.py @@ -2390,6 +2390,9 @@ class AnnouncementForm(ModelForm): self.fields["attachments"] = MultipleFileField(label=_("Attachments")) self.fields["attachments"].required = False self.fields["description"].required = False + self.fields["disable_comments"].widget.attrs.update( + {"hx-on:click": "togglePublicComments()"} + ) def save(self, commit: bool = ...) -> Any: attachement = [] diff --git a/base/models.py b/base/models.py index 0b50b373f..4583285c5 100644 --- a/base/models.py +++ b/base/models.py @@ -1518,7 +1518,15 @@ class Announcement(HorillaModel): company_id = models.ManyToManyField( Company, blank=True, related_name="announcement", verbose_name=_("Company") ) - disable_comments = models.BooleanField(default=False) + disable_comments = models.BooleanField( + default=False, verbose_name=_("Disable Comments") + ) + public_comments = models.BooleanField( + default=True, + verbose_name=_("Show Comments to All"), + help_text=_("If enabled, all employees can view each other's comments."), + ) + filtered_employees = models.ManyToManyField( Employee, related_name="announcement_filtered_employees", editable=False ) @@ -1544,6 +1552,14 @@ class Announcement(HorillaModel): viewed_emp.append(i.user) return viewed_emp + def save(self, *args, **kwargs): + """ + if comments are disabled, force public comments to be false + """ + if self.disable_comments: + self.public_comments = False + super().save(*args, **kwargs) + def __str__(self): return self.title diff --git a/base/templates/announcement/announcement_form.html b/base/templates/announcement/announcement_form.html index 628966dcb..fd8d99bf7 100644 --- a/base/templates/announcement/announcement_form.html +++ b/base/templates/announcement/announcement_form.html @@ -1,25 +1,26 @@ {% load i18n %} {% if messages %} - - + + {% endif %} {% if form.errors %} -
-
- {% for error in form.non_field_errors %} -
- {{ error }} +
+
+ {% for error in form.non_field_errors %} +
+ {{ error }} +
+ {% endfor %}
- {% endfor %}
-
{% endif %}

- {% trans "Create Announcements." %} + {% trans "Create " %} {{form.verbose_name}}

-
diff --git a/base/templates/announcement/announcement_one.html b/base/templates/announcement/announcement_one.html index 784aa013a..6d328eaa6 100644 --- a/base/templates/announcement/announcement_one.html +++ b/base/templates/announcement/announcement_one.html @@ -8,7 +8,7 @@
- {% trans "Announcement." %} + {% trans "Announcement" %}
+

+ {% trans "Update" %} {{form.verbose_name}} +

+
-
-
{{ form.non_field_errors }}
- {% for field in form.visible_fields %} -
+{% load static i18n widget_tweaks %} + +
+
{{ form.non_field_errors }}
+ {% for field in form.visible_fields %} + {% if field.field.widget.input_type != "checkbox" %} +
- - {% if field.help_text != '' %} + + {% if field.help_text %} {% endif %}
- {% if field.field.widget.input_type == 'checkbox' %} -
{{ field|add_class:'oh-switch__checkbox' }}
- {% else %} - {{ field|add_class:'form-control' }} - {% endif %} + {{ field|add_class:"form-control" }} {{ field.errors }} + {% if field.name == "attachments" and field.field.widget.input_type == "file" and field.field.widget.attrs.multiple %} {% if form.instance.pk %}
{% for file in form.instance.attachments.all %} - - - + + @@ -41,9 +33,30 @@ {% endif %} {% endif %}
+ {% endif %} + {% endfor %} +
+ {% for field in form.visible_fields %} + {% if field.field.widget.input_type == "checkbox" %} +
+
+ + {% if field.help_text %} + + {% endif %} +
+
+ {{ field|add_class:"oh-switch__checkbox" }} +
+ {{ field.errors }} +
+ {% endif %} {% endfor %}
- {% for field in form.hidden_fields %} - {{ field }} + + {# hidden fields #} + {% for hidden in form.hidden_fields %} + {{ hidden }} {% endfor %}
diff --git a/base/templates/announcement/comment_view.html b/base/templates/announcement/comment_view.html index f56ff5b63..e6264ef4c 100644 --- a/base/templates/announcement/comment_view.html +++ b/base/templates/announcement/comment_view.html @@ -4,95 +4,97 @@ {% if messages %}
- {% for message in messages %} -
{{ message }}
- {% endfor %} + {% for message in messages %} +
{{ message }}
+ {% endfor %}
{% endif %} +
+ + + + {{announcement.title}}{% trans "'s comments" %} +
-
- - - - {{announcement.title}}{% trans "'s comments" %} -
- - {% csrf_token %}
- - -
+ + +
- + -{% if no_comments %} + {% if no_comments %}
- {% trans "There are no comments to show." %} - + {% trans "There are no comments to show." + %} +
-{% else %} + {% else %}
    - {% for comment in comments %} -
  1. + {% for comment in comments %} +
  2. + {{ comment.comment }} {% if perms.base.delete_announcementcomment or request.user == comment.created_by %} - {{ comment.comment }} - - - + + {% endif %} + - -
    - {% trans "By" %} -
    -
    - -
    - - {{ comment.employee_id }} - + +
    + {% trans "By" %} +
    +
    +
    -
    - -
    - {% trans "Date & Time" %} - - {% trans "on" %}  {{ comment.created_at|date:"F j, Y" }}   - {% trans "at" %}   {{ comment.created_at|time:"g:i A" }} + + {{ comment.employee_id }}
    - -
  3. +
- {% endfor %} - +
+ {% trans "Date & Time" %} + + {% trans "on" %}  {{ comment.created_at|date:"F j, Y" }} +   + {% trans "at" %}   {{ comment.created_at|time:"g:i A" }} + +
+ + + {% endfor %} + + + {% endif %} +{% else %} +
+ Page not found. 404. +
{% trans "Comments have been disabled for this announcement." %}
+
{% endif %} diff --git a/static/build/css/sweetalert2.min.css b/static/build/css/sweetalert2.min.css index e1e0084c7..632b32ee2 100644 --- a/static/build/css/sweetalert2.min.css +++ b/static/build/css/sweetalert2.min.css @@ -1556,4 +1556,4 @@ body.swal2-toast-shown .swal2-container.swal2-bottom-right { right: 0; bottom: 0; left: auto -} \ No newline at end of file +} diff --git a/static/images/ui/no_comments.png b/static/images/ui/no_comments.png new file mode 100644 index 0000000000000000000000000000000000000000..b80168a6ea89cc4890f96af9154f16055a41c121 GIT binary patch literal 22235 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 j{@