Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion ietf/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ def get(self, request):
'sendqueue', 'nominee', 'topicfeedbacklastseen', 'alias', 'email', 'apikeys', 'personevent',
'reviewersettings', 'reviewsecretarysettings', 'unavailableperiod', 'reviewwish',
'nextreviewerinteam', 'reviewrequest', 'meetingregistration', 'submissionevent', 'preapproval',
'user', 'user__communitylist', 'personextresource_set', ]
'user', 'communitylist', 'personextresource_set', ]
Comment thread
pselkirk marked this conversation as resolved.


return self.json_view(request, filter={'id':person.id}, expand=expand)
Expand Down
4 changes: 2 additions & 2 deletions ietf/community/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
from ietf.community.models import CommunityList, SearchRule, EmailSubscription

class CommunityListAdmin(admin.ModelAdmin):
list_display = ['id', 'user', 'group']
raw_id_fields = ['user', 'group', 'added_docs']
list_display = ['id', 'person', 'group']
raw_id_fields = ['person', 'group', 'added_docs']
admin.site.register(CommunityList, CommunityListAdmin)

class SearchRuleAdmin(admin.ModelAdmin):
Expand Down
5 changes: 2 additions & 3 deletions ietf/community/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,14 +106,13 @@ def clean_text(self):


class SubscriptionForm(forms.ModelForm):
def __init__(self, user, clist, *args, **kwargs):
def __init__(self, person, clist, *args, **kwargs):
self.clist = clist
self.user = user

super(SubscriptionForm, self).__init__(*args, **kwargs)

self.fields["notify_on"].widget = forms.RadioSelect(choices=self.fields["notify_on"].choices)
self.fields["email"].queryset = self.fields["email"].queryset.filter(person__user=user, active=True).order_by("-primary")
self.fields["email"].queryset = self.fields["email"].queryset.filter(person=person, active=True).order_by("-primary")
self.fields["email"].widget = forms.RadioSelect(choices=[t for t in self.fields["email"].choices if t[0]])

if self.fields["email"].queryset:
Expand Down
54 changes: 54 additions & 0 deletions ietf/community/migrations/0003_user_to_person.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Generated by Django 4.2.2 on 2023-06-12 19:35

from django.conf import settings
from django.db import migrations
import django.db.models.deletion
import ietf.utils.models


def forward(apps, schema_editor):
CommunityList = apps.get_model('community', 'CommunityList')
for clist in CommunityList.objects.all():
try:
clist.person = clist.user.person
except:
clist.person = None
clist.save()

def reverse(apps, schema_editor):
CommunityList = apps.get_model('community', 'CommunityList')
for clist in CommunityList.objects.all():
try:
clist.user = clist.person.user
except:
clist.user = None
clist.save()

class Migration(migrations.Migration):
dependencies = [
("community", "0002_auto_20230320_1222"),
("person", "0001_initial"),
]

operations = [
migrations.AddField(
model_name="communitylist",
name="person",
field=ietf.utils.models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
to="person.Person",
),
),
migrations.RunPython(forward, reverse),
migrations.RemoveField(
model_name="communitylist",
name="user",
field=ietf.utils.models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL),
),
]
11 changes: 5 additions & 6 deletions ietf/community/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
# -*- coding: utf-8 -*-


from django.contrib.auth.models import User
from django.db import models
from django.db.models import signals
from django.urls import reverse as urlreverse
Expand All @@ -13,13 +12,13 @@
from ietf.utils.models import ForeignKey

class CommunityList(models.Model):
user = ForeignKey(User, blank=True, null=True)
person = ForeignKey(Person, blank=True, null=True)
group = ForeignKey(Group, blank=True, null=True)
added_docs = models.ManyToManyField(Document)

def long_name(self):
if self.user:
return 'Personal I-D list of %s' % self.user.username
if self.person:
return 'Personal I-D list of %s' % self.person.plain_name()
elif self.group:
return 'I-D list for %s' % self.group.name
else:
Expand All @@ -30,8 +29,8 @@ def __str__(self):

def get_absolute_url(self):
import ietf.community.views
if self.user:
return urlreverse(ietf.community.views.view_list, kwargs={ 'username': self.user.username })
if self.person:
return urlreverse(ietf.community.views.view_list, kwargs={ 'username': self.person.user.username })
Comment thread
pselkirk marked this conversation as resolved.
elif self.group:
return urlreverse("ietf.group.views.group_documents", kwargs={ 'acronym': self.group.acronym })
return ""
Expand Down
43 changes: 21 additions & 22 deletions ietf/community/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from pyquery import PyQuery

from django.urls import reverse as urlreverse
from django.contrib.auth.models import User

from django_webtest import WebTest

