Merge ~pelpsi/launchpad:cannot-turn-lp-subteam-to-private into launchpad:master

Proposed by Simone Pelosi
Status: Merged
Approved by: Simone Pelosi
Approved revision: 3a9384c901134d479e0296be8f1a728a4e2bb5f6
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~pelpsi/launchpad:cannot-turn-lp-subteam-to-private
Merge into: launchpad:master
Diff against target: 77 lines (+43/-1)
2 files modified
lib/lp/registry/model/person.py (+12/-1)
lib/lp/registry/tests/test_person.py (+31/-0)
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Review via email: mp+448383@code.launchpad.net

Commit message

Added a status check if src_tab=="teammembership"

teammembership should be considered only if has a status different from DEACTIVATED and EXPIRED.

LP: #2029487

To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/registry/model/person.py b/lib/lp/registry/model/person.py
2index 3a7d1a5..c0d94ca 100644
3--- a/lib/lp/registry/model/person.py
4+++ b/lib/lp/registry/model/person.py
5@@ -2777,11 +2777,22 @@ class Person(
6 for src_tab, src_col, ref_tab, ref_col, updact, delact in references:
7 if (src_tab, src_col) in skip:
8 continue
9- ref_query.append(
10+ query = (
11 "SELECT '%(table)s' AS table FROM %(table)s "
12 "WHERE %(col)s = %(person_id)d"
13 % {"col": src_col, "table": src_tab, "person_id": self.id}
14 )
15+ if (src_tab, src_col) == ("teammembership", "person"):
16+ # XXX: this should be converted to the Storm query compiler
17+ # rather than doing fragile string assembly.
18+ query += (
19+ " AND status != %(deactivated)d AND status != %(expired)d"
20+ % {
21+ "deactivated": TeamMembershipStatus.DEACTIVATED.value,
22+ "expired": TeamMembershipStatus.EXPIRED.value,
23+ }
24+ )
25+ ref_query.append(query)
26 if ref_query:
27 cur.execute(" UNION ".join(ref_query))
28 for src_tab in cur.fetchall():
29diff --git a/lib/lp/registry/tests/test_person.py b/lib/lp/registry/tests/test_person.py
30index 3646ff7..131ceff 100644
31--- a/lib/lp/registry/tests/test_person.py
32+++ b/lib/lp/registry/tests/test_person.py
33@@ -38,6 +38,7 @@ from lp.registry.interfaces.karma import IKarmaCacheManager
34 from lp.registry.interfaces.person import ImmutableVisibilityError, IPersonSet
35 from lp.registry.interfaces.pocket import PackagePublishingPocket
36 from lp.registry.interfaces.product import IProductSet
37+from lp.registry.interfaces.teammembership import ITeamMembershipSet
38 from lp.registry.model.karma import KarmaCategory, KarmaTotalCache
39 from lp.registry.model.person import Person, get_recipients
40 from lp.services.database.interfaces import IStore
41@@ -1088,6 +1089,36 @@ class TestPersonStates(TestCaseWithFactory):
42 else:
43 raise AssertionError("Expected exception.")
44
45+ def test_visibility_validator_subteam_public_to_private_view(self):
46+ team_owner = self.factory.makePerson()
47+ new_team = self.factory.makeTeam(
48+ owner=team_owner, visibility=PersonVisibility.PUBLIC
49+ )
50+ super_team = self.factory.makeTeam(
51+ owner=team_owner,
52+ visibility=PersonVisibility.PUBLIC,
53+ members=[new_team],
54+ )
55+ membershipset = getUtility(ITeamMembershipSet)
56+ membershipset.deactivateActiveMemberships(
57+ super_team, "gone", team_owner
58+ )
59+ view = create_initialized_view(
60+ new_team,
61+ "+edit",
62+ {
63+ "field.name": "newteam",
64+ "field.displayname": "New Team",
65+ "field.membership_policy": "RESTRICTED",
66+ "field.renewal_policy": "NONE",
67+ "field.visibility": "PRIVATE",
68+ "field.actions.save": "Save",
69+ },
70+ )
71+ self.assertEqual(len(view.errors), 0)
72+ self.assertEqual(len(view.request.notifications), 0)
73+ self.assertEqual(new_team.visibility, PersonVisibility.PRIVATE)
74+
75 def test_visibility_validator_team_private_to_public_view(self):
76 # A PRIVATE team cannot convert to PUBLIC.
77 self.otherteam.visibility = PersonVisibility.PRIVATE

Subscribers

People subscribed via source and target branches

to status/vote changes: