Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
8d81f51
Added the changes for the sending notification at time of registerati…
Ankit-lab809 Jul 1, 2025
3531c83
added changes to add snippet to manage message and title
Ankit-lab809 Jul 3, 2025
8627650
Notifications WIP
Jul 4, 2025
338f10f
added changes for enable/diable notifications
Ankit-lab809 Jul 4, 2025
916a7f3
added changes for enable/diable notifications
Ankit-lab809 Jul 4, 2025
7d30506
Added the js of notificationpreference
Ankit-lab809 Jul 7, 2025
aa6ffd6
WIP notifications frontend
Jul 9, 2025
ebeacb1
Notifications frontend WIP
Jul 9, 2025
06cae38
Notifications Frontend
Jul 9, 2025
de03ba7
changes to send notifiation to opt in users
Ankit-lab809 Jul 11, 2025
bdaf6d7
changes of celery image and configuration
Ankit-lab809 Jul 11, 2025
23edd28
URL clickable and sendign data to push notifications
Jul 15, 2025
2837c7e
Notifications url changes
Jul 16, 2025
8f73f97
Show description as well in Notifications
Jul 16, 2025
e954dc5
Added changes to create page of the notification preference and also …
Ankit-lab809 Jul 16, 2025
a455865
Merge branch 'main' of github.com:unicef/iogt into feature/registrati…
Ankit-lab809 Jul 16, 2025
2a85409
Reverted commented code
Jul 16, 2025
2d6b42a
Added redirect url for artilce and survey
Ankit-lab809 Jul 18, 2025
a42c8fa
Merged changesMerge branch 'feature/registration_notification_to_user…
Ankit-lab809 Jul 18, 2025
ae3d267
Added notify and publish button on article and survey
Ankit-lab809 Jul 24, 2025
77d39b0
added checkbox
Ankit-lab809 Jul 28, 2025
b21741b
Notifications post demo changes
Jul 28, 2025
77239a2
Shown call out at notification symbol and also sent artcile/survey name
Ankit-lab809 Jul 30, 2025
0a9b112
notifications demo feedback completed
Jul 30, 2025
7091962
Changed icon on profile page
Jul 30, 2025
b38e9a1
Include name in notification and corrected designs
Ankit-lab809 Jul 31, 2025
37b136f
Commiting updated requirements file
Aug 1, 2025
89c1cec
Merge branch 'main' into feature/registration_notification_to_users
Aug 7, 2025
74ee706
3.0.9-rc.1
shubhamgoel02 Aug 7, 2025
a50bf74
added dependencies of celery
Ankit-lab809 Aug 7, 2025
a2f6b69
recreated admin_notificaitons migrations
Aug 8, 2025
daa2f41
3.0.9-rc.2
shubhamgoel02 Aug 8, 2025
9ae9e79
Added svg icon
Ankit-lab809 Aug 11, 2025
004ff10
bell icon was not showing up because of library security issue
Aug 11, 2025
7db29e5
added po files for nigeria countries
Ankit-lab809 Aug 11, 2025
8cc9959
added changes in the csv files
Ankit-lab809 Aug 11, 2025
9c3771d
3.0.9-rc.3
shubhamgoel02 Aug 12, 2025
2f9d009
added celery configs
Ankit-lab809 Aug 12, 2025
60cdbd0
Merged changes Merge branch 'feature/registration_notification_to_use…
Ankit-lab809 Aug 12, 2025
c835896
3.0.9-rc.4
shubhamgoel02 Aug 12, 2025
2ddc186
chnaged redis image name
Ankit-lab809 Aug 12, 2025
7425da1
Merged changes Merge branch 'feature/registration_notification_to_use…
Ankit-lab809 Aug 12, 2025
6ef03a8
3.0.9-rc.5
shubhamgoel02 Aug 12, 2025
30ed0d0
added translations
Ankit-lab809 Aug 17, 2025
827a00d
done changes in po files
Ankit-lab809 Aug 18, 2025
57c1b4f
removed unnecessary code
Ankit-lab809 Aug 18, 2025
cddc5c3
Merged with nigeria languages Merge branch 'nigerian_languages_integr…
Ankit-lab809 Aug 18, 2025
0c16535
changed in po files
Ankit-lab809 Aug 18, 2025
39ad40d
Merge code Merge branch 'feature/registration_notification_to_users' …
Ankit-lab809 Aug 18, 2025
4ba9f60
3.0.9-rc.6
shubhamgoel02 Aug 18, 2025
cb0f81b
changed in the remember me text
Ankit-lab809 Aug 21, 2025
8c70877
Update base.py
shubhamgoel02 Aug 21, 2025
b52995c
3.0.9-rc.7
shubhamgoel02 Aug 21, 2025
4d87206
Update celery.py
shubhamgoel02 Aug 21, 2025
1ca566e
3.0.9-rc.8
shubhamgoel02 Aug 21, 2025
e49a1d4
Merged code
Ankit-lab809 Aug 21, 2025
cf3a70c
MergedMerge branch 'feature/merge_notification_and_nigeria_translatio…
Ankit-lab809 Aug 21, 2025
fc79146
Update celery.py
shubhamgoel02 Aug 21, 2025
5393608
3.0.9-rc.9
shubhamgoel02 Aug 21, 2025
27701ab
Create start.sh
shubhamgoel02 Aug 21, 2025
9d3fc29
Update Dockerfile
shubhamgoel02 Aug 21, 2025
8015044
3.0.9-rc.10
shubhamgoel02 Aug 21, 2025
583f771
Update Dockerfile
shubhamgoel02 Aug 25, 2025
4e03e3e
Delete scripts/start.sh
shubhamgoel02 Aug 25, 2025
e92a9f1
3.0.9-rc.11
shubhamgoel02 Aug 25, 2025
f27e697
Merged Merge branch 'nigerian_languages_integration' of https://githu…
Ankit-lab809 Aug 25, 2025
39dd13d
Merged Merge branch 'feature/merge_notification_and_nigeria_translati…
Ankit-lab809 Aug 25, 2025
0043d13
removed unused code and also added translation for remove me text
Ankit-lab809 Aug 25, 2025
2ddee6b
3.0.9-rc.12
shubhamgoel02 Aug 26, 2025
708b171
3.0.9-rc.13
shubhamgoel02 Aug 26, 2025
4aad964
3.0.9-rc.14
shubhamgoel02 Aug 27, 2025
5bd2a5f
Fixed push notifications
Aug 29, 2025
853c5fc
Moved variables to env file
Ankit-lab809 Aug 29, 2025
e7be763
3.0.9-rc.15
shubhamgoel02 Sep 1, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
File renamed without changes.
File renamed without changes.
5 changes: 5 additions & 0 deletions admin_notifications/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.apps import AppConfig


