Skip to content

Commit

Permalink
Add notification model (#3452)
Browse files Browse the repository at this point in the history
* Add notification model

* Update notification model
  • Loading branch information
dimasciput authored Aug 24, 2023
1 parent 0170036 commit 4cf37d1
Show file tree
Hide file tree
Showing 8 changed files with 144 additions and 60 deletions.
8 changes: 6 additions & 2 deletions bims/adapters/account_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
from django.contrib.auth import get_user_model
from django.contrib.sites.models import Site
from bims.models import Profile
from bims.models.notification import (
get_recipients_for_notification,
ACCOUNT_CREATED
)


class LocalAccountAdapter(DefaultAccountAdapter, BaseInvitationsAdapter):
Expand Down Expand Up @@ -127,7 +131,6 @@ def clean_password(self, password, user=None):

def respond_user_inactive(self, request, user):
# Sent email to superuser
staffs = get_user_model().objects.filter(is_superuser=True)
try:
current_site = Site.objects.get_current()
profile = Profile.objects.get(user=user)
Expand Down Expand Up @@ -156,7 +159,8 @@ def respond_user_inactive(self, request, user):
subject,
email_body,
settings.DEFAULT_FROM_EMAIL,
list(staffs.values_list('email', flat=True)))
get_recipients_for_notification(ACCOUNT_CREATED)
)
msg.send()

except BaseException:
Expand Down
17 changes: 16 additions & 1 deletion bims/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@
DecisionSupportTool,
Unit,
DecisionSupportToolName,
WaterTemperatureThreshold
WaterTemperatureThreshold,
Notification
)
from bims.models.climate_data import ClimateData
from bims.utils.fetch_gbif import merge_taxa_data
Expand Down Expand Up @@ -1723,6 +1724,16 @@ class ClimateDataAdmin(admin.ModelAdmin):
list_display = ('title', 'climate_geocontext_group_key')


class NotificationAdmin(admin.ModelAdmin):
list_display = ('name', 'description', 'get_users')

def get_users(self, obj):
return ", ".join([user.username for user in obj.users.all()])
get_users.short_description = 'Users'

filter_horizontal = ('users',)


# Re-register GeoNode's Profile page
admin.site.unregister(Profile)
admin.site.register(Profile, CustomUserAdmin)
Expand Down Expand Up @@ -1810,3 +1821,7 @@ class ClimateDataAdmin(admin.ModelAdmin):
admin.site.register(
WaterTemperatureThreshold, WaterTemperatureThresholdAdmin
)
admin.site.register(
Notification,
NotificationAdmin
)
59 changes: 10 additions & 49 deletions bims/api_views/send_notification_to_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,50 +13,23 @@

from bims.models import LocationSite
from bims.models.survey import Survey
from bims.models.notification import (
get_recipients_for_notification,
SITE_VISIT_VALIDATION,
SITE_VALIDATION
)


