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
=== modified file 'pgtools/management/commands/grantuser.py'
--- pgtools/management/commands/grantuser.py 2017-04-05 13:14:23 +0000
+++ pgtools/management/commands/grantuser.py 2017-04-05 18:30:10 +0000
@@ -73,7 +73,13 @@
73 table = field.m2m_db_table()73 table = field.m2m_db_table()
74 self.cursor.execute(74 self.cursor.execute(
75 "SELECT pg_get_serial_sequence(%s, %s)", (table, 'id'))75 "SELECT pg_get_serial_sequence(%s, %s)", (table, 'id'))
76 sequence = self.cursor.fetchone()[0]76 # if the sequence name is returned as a fully qualified name
77 # ie, like <schema>.<name>, only return the name part
78 result = self.cursor.fetchone()[0]
79 if '.' in result:
80 sequence = result.split('.')[1]
81 else:
82 sequence = result
77 self._grant_one(table)83 self._grant_one(table)
78 self._grant_one(sequence)84 self._grant_one(sequence)
7985
8086
=== modified file 'pgtools/tests.py'
--- pgtools/tests.py 2017-04-05 13:14:23 +0000
+++ pgtools/tests.py 2017-04-05 18:30:10 +0000
@@ -636,12 +636,6 @@
636636
637 @patch('pgtools.management.commands.grantuser.get_models')637 @patch('pgtools.management.commands.grantuser.get_models')
638 def test__grant_many_to_many(self, mock_get_models):638 def test__grant_many_to_many(self, mock_get_models):
639 sql = ["CREATE TABLE pgtools_bar (id integer PRIMARY KEY, baz integer);",
640 "CREATE TABLE pgtools_baz (id integer PRIMARY KEY, foo integer);"]
641 cursor = connection.cursor()
642 for query in sql:
643 cursor.execute(query)
644
645 class Bar(models.Model):639 class Bar(models.Model):
646 baz = models.ManyToManyField('Baz')640 baz = models.ManyToManyField('Baz')
647641
@@ -651,8 +645,10 @@
651 mock_get_models.return_value = [Bar, Baz]645 mock_get_models.return_value = [Bar, Baz]
652646
653 # make sure role exists647 # make sure role exists
654 DatabaseRole('payments')648 if not DatabaseRole.exists('payments'):
649 DatabaseRole('payments', create=True)
655650
651 cursor = connection.cursor()
656 name = 'pgtools.management.commands.grantuser.connection.cursor'652 name = 'pgtools.management.commands.grantuser.connection.cursor'
657 with patch(name) as mock_cursor:653 with patch(name) as mock_cursor:
658 mock_cursor.return_value.cursor = cursor.cursor654 mock_cursor.return_value.cursor = cursor.cursor
@@ -672,6 +668,41 @@
672 for call_ in expected_calls:668 for call_ in expected_calls:
673 self.assertIn(call_, mock_execute.call_args_list)669 self.assertIn(call_, mock_execute.call_args_list)
674670
671 @patch('pgtools.management.commands.grantuser.get_models')
672 def test__grant_many_to_many_with_sequence_full_name(
673 self, mock_get_models):
674 class Bar(models.Model):
675 baz = models.ManyToManyField('Baz')
676
677 class Baz(models.Model):
678 foo = models.IntegerField()
679
680 mock_get_models.return_value = [Bar, Baz]
681
682 # make sure role exists
683 if not DatabaseRole.exists('payments'):
684 DatabaseRole('payments', create=True)
685
686 cursor = connection.cursor()
687 name = 'pgtools.management.commands.grantuser.connection.cursor'
688 with patch(name) as mock_cursor:
689 mock_cursor.return_value.cursor = cursor.cursor
690 mock_cursor.return_value.fetchone.return_value = [
691 'public.pgtools_bar_baz_id_seq'
692 ]
693 call_command('grantuser', 'payments')
694
695 mock_execute = mock_cursor.return_value.execute
696 expected_calls = [
697 call('SELECT pg_get_serial_sequence(%s, %s)',
698 ('pgtools_bar_baz', 'id')),
699 call('GRANT ALL ON "pgtools_bar_baz" TO "payments"'),
700 call('GRANT ALL ON "pgtools_bar_baz_id_seq" TO "payments"'),
701 ]
702
703 for call_ in expected_calls:
704 self.assertIn(call_, mock_execute.call_args_list)
705
675706
676@skipIf(DJANGO_VERSION > (1, 6), "Django 1.7 and later use django.apps for getting models")707@skipIf(DJANGO_VERSION > (1, 6), "Django 1.7 and later use django.apps for getting models")
677class Django16GrantUserCommandTestCase(GrantUserCommandTestCase):708class Django16GrantUserCommandTestCase(GrantUserCommandTestCase):

Subscribers

People subscribed via source and target branches