Expand Down Expand Up @@ -38,7 +37,7 @@ def test_rule_matching(self):
states=[('draft-iesg','lc'),('draft','active')],
)

clist = CommunityList.objects.create(user=User.objects.get(username="plain"))
clist = CommunityList.objects.create(person=plain)

rule_group = SearchRule.objects.create(rule_type="group", group=draft.group, state=State.objects.get(type="draft", slug="active"), community_list=clist)
rule_group_rfc = SearchRule.objects.create(rule_type="group_rfc", group=draft.group, state=State.objects.get(type="draft", slug="rfc"), community_list=clist)
Expand Down Expand Up @@ -90,7 +89,7 @@ def test_rule_matching(self):
self.assertTrue(draft in list(docs_matching_community_list_rule(rule_group_exp)))

def test_view_list(self):
PersonFactory(user__username='plain')
person = PersonFactory(user__username='plain')
draft = WgDraftFactory()

url = urlreverse(ietf.community.views.view_list, kwargs={ "username": "plain" })
Expand All @@ -100,7 +99,7 @@ def test_view_list(self):
self.assertEqual(r.status_code, 200)

# with list
clist = CommunityList.objects.create(user=User.objects.get(username="plain"))
clist = CommunityList.objects.create(person=person)
if not draft in clist.added_docs.all():
clist.added_docs.add(draft)
SearchRule.objects.create(
Expand Down Expand Up @@ -131,7 +130,7 @@ def test_manage_personal_list(self):
form['documents'].options=[(draft.pk, True, draft.name)]
page = form.submit('action',value='add_documents')
self.assertEqual(page.status_int, 302)
clist = CommunityList.objects.get(user__username="plain")
clist = CommunityList.objects.get(person__user__username="plain")
self.assertTrue(clist.added_docs.filter(pk=draft.pk))
page = page.follow()

Expand All @@ -142,7 +141,7 @@ def test_manage_personal_list(self):
form = page.forms['remove_document_%s' % draft.pk]
page = form.submit('action',value='remove_document')
self.assertEqual(page.status_int, 302)
clist = CommunityList.objects.get(user__username="plain")
clist = CommunityList.objects.get(person__user__username="plain")
self.assertTrue(not clist.added_docs.filter(pk=draft.pk))
page = page.follow()

Expand All @@ -154,7 +153,7 @@ def test_manage_personal_list(self):
"author_rfc-state": State.objects.get(type="draft", slug="rfc").pk,
})
self.assertEqual(r.status_code, 302)
clist = CommunityList.objects.get(user__username="plain")
clist = CommunityList.objects.get(person__user__username="plain")
self.assertTrue(clist.searchrule_set.filter(rule_type="author_rfc"))

# add name_contains rule
Expand All @@ -165,7 +164,7 @@ def test_manage_personal_list(self):
"name_contains-state": State.objects.get(type="draft", slug="active").pk,
})
self.assertEqual(r.status_code, 302)
clist = CommunityList.objects.get(user__username="plain")
clist = CommunityList.objects.get(person__user__username="plain")
self.assertTrue(clist.searchrule_set.filter(rule_type="name_contains"))

# rule shows up on GET
Expand All @@ -181,7 +180,7 @@ def test_manage_personal_list(self):
"rule": rule.pk,
})

clist = CommunityList.objects.get(user__username="plain")
clist = CommunityList.objects.get(person__user__username="plain")
self.assertTrue(not clist.searchrule_set.filter(rule_type="author_rfc"))

def test_manage_group_list(self):
Expand Down Expand Up @@ -222,7 +221,7 @@ def test_track_untrack_document(self):

r = self.client.post(url)
self.assertEqual(r.status_code, 302)
clist = CommunityList.objects.get(user__username="plain")
clist = CommunityList.objects.get(person__user__username="plain")
self.assertEqual(list(clist.added_docs.all()), [draft])

# untrack
Expand All @@ -232,7 +231,7 @@ def test_track_untrack_document(self):

r = self.client.post(url)
self.assertEqual(r.status_code, 302)
clist = CommunityList.objects.get(user__username="plain")
clist = CommunityList.objects.get(person__user__username="plain")
self.assertEqual(list(clist.added_docs.all()), [])