def send_notification_validation(pk, model = None, request = None):
site = Site.objects.get_current().domain
permission = (
Permission.objects.filter(
content_type__app_label='bims', codename='can_validate_data')
validator_emails = get_recipients_for_notification(
SITE_VISIT_VALIDATION
)
validators = (
Profile.objects.filter(
Q(user_permissions__in=permission) |
Q(groups__permissions__in=permission)
).distinct().values_list('email', flat=True)
)
superusers = (
Profile.objects.filter(
is_superuser=True
).values_list('email', flat=True)
)
validator_emails = list(superusers)
if validators:
validator_emails += list(validators)

if pk is not None:
if model is None:
try:
site_visit = Survey.objects.get(pk=pk)

try:
class_permission = Permission.objects.filter(
content_type__app_label='bims',
codename='can_validate_site_visit'
)
class_validators = (
Profile.objects.filter(
Q(user_permissions__in=class_permission) |
Q(groups__permissions__in=class_permission)
).values_list('email', flat=True)
)
validator_emails += list(class_validators)
except AttributeError:
pass

validator_emails = filter(None, validator_emails)
site_visit.ready_for_validation = True
site_visit.save()

Expand Down Expand Up @@ -112,21 +85,9 @@ def send_notification_validation(pk, model = None, request = None):
try:
new_site = LocationSite.objects.get(pk=pk)

try:
class_permission = Permission.objects.filter(
content_type__app_label='bims',
codename='can_validate_site'
)
class_validators = (
Profile.objects.filter(
Q(user_permissions__in=class_permission) |
Q(groups__permissions__in=class_permission)
).values_list('email', flat=True)
)
validator_emails += list(class_validators)

except AttributeError:
pass
validator_emails = get_recipients_for_notification(
SITE_VALIDATION
)

new_site.ready_for_validation = True
new_site.save()
Expand Down
15 changes: 9 additions & 6 deletions bims/download/csv_download.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@
import json
import os
import errno
import zipfile
from datetime import datetime, date
from datetime import datetime
from django.conf import settings
from django.http import HttpResponseForbidden
from django.template.loader import render_to_string
from django.core.mail import EmailMultiAlternatives
from django.contrib.sites.models import Site
from django.contrib.auth import get_user_model
from rest_framework.views import APIView
from rest_framework.response import Response
from preferences import preferences
from bims.tasks.collection_record import download_collection_record_task
from bims.tasks.email_csv import send_csv_via_email
from bims.models.notification import (
get_recipients_for_notification, DOWNLOAD_REQUEST
)


class CsvDownload(APIView):
Expand Down Expand Up @@ -102,7 +102,9 @@ def send_new_csv_notification(user, date_request, approval_needed=True):
:return:
"""
email_template = 'csv_download/csv_new'
staffs = get_user_model().objects.filter(is_superuser=True)
recipients = get_recipients_for_notification(
DOWNLOAD_REQUEST
)
ctx = {
'username': user.username,
'current_site': Site.objects.get_current(),
Expand All @@ -126,7 +128,8 @@ def send_new_csv_notification(user, date_request, approval_needed=True):
subject,
message,
settings.DEFAULT_FROM_EMAIL,
list(staffs.values_list('email', flat=True)))
recipients
)
msg.content_subtype = 'html'
msg.send()

Expand Down
24 changes: 24 additions & 0 deletions bims/migrations/0344_alter_bimsdocument_authors_notification.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Generated by Django 4.1.10 on 2023-08-23 09:07

from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('bims', '0343_locationsite_ecosystem_type_and_more'),
]

operations = [
migrations.CreateModel(
name='Notification',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(choices=[('SITE_VISIT_VALIDATION', 'Site visit is ready to be validated'), ('DOWNLOAD_REQUEST', 'Download request notification'), ('ACCOUNT_CREATED', 'Account created email notification'), ('SASS_CREATED', 'SASS created email notification')], max_length=255, unique=True)),
('description', models.TextField(blank=True)),
('users', models.ManyToManyField(related_name='notifications', to=settings.AUTH_USER_MODEL)),
],
),
]
2 changes: 2 additions & 0 deletions bims/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,5 @@
from bims.models.decision_support_tool import * # noqa
from bims.models.geocontext_setting import GeocontextSetting
from bims.models.decision_support_tool_name import * # noqa

from bims.models.notification import Notification
70 changes: 70 additions & 0 deletions bims/models/notification.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
from typing import List

from django.db import models
from django.conf import settings
from django.contrib.auth import get_user_model

# Notification Choices
SITE_VISIT_VALIDATION = 'SITE_VISIT_VALIDATION'
SITE_VALIDATION = 'SITE_VALIDATION'
NEW_TAXONOMY = 'NEW_TAXONOMY'
DOWNLOAD_REQUEST = 'DOWNLOAD_REQUEST'
ACCOUNT_CREATED = 'ACCOUNT_CREATED'
SASS_CREATED = 'SASS_CREATED'

NOTIFICATION_TYPES = (
(SITE_VISIT_VALIDATION, 'Site visit is ready to be validated'),
(SITE_VALIDATION, 'Site is ready to be validated'),
(DOWNLOAD_REQUEST, 'Download request notification'),
(ACCOUNT_CREATED, 'Account created email notification'),
(SASS_CREATED, 'SASS created email notification'),
(NEW_TAXONOMY, 'New taxonomy email notification'),
)


class Notification(models.Model):
name = models.CharField(
max_length=255,
choices=NOTIFICATION_TYPES,
unique=True
)
description = models.TextField(
blank=True
)
users = models.ManyToManyField(
settings.AUTH_USER_MODEL,
related_name='notifications',
blank=False
)

@property
def user_emails(self):
return [user.email for user in self.users.all()]

def __str__(self):
return self.name


def get_recipients_for_notification(notification_name: str) -> List[str]:
"""
Fetches the recipient emails for a given notification type.
If the specific notification type isn't found, returns the emails of
all superusers as a fallback.
Args:
- notification_name (str): The name of the notification type to
fetch recipients for.
Returns:
- List[str]: A list of email addresses.
"""
try:
recipients = Notification.objects.get(name=notification_name).user_emails
except Notification.DoesNotExist:
recipients = list(
get_user_model().objects.filter(
is_superuser=True
).values_list('email', flat=True)
)
return recipients
9 changes: 7 additions & 2 deletions bims/models/taxonomy.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
from bims.utils.iucn import get_iucn_status
from bims.permissions.generate_permission import generate_permission
from bims.models.vernacular_name import VernacularName
from bims.models.notification import (
get_recipients_for_notification,
NEW_TAXONOMY
)
from django.db.models import JSONField

ORIGIN_CATEGORIES = {
Expand Down Expand Up @@ -365,7 +369,7 @@ def name(self):

def send_new_taxon_email(self, taxon_group_id=None):
current_site = Site.objects.get_current()
staffs = get_user_model().objects.filter(is_superuser=True)
recipients = get_recipients_for_notification(NEW_TAXONOMY)
email_body = render_to_string(
'notifications/taxonomy/added_message.txt',
{
Expand All @@ -378,7 +382,8 @@ def send_new_taxon_email(self, taxon_group_id=None):
'[{}] New Taxonomy email notification'.format(current_site),
email_body,
settings.DEFAULT_FROM_EMAIL,
list(staffs.values_list('email', flat=True)))
recipients
)
msg.send()


Expand Down

0 comments on commit 4cf37d1

Please sign in to comment.