Merge lp:~ricardokirkner/django-pgtools/fix-grantuser-sequence-fully-qualified into lp:django-pgtools

Proposed by Ricardo Kirkner
Status: Merged
Approved by: Ricardo Kirkner
Approved revision: 13
Merged at revision: 13
Proposed branch: lp:~ricardokirkner/django-pgtools/fix-grantuser-sequence-fully-qualified
Merge into: lp:django-pgtools
Diff against target: 89 lines (+45/-8)
2 files modified
pgtools/management/commands/grantuser.py (+7/-1)
pgtools/tests.py (+38/-7)
To merge this branch: bzr merge lp:~ricardokirkner/django-pgtools/fix-grantuser-sequence-fully-qualified
Reviewer Review Type Date Requested Status
Ricardo Kirkner (community) Approve
Review via email: mp+322040@code.launchpad.net

Commit message

fix granting on sequence from m2m model when pg returns the fully qualified name

To post a comment you must log in.
Revision history for this message
Ricardo Kirkner (ricardokirkner) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'pgtools/management/commands/grantuser.py'
2--- pgtools/management/commands/grantuser.py 2017-04-05 13:14:23 +0000
3+++ pgtools/management/commands/grantuser.py 2017-04-05 18:30:10 +0000
4@@ -73,7 +73,13 @@
5 table = field.m2m_db_table()
6 self.cursor.execute(
7 "SELECT pg_get_serial_sequence(%s, %s)", (table, 'id'))
8- sequence = self.cursor.fetchone()[0]
9+ # if the sequence name is returned as a fully qualified name
10+ # ie, like <schema>.<name>, only return the name part
11+ result = self.cursor.fetchone()[0]
12+ if '.' in result:
13+ sequence = result.split('.')[1]
14+ else:
15+ sequence = result
16 self._grant_one(table)
17 self._grant_one(sequence)
18
19
20=== modified file 'pgtools/tests.py'
21--- pgtools/tests.py 2017-04-05 13:14:23 +0000
22+++ pgtools/tests.py 2017-04-05 18:30:10 +0000
23@@ -636,12 +636,6 @@
24
25 @patch('pgtools.management.commands.grantuser.get_models')
26 def test__grant_many_to_many(self, mock_get_models):
27- sql = ["CREATE TABLE pgtools_bar (id integer PRIMARY KEY, baz integer);",
28- "CREATE TABLE pgtools_baz (id integer PRIMARY KEY, foo integer);"]
29- cursor = connection.cursor()
30- for query in sql:
31- cursor.execute(query)
32-
33 class Bar(models.Model):
34 baz = models.ManyToManyField('Baz')
35
36@@ -651,8 +645,10 @@
37 mock_get_models.return_value = [Bar, Baz]
38
39 # make sure role exists
40- DatabaseRole('payments')
41+ if not DatabaseRole.exists('payments'):
42+ DatabaseRole('payments', create=True)
43
44+ cursor = connection.cursor()
45 name = 'pgtools.management.commands.grantuser.connection.cursor'
46 with patch(name) as mock_cursor:
47 mock_cursor.return_value.cursor = cursor.cursor
48@@ -672,6 +668,41 @@
49 for call_ in expected_calls:
50 self.assertIn(call_, mock_execute.call_args_list)
51
52+ @patch('pgtools.management.commands.grantuser.get_models')
53+ def test__grant_many_to_many_with_sequence_full_name(
54+ self, mock_get_models):
55+ class Bar(models.Model):
56+ baz = models.ManyToManyField('Baz')
57+
58+ class Baz(models.Model):
59+ foo = models.IntegerField()
60+
61+ mock_get_models.return_value = [Bar, Baz]
62+
63+ # make sure role exists
64+ if not DatabaseRole.exists('payments'):
65+ DatabaseRole('payments', create=True)
66+
67+ cursor = connection.cursor()
68+ name = 'pgtools.management.commands.grantuser.connection.cursor'
69+ with patch(name) as mock_cursor:
70+ mock_cursor.return_value.cursor = cursor.cursor
71+ mock_cursor.return_value.fetchone.return_value = [
72+ 'public.pgtools_bar_baz_id_seq'
73+ ]
74+ call_command('grantuser', 'payments')
75+
76+ mock_execute = mock_cursor.return_value.execute
77+ expected_calls = [
78+ call('SELECT pg_get_serial_sequence(%s, %s)',
79+ ('pgtools_bar_baz', 'id')),
80+ call('GRANT ALL ON "pgtools_bar_baz" TO "payments"'),
81+ call('GRANT ALL ON "pgtools_bar_baz_id_seq" TO "payments"'),
82+ ]
83+
84+ for call_ in expected_calls:
85+ self.assertIn(call_, mock_execute.call_args_list)
86+
87
88 @skipIf(DJANGO_VERSION > (1, 6), "Django 1.7 and later use django.apps for getting models")
89 class Django16GrantUserCommandTestCase(GrantUserCommandTestCase):

Subscribers

People subscribed via source and target branches