diff --git a/alembic/versions/6addaed6008e_add_description_for_tags.py b/alembic/versions/6addaed6008e_add_description_for_tags.py index 588ea6a..14411bc 100644 --- a/alembic/versions/6addaed6008e_add_description_for_tags.py +++ b/alembic/versions/6addaed6008e_add_description_for_tags.py @@ -19,7 +19,7 @@ def upgrade(): ''' op.add_column( 'tags_colored', - sa.Column('tag_description', sa.String(255)) + sa.Column('tag_description', sa.String(255), default="") ) def downgrade(): diff --git a/pagure/lib/model.py b/pagure/lib/model.py index e532d6d..f982f9e 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -1089,7 +1089,7 @@ class TagColored(BASE): id = sa.Column(sa.Integer, primary_key=True) tag = sa.Column(sa.String(255), nullable=False) - tag_description = sa.Column(sa.String(255)) + tag_description = sa.Column(sa.String(255), default="") project_id = sa.Column( sa.Integer, sa.ForeignKey( @@ -1109,8 +1109,8 @@ class TagColored(BASE): ) def __repr__(self): - return 'TagColored(id: %s, tag:%s, color:%s)' % ( - self.id, self.tag, self.tag_color) + return 'TagColored(id: %s, tag:%s, tag_description:%s, color:%s)' % ( + self.id, self.tag, self.tag_description, self.tag_color) class TagIssueColored(BASE): diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index 19a90c6..f5e6085 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -461,7 +461,10 @@ def update_tags(repo, username=None, namespace=None): if tag.strip() and tag.strip() not in seen and not seen.add(tag.strip()) ] - tag_descriptions = flask.request.form.getlist('tag_description') + tag_descriptions = [ + desc.strip() + for desc in flask.request.form.getlist('tag_description') + ] # Uniquify and order preserving seen = set() diff --git a/tests/test_pagure_flask_ui_issues.py b/tests/test_pagure_flask_ui_issues.py index c71bd30..d7b169d 100644 --- a/tests/test_pagure_flask_ui_issues.py +++ b/tests/test_pagure_flask_ui_issues.py @@ -1518,6 +1518,7 @@ class PagureFlaskIssuestests(tests.Modeltests): 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = {'tag': 'tag2', + 'tag_description': 'lorem ipsum', 'tag_color': 'DeepSkyBlue'} output = self.app.post('/test/tag/tag1/edit', data=data) @@ -1532,7 +1533,19 @@ class PagureFlaskIssuestests(tests.Modeltests): 'Settings - test - Pagure', output.data) self.assertIn( '\n ' - 'Edited tag: tag1(DeepSkyBlue) to tag2(DeepSkyBlue)', + 'Edited tag: tag1()[DeepSkyBlue] to tag2(lorem ipsum)[DeepSkyBlue]', + output.data) + + # update tag with empty description + data['tag_description'] = '' + output = self.app.post( + '/test/tag/tag2/edit', data=data, follow_redirects=True) + self.assertEqual(output.status_code, 200) + self.assertIn( + 'Settings - test - Pagure', output.data) + self.assertIn( + '\n ' + 'Edited tag: tag2(lorem ipsum)[DeepSkyBlue] to tag2()[DeepSkyBlue]', output.data) # After edit, list tags @@ -2013,6 +2026,7 @@ class PagureFlaskIssuestests(tests.Modeltests): # No CSRF data = { 'tag': 'red', + 'tag_description': 'lorem ipsum', 'tag_color': '#ff0000' } output = self.app.post( @@ -2030,6 +2044,7 @@ class PagureFlaskIssuestests(tests.Modeltests): # Invalid color data = { 'tag': 'red', + 'tag_description': 'lorem ipsum', 'tag_color': 'red', 'csrf_token': csrf_token, } @@ -2049,6 +2064,7 @@ class PagureFlaskIssuestests(tests.Modeltests): # Inconsistent length color data = { 'tag': ['red', 'blue'], + 'tag_description': ['lorem ipsum', 'foo bar'], 'tag_color': 'red', 'csrf_token': csrf_token, } @@ -2062,15 +2078,35 @@ class PagureFlaskIssuestests(tests.Modeltests): 'Color: red does not match the expected pattern', output.data) self.assertIn( - '\n tags and tag colors' - ' are not of the same length', output.data) + '\n tags, tag descriptions and' + ' tag colors are not of the same length', output.data) self.assertIn( ' ', output.data) - # Valid query + # Inconsistent length description data = { 'tag': ['red', 'blue'], + 'tag_description': 'lorem ipsum', + 'tag_color': ['#ff0000', '#003cff'], + 'csrf_token': csrf_token, + } + output = self.app.post( + '/test/update/tags', data=data, follow_redirects=True) + self.assertEqual(output.status_code, 200) + self.assertIn( + 'Settings - test - Pagure', output.data) + self.assertIn( + '\n tags, tag descriptions and' + ' tag colors are not of the same length', output.data) + self.assertIn( + ' ', output.data) + + # consistent length, but empty description + data = { + 'tag': ['red', 'blue'], + 'tag_description': ['lorem ipsum', ''], 'tag_color': ['#ff0000', '#003cff'], 'csrf_token': csrf_token, } @@ -2081,20 +2117,53 @@ class PagureFlaskIssuestests(tests.Modeltests): 'Settings - test - Pagure', output.data) self.assertIn( 'blue', output.data) + '#003cff">blue\n' + '  ' + '', output.data) self.assertIn( '', output.data) self.assertIn( 'red', output.data) + '#ff0000">red\n' + '  lorem ipsum' + '', output.data) + self.assertIn( + '', + output.data) + + # Valid query + data = { + 'tag': ['red', 'green'], + 'tag_description': ['lorem ipsum', 'sample description'], + 'tag_color': ['#ff0000', '#00ff00'], + 'csrf_token': csrf_token, + } + output = self.app.post( + '/test/update/tags', data=data, follow_redirects=True) + self.assertEqual(output.status_code, 200) + self.assertIn( + 'Settings - test - Pagure', output.data) + self.assertIn( + 'green\n' + '  sample description' + '', output.data) + self.assertIn( + '', + output.data) + self.assertIn( + 'red\n' + '  lorem ipsum' + '', output.data) self.assertIn( '', output.data) # After update, list tags tags = pagure.lib.get_tags_of_project(self.session, repo) - self.assertEqual([tag.tag for tag in tags], ['blue', 'red']) + self.assertEqual([tag.tag for tag in tags], ['blue', 'green', 'red']) if __name__ == '__main__': diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index b73ad40..9bfb92e 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -500,6 +500,7 @@ class PagureLibtests(tests.Modeltests): project=repo, old_tag='foo', new_tag='bar', + new_tag_description='lorem ipsum', new_tag_color='black', user='pingou', ticketfolder=None, @@ -512,6 +513,7 @@ class PagureLibtests(tests.Modeltests): project=repo, old_tag=None, new_tag='bar', + new_tag_description='lorem ipsum', new_tag_color='black', user='pingou', ticketfolder=None, @@ -522,6 +524,7 @@ class PagureLibtests(tests.Modeltests): project=repo, old_tag='tag1', new_tag='tag2', + new_tag_description='lorem ipsum', new_tag_color='black', user='pingou', ticketfolder=None, @@ -529,7 +532,7 @@ class PagureLibtests(tests.Modeltests): self.session.commit() self.assertEqual( msgs, - ['Edited tag: tag1(DeepSkyBlue) to tag2(black)'] + ['Edited tag: tag1()[DeepSkyBlue] to tag2(lorem ipsum)[black]'] ) # Add a new tag @@ -551,6 +554,7 @@ class PagureLibtests(tests.Modeltests): project=repo, old_tag='tag2', new_tag='tag3', + new_tag_description='lorem ipsum', new_tag_color='red', user='pingou', ticketfolder=None, @@ -562,12 +566,13 @@ class PagureLibtests(tests.Modeltests): project=repo, old_tag='tag2', new_tag='tag4', + new_tag_description='ipsum lorem', new_tag_color='purple', user='pingou', ticketfolder=None, ) self.session.commit() - self.assertEqual(msgs, ['Edited tag: tag2(black) to tag4(purple)']) + self.assertEqual(msgs, ['Edited tag: tag2(lorem ipsum)[black] to tag4(ipsum lorem)[purple]']) @patch('pagure.lib.git.update_git') @patch('pagure.lib.notify.send_email') diff --git a/tests/test_pagure_lib_model.py b/tests/test_pagure_lib_model.py index 696ea42..1acfd16 100644 --- a/tests/test_pagure_lib_model.py +++ b/tests/test_pagure_lib_model.py @@ -153,6 +153,7 @@ class PagureLibModeltests(tests.Modeltests): item = pagure.lib.model.TagColored( tag='foo', + tag_description='bar', tag_color='DeepSkyBlue', project_id=repo.id) self.session.add(item)