From 6f5e24b4ccb6904672a036787adf0aa2eae6412f Mon Sep 17 00:00:00 2001 From: Horilla Date: Thu, 25 Jan 2024 15:46:12 +0530 Subject: [PATCH] [ADD] DASHBOARD: Announcement to main dashboad --- base/announcement.py | 14 +- base/forms.py | 14 ++ base/models.py | 10 ++ base/templates/announcement/announcement.html | 116 +++++----------- .../announcement/announcement_one.html | 131 ++++++++++++++++++ base/templates/announcement/expiry_day.html | 19 +++ base/templates/base/general_settings.html | 6 + base/urls.py | 7 +- base/views.py | 32 +++++ 9 files changed, 261 insertions(+), 88 deletions(-) create mode 100644 base/templates/announcement/announcement_one.html create mode 100644 base/templates/announcement/expiry_day.html create mode 100644 base/templates/base/general_settings.html diff --git a/base/announcement.py b/base/announcement.py index c83914289..5dd5948de 100644 --- a/base/announcement.py +++ b/base/announcement.py @@ -1,4 +1,4 @@ -from django.http import HttpResponse, JsonResponse +from django.http import HttpResponse, HttpResponseRedirect, JsonResponse from django.shortcuts import redirect, render from base.forms import AnnouncementForm, AnnouncementcommentForm from base.models import Announcement, AnnouncementComment @@ -123,7 +123,7 @@ def delete_announcement(request, anoun_id): announcement = Announcement.objects.filter(id=anoun_id) announcement.delete() messages.success(request, _("Announcement deleted successfully.")) - return redirect(announcement_view) + return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) @login_required @@ -249,3 +249,13 @@ def comment_view(request, anoun_id): {"comments": comments, "no_comments": no_comments}, ) + +@login_required +def announcement_single_view(request, anoun_id): + + """ + This method is used to render single announcemnts. + """ + + announcement = Announcement.objects.filter(id=anoun_id) + return render(request, "announcement/announcement_one.html", {'announcements': announcement}) diff --git a/base/forms.py b/base/forms.py index b9404fe21..58a432eb3 100644 --- a/base/forms.py +++ b/base/forms.py @@ -22,6 +22,7 @@ from employee.models import Employee, EmployeeTag from base.models import ( Announcement, AnnouncementComment, + AnnouncementExpire, Attachment, Company, Department, @@ -1656,6 +1657,7 @@ class AnnouncementForm(ModelForm): excluded_fields = ['created_on'] widgets = { "description": forms.Textarea(attrs={"data-summernote": ""}), + "expire_date": DateInput(attrs={"type": "date"}), } @@ -1696,3 +1698,15 @@ class AnnouncementcommentForm(ModelForm): model = AnnouncementComment fields = ('comment',) +class AnnouncementExpireForm(ModelForm): + """ + Announcement Expire form + """ + + class Meta: + """ + Meta class for additional options + """ + + model = AnnouncementExpire + fields = ('days',) \ No newline at end of file diff --git a/base/models.py b/base/models.py index cb2b67c5f..65b7f856a 100644 --- a/base/models.py +++ b/base/models.py @@ -1170,6 +1170,15 @@ class Attachment(models.Model): def __str__(self): return self.file.name + +class AnnouncementExpire(models.Model): + """ + This model for setting a expire days for announcement if no expire date for announcement + """ + days = models.IntegerField(null=True, blank = True, default = 30) + + + class Announcement(models.Model): """ @@ -1179,6 +1188,7 @@ class Announcement(models.Model): description = models.TextField(null=True) attachments = models.ManyToManyField(Attachment, related_name='announcement_attachments', blank=True) created_on = models.DateTimeField(auto_now_add=True) + expire_date = models.DateField(null=True, blank=True) department = models.ManyToManyField(Department, blank=True) job_position = models.ManyToManyField(JobPosition, blank=True) diff --git a/base/templates/announcement/announcement.html b/base/templates/announcement/announcement.html index ca43ab082..bd5bdfea3 100644 --- a/base/templates/announcement/announcement.html +++ b/base/templates/announcement/announcement.html @@ -1,4 +1,4 @@ -{% extends "index.html" %} +{% comment %} {% extends "index.html" %} {% endcomment %} {% load i18n %} {% load static %} {% load basefilters %} @@ -8,32 +8,34 @@
{% trans "Announcements" %}
-
- -
-
- -
+ {% if perms.announcemnt.add_announcemnt or request.user|is_reportingmanager %} +
+ +
+ +
+ +
+
-
+ {% endif %} + - - {% if perms.announcemnt.add_announcemnt or request.user|is_reportingmanager %} - + {% endif %}
@@ -128,7 +130,7 @@ {% endif %} {% if attachment.file.url|slice:"-4:" == '.png' or attachment.file.url|slice:"-4:" == '.jpg' or attachment.file.url|slice:"-5:" == '.jpeg' or attachment.file.url|slice:"-4:" == '.gif' or attachment.file.url|slice:"-4:" == '.bmp' or attachment.file.url|slice:"-5:" == '.webp' or attachment.file.url|slice:"-5:" == '.tiff' or attachment.file.url|slice:"-4:" == '.tif' or attachment.file.url|slice:"-4:" == '.svg' %} - Attachment Image + Attachment Image {% else %} @@ -158,21 +160,9 @@ {% endfor %} {% endcomment %} - - - - - - - - - - - - - - - + + +
@@ -301,54 +291,10 @@
{% endfor %}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + diff --git a/base/templates/announcement/announcement_one.html b/base/templates/announcement/announcement_one.html new file mode 100644 index 000000000..6dd40114d --- /dev/null +++ b/base/templates/announcement/announcement_one.html @@ -0,0 +1,131 @@ +{% load i18n %} +{% load static %} +{% load basefilters %} + +
+ +
+ {% trans "Announcement." %} +
+ +
+ +{% for anoun in announcements %} +
+ + {% if perms.base.change_announcement or perms.base.delete_announcement %} +
+ + +
+ {% endif %} + +
+
{{ anoun.title }}
+ + + {% trans "Posted on" %}  {{ anoun.created_on|date:"F j, Y" }}   + {% trans "at" %}   {{ anoun.created_on|time:"g:i A" }} + +
+ +
+

{{ anoun.description|safe }}

+
+ + {% if anoun.department.all %} + + {% endif %} + + {% if anoun.job_position.all %} + + {% endif %} + + + + + + + + +
+ {% endfor %} \ No newline at end of file diff --git a/base/templates/announcement/expiry_day.html b/base/templates/announcement/expiry_day.html new file mode 100644 index 000000000..1b37e0de7 --- /dev/null +++ b/base/templates/announcement/expiry_day.html @@ -0,0 +1,19 @@ +{% load i18n %} + +
+ {% csrf_token %} +
+

{% trans "Announcement Expire" %}

+
+ {{form}} + {% if perms.payroll.change_payrollsettings %} + + {% endif %} + +
+ diff --git a/base/templates/base/general_settings.html b/base/templates/base/general_settings.html new file mode 100644 index 000000000..cba2dbae0 --- /dev/null +++ b/base/templates/base/general_settings.html @@ -0,0 +1,6 @@ +{% extends 'settings.html' %} {% block settings %}{% load i18n %} + + +{% include "announcement/expiry_day.html" %} + +{% endblock settings %} \ No newline at end of file diff --git a/base/urls.py b/base/urls.py index f0c5bd259..3fff200ce 100644 --- a/base/urls.py +++ b/base/urls.py @@ -524,6 +524,7 @@ urlpatterns = [ name="delete-notifications", ), path("settings/currency/", views.settings, name="currency-settings"), + path("settings/general-settings/", views.general_settings, name="general-settings"), path("settings/date-settings/", views.date_settings, name="date-settings"), path("settings/save-date/", views.save_date_format, name="save_date_format"), path("settings/get-date-format/", views.get_date_format, name="get-date-format"), @@ -725,7 +726,7 @@ urlpatterns = [ path('pagination-settings-view',views.pagination_settings_view,name="pagination-settings-view"), - path( + path( "announcement/", announcement.announcement_view, name="announcement" ), @@ -751,5 +752,9 @@ urlpatterns = [ announcement.comment_view, name="announcement-view-comment", ), + path( + "announcement-single-view/", + announcement.announcement_single_view, name="announcement-single-view" + ), ] diff --git a/base/views.py b/base/views.py index 0aac51df3..f285296b0 100644 --- a/base/views.py +++ b/base/views.py @@ -39,6 +39,7 @@ from base.decorators import ( ) from base.methods import closest_numbers, export_data, get_pagination from base.forms import ( + AnnouncementExpireForm, AuditTagForm, CompanyForm, DepartmentForm, @@ -76,6 +77,8 @@ from base.forms import ( WorktyperequestcommentForm, ) from base.models import ( + Announcement, + AnnouncementExpire, Company, DynamicEmailConfiguration, DynamicPagination, @@ -388,10 +391,22 @@ def home(request): }, ) + announcement_list = Announcement.objects.all().order_by('-created_on') + general_expire = AnnouncementExpire.objects.all().first() + general_expire_date = 30 if not general_expire else general_expire.days + + for announcement in announcement_list: + if announcement.expire_date is None: + calculated_expire_date = announcement.created_on + timedelta(days=general_expire_date) + announcement.expire_date = calculated_expire_date + context = { "first_day_of_week": first_day_of_week.strftime("%Y-%m-%d"), "last_day_of_week": last_day_of_week.strftime("%Y-%m-%d"), "employees_with_pending": employees_with_pending, + "announcement" : announcement_list, + "general_expire_date":general_expire_date, + } return render(request, "index.html", context) @@ -3220,6 +3235,23 @@ def settings(request): return render(request, "payroll/settings/payroll_settings.html", {"form": form}) + +@login_required +def general_settings(request): + """ + This method is used to render settings template + """ + instance = AnnouncementExpire.objects.first() + form = AnnouncementExpireForm(instance=instance) + if request.method == "POST": + form = AnnouncementExpireForm(request.POST, instance=instance) + if form.is_valid(): + form.save() + messages.success(request, _("Settings updated.")) + return render(request, "base/general_settings.html", {'form':form}) + + + @login_required @permission_required("base.view_company") def date_settings(request):