class AdminNotificationsConfig(AppConfig):
name = 'admin_notifications'
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Generated by Django 3.1.14 on 2022-07-29 13:17
# Generated by Django 3.2.25 on 2025-08-08 09:24

from django.db import migrations, models

Expand All @@ -13,13 +13,13 @@ class Migration(migrations.Migration):

operations = [
migrations.CreateModel(
name='Notification',
name='AdminNotification',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('head', models.CharField(max_length=255)),
('body', models.TextField()),
('url', models.URLField(blank=True, null=True)),
('groups', models.ManyToManyField(related_name='notifications', to='auth.Group')),
('groups', models.ManyToManyField(related_name='admin_notifications', to='auth.Group')),
],
),
]
6 changes: 3 additions & 3 deletions notifications/models.py → admin_notifications/models.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
from django.db import models


class Notification(models.Model):
class AdminNotification(models.Model):
head = models.CharField(max_length=255)
body = models.TextField()
url = models.URLField(null=True, blank=True)

groups = models.ManyToManyField(to='auth.Group', related_name='notifications')
groups = models.ManyToManyField(to='auth.Group', related_name='admin_notifications')

def __str__(self):
return self.head

File renamed without changes.
61 changes: 61 additions & 0 deletions admin_notifications/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import json
from user_notifications.models import NotificationMeta, NotificationLog
from wagtail.contrib.modeladmin.views import CreateView
from webpush import send_user_notification
from notifications.signals import notify
from notifications.models import Notification
from iogt_users.models import User


class CreateNotificationView(CreateView):
def form_valid(self, form):
payload = form.cleaned_data.copy()
groups = payload.pop('groups')
users = User.objects.filter(groups__in=groups).distinct()
for user in users:
try:
# 1. Create Notification
notify.send(
sender=self.request.user,
recipient=user,
verb=payload.get('head', 'New Notification'),
description=payload.get('body', ''),
url=payload.get("url", "/")
)

