diff --git a/selfserv/jinja2.py b/selfserv/jinja2.py index 8e4392c..dcfc13f 100644 --- a/selfserv/jinja2.py +++ b/selfserv/jinja2.py @@ -31,6 +31,7 @@ def environment(**options): env.globals.update({ 'import': importlib.import_module, # forgive me for I have sinned 'localtime': lambda dt: timezone.localtime(dt).strftime('%Y-%m-%d %H:%M'), + 'settings': settings, 'static': staticfiles_storage.url, 'url': reverse, 'MEDIA_URL': settings.MEDIA_URL, diff --git a/ssmain/jinja2/ssmain/splash.html b/ssmain/jinja2/ssmain/splash.html index 1442446..6edb876 100644 --- a/ssmain/jinja2/ssmain/splash.html +++ b/ssmain/jinja2/ssmain/splash.html @@ -71,7 +71,7 @@
Membership Portal
-
View and update your membership details.
+
View and update your membership details. Update your bulletin subscription.
diff --git a/ssmembership/jinja2/ssmembership/index.html b/ssmembership/jinja2/ssmembership/index.html index f6125b3..b115030 100644 --- a/ssmembership/jinja2/ssmembership/index.html +++ b/ssmembership/jinja2/ssmembership/index.html @@ -26,7 +26,7 @@

Membership details

-
+
{{ member.id }}
@@ -35,7 +35,7 @@
-
+
{{ member.email }}
@@ -71,10 +71,40 @@
-
+
{{ member.expires.strftime('%d %B %Y') }}
+ + {% if 'sspromotions' in settings.INSTALLED_APPS %} +
+

Bulletin subscriptions

+ +
+ + +
+
+ +
+ {% for group in import('sspromotions.models').Group.objects.all() %} + {% if group.contains_member(member) or group.subscribable %} +
+
+ + +
+
+ {% endif %} + {% endfor %} +
+
+ {% endif %} +
{% if errors %}
    @@ -96,6 +126,9 @@ $('.ui.dropdown').dropdown(); $('#drop_year').dropdown('set selected', '{{ member.year }}'); $('#drop_msa').dropdown('set selected', '{{ '1' if member.is_msa else '0' }}'); + {% if 'sspromotions' in settings.INSTALLED_APPS %} + $('#drop_bulletin_subscribe').dropdown('set selected', '{{ '1' if import('sspromotions.models').BulletinSubscription.is_member_subscribed(member) else '0' }}'); + {% endif %} {% endif %} {% endblock %} diff --git a/ssmembership/views.py b/ssmembership/views.py index 8e198f8..a7e408d 100644 --- a/ssmembership/views.py +++ b/ssmembership/views.py @@ -52,6 +52,15 @@ def index(request): }) member.save() - return render(request, 'ssmembership/index.html', {'member': member, 'years': models.Member.YEARS}) - return render(request, 'ssmembership/index.html', {'member': member}) + # Update bulletin + if 'sspromotions' in settings.INSTALLED_APPS: + import sspromotions.models + sspromotions.models.BulletinSubscription.set_member_subscribed(member, True if request.POST['bulletin_subscribe'] == '1' else False) + for group in sspromotions.models.Group.objects.filter(subscribable=True).all(): + if ('bulletin_group_' + str(group.id)) in request.POST and request.POST['bulletin_group_' + str(group.id)]: + group.subscribe_member(member, True) + else: + group.subscribe_member(member, False) + + return render(request, 'ssmembership/index.html', {'member': member, 'years': models.Member.YEARS}) diff --git a/sspromotions/models.py b/sspromotions/models.py index 6cf7eaa..ca25bb9 100644 --- a/sspromotions/models.py +++ b/sspromotions/models.py @@ -14,6 +14,8 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from ssmembership.models import Member + from django.contrib.auth.models import User from django.conf import settings @@ -27,6 +29,9 @@ class Group(models.Model): managers = JSONField(default=[], blank=True) + class Meta: + ordering = ['order', 'id'] + def __str__(self): return self.name @@ -41,8 +46,40 @@ class Group(models.Model): return True return False - class Meta: - ordering = ['order', 'id'] + def contains_member(self, member): + if self.subscribable: + return GroupSubscription.objects.filter(member=member, group=self).count() > 0 + + if self.name == 'All Years': + return True + if next(v for k, v in Member.YEARS if k == member.year) in self.name.split('/'): + # Year level group + return True + return False + + def subscribe_member(self, member, subscribe): + if not self.subscribable: + raise Exception('Cannot subscribe to an unsubscribable group') + + if subscribe: + if GroupSubscription.objects.filter(member=member, group=self).count() == 0: + subscription = GroupSubscription(member=member, group=self) + subscription.save() + else: + GroupSubscription.objects.filter(member=member, group=self).delete() + + @staticmethod + def get_member_groups(member): + # Subscribable groups + subscriptions = GroupSubscription.objects.filter(member=member) + groups = set(subscription.group for subscription in subscriptions.all()) + + # Non-subscribable groups + for group in Group.objects.filter(subscribable=False): + if group.contains_member(member): + groups.add(group) + + return groups class BulletinItem(models.Model): author = models.ForeignKey(User, on_delete=models.CASCADE) @@ -62,3 +99,24 @@ class BulletinItem(models.Model): if user.email in self.author.delegates: return True return False + +class BulletinSubscription(models.Model): + member = models.ForeignKey(Member, on_delete=models.CASCADE) + subscribed = models.BooleanField() + + @staticmethod + def is_member_subscribed(member): + return BulletinSubscription.objects.filter(member=member, subscribed=True).count() > 0 + + @staticmethod + def set_member_subscribed(member, subscribed): + if BulletinSubscription.objects.filter(member=member).count() > 0: + subscription = BulletinSubscription.objects.get(member=member) + else: + subscription = BulletinSubscription(member=member) + subscription.subscribed = subscribed + subscription.save() + +class GroupSubscription(models.Model): + member = models.ForeignKey(Member, on_delete=models.CASCADE) + group = models.ForeignKey(Group, on_delete=models.CASCADE)