def test_track_untrack_document_through_ajax(self):
Expand All @@ -246,19 +245,19 @@ def test_track_untrack_document_through_ajax(self):
r = self.client.post(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
self.assertEqual(r.status_code, 200)
self.assertEqual(r.json()["success"], True)
clist = CommunityList.objects.get(user__username="plain")
clist = CommunityList.objects.get(person__user__username="plain")
self.assertEqual(list(clist.added_docs.all()), [draft])

# untrack
url = urlreverse(ietf.community.views.untrack_document, kwargs={ "username": "plain", "name": draft.name })
r = self.client.post(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
self.assertEqual(r.status_code, 200)
self.assertEqual(r.json()["success"], True)
clist = CommunityList.objects.get(user__username="plain")
clist = CommunityList.objects.get(person__user__username="plain")
self.assertEqual(list(clist.added_docs.all()), [])

def test_csv(self):
PersonFactory(user__username='plain')
person = PersonFactory(user__username='plain')
draft = WgDraftFactory()

url = urlreverse(ietf.community.views.export_to_csv, kwargs={ "username": "plain" })
Expand All @@ -268,7 +267,7 @@ def test_csv(self):
self.assertEqual(r.status_code, 200)

# with list
clist = CommunityList.objects.create(user=User.objects.get(username="plain"))
clist = CommunityList.objects.create(person=person)
if not draft in clist.added_docs.all():
clist.added_docs.add(draft)
SearchRule.objects.create(
Expand All @@ -294,7 +293,7 @@ def test_csv_for_group(self):
self.assertEqual(r.status_code, 200)

def test_feed(self):
PersonFactory(user__username='plain')
person = PersonFactory(user__username='plain')
draft = WgDraftFactory()

url = urlreverse(ietf.community.views.feed, kwargs={ "username": "plain" })
Expand All @@ -304,7 +303,7 @@ def test_feed(self):
self.assertEqual(r.status_code, 200)

# with list
clist = CommunityList.objects.create(user=User.objects.get(username="plain"))
clist = CommunityList.objects.create(person=person)
if not draft in clist.added_docs.all():
clist.added_docs.add(draft)
SearchRule.objects.create(
Expand Down Expand Up @@ -334,7 +333,7 @@ def test_feed_for_group(self):
self.assertEqual(r.status_code, 200)

def test_subscription(self):
PersonFactory(user__username='plain')
person = PersonFactory(user__username='plain')
draft = WgDraftFactory()

url = urlreverse(ietf.community.views.subscription, kwargs={ "username": "plain" })
Expand All @@ -346,7 +345,7 @@ def test_subscription(self):
self.assertEqual(r.status_code, 404)

# subscription with list
clist = CommunityList.objects.create(user=User.objects.get(username="plain"))
clist = CommunityList.objects.create(person=person)
if not draft in clist.added_docs.all():
clist.added_docs.add(draft)
SearchRule.objects.create(
Expand Down Expand Up @@ -387,10 +386,10 @@ def test_subscription_for_group(self):
self.assertEqual(r.status_code, 200)

def test_notification(self):
PersonFactory(user__username='plain')
person = PersonFactory(user__username='plain')
draft = WgDraftFactory()

clist = CommunityList.objects.create(user=User.objects.get(username="plain"))
clist = CommunityList.objects.create(person=person)
if not draft in clist.added_docs.all():
clist.added_docs.add(draft)

Expand All @@ -408,4 +407,4 @@ def test_notification(self):
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue(draft.name in outbox[-1]["Subject"])



6 changes: 3 additions & 3 deletions ietf/community/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,16 @@ def lookup_community_list(username=None, acronym=None):
clist = CommunityList.objects.filter(group=group).first() or CommunityList(group=group)
else:
user = get_object_or_404(User, username__iexact=username)
clist = CommunityList.objects.filter(user=user).first() or CommunityList(user=user)
clist = CommunityList.objects.filter(person__user=user).first() or CommunityList(person=user.person)

return clist

def can_manage_community_list(user, clist):
if not user or not user.is_authenticated:
return False

if clist.user:
return user == clist.user
if clist.person:
return user == clist.person.user
elif clist.group:
if has_role(user, 'Secretariat'):
return True
Expand Down
8 changes: 5 additions & 3 deletions ietf/community/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,12 +255,14 @@ def subscription(request, username=None, acronym=None, group_type=None):
if clist.pk is None:
raise Http404

existing_subscriptions = EmailSubscription.objects.filter(community_list=clist, email__person__user=request.user)
person = request.user.person

existing_subscriptions = EmailSubscription.objects.filter(community_list=clist, email__person=person)

if request.method == 'POST':
action = request.POST.get("action")
if action == "subscribe":
form = SubscriptionForm(request.user, clist, request.POST)
form = SubscriptionForm(person, clist, request.POST)
if form.is_valid():
subscription = form.save(commit=False)
subscription.community_list = clist
Expand All @@ -273,7 +275,7 @@ def subscription(request, username=None, acronym=None, group_type=None):

return HttpResponseRedirect("")
else:
form = SubscriptionForm(request.user, clist)
form = SubscriptionForm(person, clist)

return render(request, 'community/subscription.html', {
'clist': clist,
Expand Down
Loading