# 2. Get latest Notification for user (created just now)
notif_instance = Notification.objects.filter(recipient=user).order_by('-timestamp').first()
if not notif_instance:
continue # Shouldn't happen, but guard just in case

# 3. Avoid duplicate meta creation
NotificationMeta.objects.get_or_create(notification=notif_instance)

# 4. Send Web Push
send_user_notification(
user=user,
payload={
"title": payload.get("head", "IoGT Notification"),
"body": payload.get("body", ""),
"url": payload.get("url", "/"),
"notification_id": notif_instance.id
},
ttl=1000)
NotificationLog.objects.create(
user=user,
notification_key=payload.get("head", "IoGT Notification"),
tags='',
state="sent",
notification=notif_instance
)
except Exception as e:
# Optional: log failure for user if user or template not found
NotificationLog.objects.create(
user=user,
notification_key=payload.get("head", "IoGT Notification"),
tags='',
state="failed",
error_message=f"Task failure: {str(e)}",
notification=None
)
return super().form_valid(form)
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
from django.conf import settings
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register

from notifications.models import Notification
from notifications.views import CreateNotificationView
from admin_notifications.models import AdminNotification
from admin_notifications.views import CreateNotificationView


class NotificationModelAdmin(ModelAdmin):
model = Notification
menu_label = 'Notifications'
model = AdminNotification
menu_label = 'Admin Notifications'
menu_icon = 'mail'
list_display = ('head', 'body', 'url',)
list_filter = ('groups',)
search_fields = ('head', 'body', 'url',)
menu_order = 601
create_view_class = CreateNotificationView


if settings.PUSH_NOTIFICATION:
modeladmin_register(NotificationModelAdmin)
4 changes: 4 additions & 0 deletions common/translation_utils/translation_status.csv
Original file line number Diff line number Diff line change
Expand Up @@ -716,3 +716,7 @@ Custom permissions,,,,needs translation,,,
Submit,,translate,,has partial translation,,,
Farsi,,not needed,,not needed,,,
Burmese,,not needed,,not needed,,,
Hausa,,not needed,,not needed,,,
Yoruba,,not needed,,not needed,,,
Igbo,,not needed,,not needed,,,
Pidgin,,not needed,,not needed,,,
8 changes: 4 additions & 4 deletions common/translation_utils/translations.csv
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Row type,is in use,comment,English,Spanish,French,Portuguese,Arabic,Swahili,Chichewa,Kinyarwanda,Ndebele,Shona,Kirundi,Malagasy,Nepali,Urdu,Kichwa/Quichua,Russian,Zulu,Tigrinya,Tajik,Kurdish,Khmer,Uzbek,Karakalpak,Indonesian,Sinhala,Tamil,Bengali,Dari,Pashto,Hindi,Ukraine,Turkish,Farsi,Burmese
Language,,,English,Spanish,French,Portuguese,Arabic,Swahili,Chichewa,Kinyarwanda,Ndebele,Shona,Kirundi,Malagasy,Nepali,Urdu,Kichwa/Quichua,Russian,Zulu,Tigrinya,Tajik,Kurdish,Khmer,Uzbek,Karakalpak,Indonesian,Sinhala,Tamil,Bengali,Dari,Pashto,Hindi,Ukraine,Turkish,Farsi,Burmese
ll-LL,,,en,es,fr-CG,pt-MZ,ar-MA,sw-KE,ny-MW,rw-RW,nr-ZW,sn-ZW,rn-BI,mg-MG,ne-NP,ur-PK,qu-EC,ru-RU,zu-ZA,ti-ET,tg-TJ,ku,km-KH,uz-UZ,kaa,id,si,ta,bn-BN,prs,ps,hi,uk,tr,fa,my
ll,,,en,es,fr,pt,ar,sw,ny,rw,nr,sn,rn,mg,ne,ur,qu,ru,zu,ti,tg,ku,km,uz,kaa,id,si,ta,bn,prs,ps,hi,uk,tr,fa,my
Row type,is in use,comment,English,Spanish,French,Portuguese,Arabic,Swahili,Chichewa,Kinyarwanda,Ndebele,Shona,Kirundi,Malagasy,Nepali,Urdu,Kichwa/Quichua,Russian,Zulu,Tigrinya,Tajik,Kurdish,Khmer,Uzbek,Karakalpak,Indonesian,Sinhala,Tamil,Bengali,Dari,Pashto,Hindi,Ukraine,Turkish,Farsi,Burmese,Hausa,Yoruba,Igbo,Pidgin
Language,,,English,Spanish,French,Portuguese,Arabic,Swahili,Chichewa,Kinyarwanda,Ndebele,Shona,Kirundi,Malagasy,Nepali,Urdu,Kichwa/Quichua,Russian,Zulu,Tigrinya,Tajik,Kurdish,Khmer,Uzbek,Karakalpak,Indonesian,Sinhala,Tamil,Bengali,Dari,Pashto,Hindi,Ukraine,Turkish,Farsi,Burmese,Hausa,Yoruba,Igbo,Pidgin
ll-LL,,,en,es,fr-CG,pt-MZ,ar-MA,sw-KE,ny-MW,rw-RW,nr-ZW,sn-ZW,rn-BI,mg-MG,ne-NP,ur-PK,qu-EC,ru-RU,zu-ZA,ti-ET,tg-TJ,ku,km-KH,uz-UZ,kaa,id,si,ta,bn-BN,prs,ps,hi,uk,tr,fa,my,ha,yo,ig,pcm
ll,,,en,es,fr,pt,ar,sw,ny,rw,nr,sn,rn,mg,ne,ur,qu,ru,zu,ti,tg,ku,km,uz,kaa,id,si,ta,bn,prs,ps,hi,uk,tr,fa,my,ha,yo,ig,pcm
Region,,,English,Latin America,"West African, DRC","Angola, Mozambique",Morocco,Kenya,"Malawi, Zambia",Rwanda,Zimbabwe,Zimbabwe,Burundi,Madagascar,Nepal,Pakistan,Ecuador,Russia,South Africa,Ethiopia,Tajikistan,Sorani,Cambodia,Uzbekistan,Karakalpakstan,Indonesia,Sri Lanka,Sri Lanka,Bangladesh,Afghanistan,Afghanistan,India,Ukraine,Turkey,Iran,Myanmar
Section,,,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Homepage,Головна,,,
,,,Polls,Encuestas,Sondages,Votações,استطلاعات الرأي,Utafiti,Kafukufuku ofunsa maganizo a anthu,Amatora,Ikhetho,Sarudzo,Amatora,Fitsapan-kevitra,चुनावहरू,پولز,Tapuykuna,Голосования,Ukuvota,መረጻታት,Назарсанҷиҳо,دەنگدانەکان,ការបោះឆ្នោតស្ទង់មតិ,Tanlovlar,Sorawnama,Jajak pendapat,,,,,,,Опитування,,,
Expand Down
2 changes: 1 addition & 1 deletion docker-compose.test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@ services:
environment:
POSTGRES_USER: iogt
POSTGRES_PASSWORD: iogt
POSTGRES_DB: iogt
POSTGRES_DB: iogt
37 changes: 35 additions & 2 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,43 @@ services:
target: dev
args:
requirements: requirements.dev.txt
environment:
DJANGO_SETTINGS_MODULE: iogt.settings.dev
env_file:
- .env
image: iogt:latest

ports:
- "8000:8000"
depends_on:
- db
volumes:
- ./:/app/
# db:
# image: postgres:14-alpine
# environment:
# POSTGRES_USER: postgres
# POSTGRES_PASSWORD: postgresiogt
# POSTGRES_DB: iogt
celery:
build:
context: ./
target: dev
args:
requirements: requirements.dev.txt
command: celery -A iogt worker -l info
depends_on:
- django
- redis
env_file:
- .env
volumes:
- ./:/app/

redis:
image: redis:7

db:
image: postgres:14-alpine
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgresiogt
POSTGRES_DB: iogt
88 changes: 88 additions & 0 deletions home/migrations/0060_auto_20250703_0253.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# Generated by Django 3.2.25 on 2025-07-03 02:53

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('home', '0059_burmese_locale'),
]

operations = [
migrations.AlterField(
model_name='articlefeedback',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='articlerecommendation',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='articletaggeditem',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='featuredcontent',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='feedbacksettings',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='homepagebanner',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='iogtflatmenuitem',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='localedetail',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='manifestsettings',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='sectiontaggeditem',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='sitesettings',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='svgtopngmap',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='themesettings',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='v1pageurltov2pagemap',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='v1tov2objectmap',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
]
20 changes: 20 additions & 0 deletions home/migrations/0061_article_notification_tags.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Generated by Django 3.2.25 on 2025-07-28 12:22

from django.db import migrations
import modelcluster.fields


class Migration(migrations.Migration):

dependencies = [
('user_notifications', '0003_auto_20250728_1222'),
('home', '0060_auto_20250703_0253'),
]

operations = [
migrations.AddField(
model_name='article',
name='notification_tags',
field=modelcluster.fields.ParentalManyToManyField(blank=True, to='user_notifications.NotificationTag'),
),
]
18 changes: 18 additions & 0 deletions home/migrations/0062_alter_manifestsettings_language.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.2.25 on 2025-08-18 10:31

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('home', '0061_article_notification_tags'),
]

operations = [
migrations.AlterField(
model_name='manifestsettings',
name='language',
field=models.CharField(choices=[('ar', 'Arabic'), ('bn', 'Bengali'), ('ny', 'Chichewa'), ('prs', 'Dari'), ('en', 'English'), ('fa', 'Farsi'), ('fr', 'French'), ('hi', 'Hindi'), ('id', 'Indonesian'), ('kaa', 'Karakalpak'), ('km', 'Khmer'), ('rw', 'Kinyarwanda'), ('rn', 'Kirundi'), ('ku', 'Kurdish'), ('mg', 'Malagasy'), ('my', 'Burmese'), ('ne', 'Nepali'), ('nr', 'Ndebele'), ('ps', 'Pashto'), ('pt', 'Portuguese'), ('qu', 'Quechua'), ('ru', 'Russian'), ('sn', 'Shona'), ('si', 'Sinhala'), ('es', 'Spanish'), ('sw', 'Swahili'), ('tg', 'Tajik'), ('ta', 'Tamil'), ('ti', 'Tigrinya'), ('tr', 'Turkish'), ('uk', 'Ukraine'), ('ur', 'Urdu'), ('uz', 'Uzbek'), ('zu', 'Zulu'), ('xy', 'Testing'), ('ha', 'Hausa'), ('yo', 'Yoruba'), ('ig', 'Igbo'), ('pcm', 'Pidgin')], default='en', help_text='Choose language', max_length=3, verbose_name='Language'),
),
]
15 changes: 9 additions & 6 deletions home/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
from django.utils.encoding import force_str
from django.utils.translation import gettext_lazy as _
from modelcluster.contrib.taggit import ClusterTaggableManager
from modelcluster.fields import ParentalKey, ParentalManyToManyField
from iogt.settings.base import WAGTAIL_CONTENT_LANGUAGES
from modelcluster.fields import ParentalKey
from rest_framework import status
from taggit.models import TaggedItemBase
from wagtail.admin.panels import (
Expand Down Expand Up @@ -55,7 +55,7 @@
)
import iogt.iogt_globals as globals_
from django.db.models import Avg, Count

from user_notifications.models import NotificationTag, NotificationPreference
User = get_user_model()
logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -125,8 +125,12 @@ def get_context(self, request):
):
banners.append(banner_specific)
context['banners'] = banners
show_notification_nudge = False
if request.user and request.user.is_authenticated:
pref = NotificationPreference.objects.filter(user=request.user).first()
context["notification_preference"] = pref
context['user'] = request.user
return context

@property
def offline_urls(self):
return [self.url] + collect_urls_from_streamfield(self.home_featured_content)
Expand Down Expand Up @@ -482,7 +486,7 @@ class Article(AbstractArticle):
# New fields for precomputed values
average_rating = models.FloatField(default=0.0, null=True)
number_of_reviews = models.PositiveIntegerField(default=0, null=True)

notification_tags = ParentalManyToManyField(NotificationTag, blank=True)
content_panels = AbstractArticle.content_panels + [
MultiFieldPanel([
InlinePanel('recommended_articles',
Expand All @@ -492,7 +496,7 @@ class Article(AbstractArticle):
]

promote_panels = AbstractArticle.promote_panels + [
MultiFieldPanel([FieldPanel("tags"), ], heading='Metadata'),
MultiFieldPanel([FieldPanel("tags"), FieldPanel("notification_tags"),], heading='Metadata'),
]

edit_handler_list = [
Expand Down Expand Up @@ -573,7 +577,6 @@ class BannerIndexPage(Page):
parent_page_types = ['home.HomePage']
subpage_types = ['home.BannerPage']


class BannerPage(Page, PageUtilsMixin):
parent_page_types = ['home.BannerIndexPage']
subpage_types = []
Expand Down
Loading