From 55e94bdde87ebc629bb4d14a528672bb6026a37e Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 11 2015 16:54:50 +0000 Subject: [PATCH 1/8] Add an URL field to the projects table --- diff --git a/alembic/versions/36116bb7a69b_add_the_url_field_to_project.py b/alembic/versions/36116bb7a69b_add_the_url_field_to_project.py new file mode 100644 index 0000000..27784ef --- /dev/null +++ b/alembic/versions/36116bb7a69b_add_the_url_field_to_project.py @@ -0,0 +1,29 @@ +"""Add the url field to project + +Revision ID: 36116bb7a69b +Revises: abc71fd60fa +Create Date: 2015-06-11 12:36:33.544046 + +""" + +# revision identifiers, used by Alembic. +revision = '36116bb7a69b' +down_revision = 'abc71fd60fa' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + ''' Add the column url to the table projects. + ''' + op.add_column( + 'projects', + sa.Column('url', sa.Text, nullable=True) + ) + + +def downgrade(): + ''' Remove the column merge_status from the table projects. + ''' + op.drop_column('projects', 'url') diff --git a/pagure/lib/model.py b/pagure/lib/model.py index 8c2a139..d98cc81 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -274,6 +274,7 @@ class Project(BASE): index=True) name = sa.Column(sa.String(32), nullable=False, index=True) description = sa.Column(sa.Text, nullable=True) + url = sa.Column(sa.Text, nullable=True) _settings = sa.Column(sa.Text, nullable=True) hook_token = sa.Column(sa.String(40), nullable=False, unique=True) avatar_email = sa.Column(sa.Text, nullable=True) From ddc0d5effa21a0f0e3440ad792ceb52db1f62496 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 11 2015 16:54:50 +0000 Subject: [PATCH 2/8] Adjust docstring to reflect what's happening --- diff --git a/alembic/versions/3c25e14b855b_add_an_avatar_email_for_project.py b/alembic/versions/3c25e14b855b_add_an_avatar_email_for_project.py index 886d20d..407f2d4 100644 --- a/alembic/versions/3c25e14b855b_add_an_avatar_email_for_project.py +++ b/alembic/versions/3c25e14b855b_add_an_avatar_email_for_project.py @@ -15,7 +15,7 @@ import sqlalchemy as sa def upgrade(): - ''' Add the column merge_status to the table pull_requests. + ''' Add the column merge_status to the table projects. ''' op.add_column( 'projects', @@ -24,6 +24,6 @@ def upgrade(): def downgrade(): - ''' Remove the column merge_status from the table pull_requests. + ''' Remove the column merge_status from the table projects. ''' op.drop_column('projects', 'avatar_email') From 6a39647e7021f259c116ce533a5c0efdcd5f0533 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 11 2015 16:54:50 +0000 Subject: [PATCH 3/8] Drop the DescriptionForm in favor of ProjectFormSimplified Since editing a project takes more and more arguments, it makes more sense --- diff --git a/pagure/forms.py b/pagure/forms.py index d34ed72..9122529 100644 --- a/pagure/forms.py +++ b/pagure/forms.py @@ -13,16 +13,28 @@ import wtforms # pylint: disable=R0903,W0232,E1002 -class ProjectForm(wtf.Form): +class ProjectFormSimplified(wtf.Form): + ''' Form to edit the description of a project. ''' + description = wtforms.TextField( + 'description *', + [wtforms.validators.Required()] + ) + url = wtforms.TextField( + 'URL', + [wtforms.validators.optional()] + ) + avatar_email = wtforms.TextField( + 'Avatar email', + [wtforms.validators.optional()] + ) + + +class ProjectForm(ProjectFormSimplified): ''' Form to create or edit project. ''' name = wtforms.TextField( 'Project name *', [wtforms.validators.Required()] ) - description = wtforms.TextField( - 'description', - [wtforms.validators.optional()] - ) class IssueFormSimplied(wtf.Form): @@ -213,18 +225,6 @@ class AddGroupForm(wtf.Form): ) -class DescriptionForm(wtf.Form): - ''' Form to edit the description of a project. ''' - description = wtforms.TextField( - 'description *', - [wtforms.validators.Required()] - ) - avatar_email = wtforms.TextField( - 'Avatar email', - [wtforms.validators.optional()] - ) - - class ConfirmationForm(wtf.Form): ''' Simple form used just for CSRF protection. ''' pass From 2e67a47cb015441684a9b764fe6b6eb28b0122f3 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 11 2015 16:54:50 +0000 Subject: [PATCH 4/8] Rename the update_description endpoint into update_project Adjust the route as well since we do more than just updating the description --- diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 198e9c0..cb2180b 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -758,10 +758,10 @@ def view_settings(repo, username=None): ) -@APP.route('//updatedesc', methods=['POST']) -@APP.route('/fork///updatedesc', methods=['POST']) +@APP.route('//update', methods=['POST']) +@APP.route('/fork///update', methods=['POST']) @cla_required -def update_description(repo, username=None): +def update_project(repo, username=None): """ Update the description of a project. """ repo = pagure.lib.get_project(SESSION, repo, user=username) @@ -774,15 +774,13 @@ def update_description(repo, username=None): 403, 'You are not allowed to change the settings for this project') - form = pagure.forms.DescriptionForm() + form = pagure.forms.ProjectFormSimplified() if form.validate_on_submit(): - avatar_email = form.avatar_email.data \ - if form.avatar_email.data and form.avatar_email.data.strip() \ - else None try: repo.description = form.description.data - repo.avatar_email = avatar_email + repo.avatar_email = form.avatar_email.data.strip() + repo.url = form.url.data.strip() SESSION.add(repo) SESSION.commit() flask.flash('Project updated') From 3fe3ff07635933df0e61b64424caa92866722ae5 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 11 2015 16:54:50 +0000 Subject: [PATCH 5/8] Allow setting the avatar_email and the url when creating the project --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 3f7c499..98f0364 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -724,7 +724,8 @@ def add_pull_request_flag(session, request, username, percent, comment, url, def new_project(session, user, name, blacklist, gitfolder, docfolder, ticketfolder, requestfolder, - description=None, parent_id=None): + description=None, url=None,avatar_email=None, + parent_id=None): ''' Create a new project based on the information provided. ''' if name in blacklist: @@ -743,7 +744,9 @@ def new_project(session, user, name, blacklist, project = model.Project( name=name, - description=description, + description=description if description else None, + url=url if url else None, + avatar_email=avatar_email if avatar_email else None, user_id=user_obj.id, parent_id=parent_id, hook_token=pagure.lib.login.id_generator(40) diff --git a/pagure/templates/new_project.html b/pagure/templates/new_project.html index 022c495..47fae59 100644 --- a/pagure/templates/new_project.html +++ b/pagure/templates/new_project.html @@ -14,6 +14,8 @@ {{ render_field_in_row(form.name) }} {{ render_field_in_row(form.description) }} + {{ render_field_in_row(form.url) }} + {{ render_field_in_row(form.avatar_email) }}

diff --git a/pagure/ui/app.py b/pagure/ui/app.py index 573e56b..13c7ab7 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -232,12 +232,16 @@ def new_project(): if form.validate_on_submit(): name = form.name.data description = form.description.data + url = form.url.data + avatar_email = form.avatar_email.data try: message = pagure.lib.new_project( SESSION, name=name, description=description, + url=url, + avatar_email=avatar_email, user=flask.g.fas_user.username, blacklist=APP.config['BLACKLISTED_PROJECTS'], gitfolder=APP.config['GIT_FOLDER'], From 92b1586363f1df8a9e274e4331131a934ef57436 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 11 2015 16:54:50 +0000 Subject: [PATCH 6/8] Adjust the settings page to use the new endpoint and allow updating the url --- diff --git a/pagure/templates/settings.html b/pagure/templates/settings.html index cf4da4d..f13a0aa 100644 --- a/pagure/templates/settings.html +++ b/pagure/templates/settings.html @@ -16,7 +16,7 @@

Update project

-
@@ -29,6 +29,14 @@ + + + +
+ + + +
From 21b1964102e104027081afc02ca624871698a1ff Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 11 2015 16:54:50 +0000 Subject: [PATCH 7/8] Adjust unit-tests for the change update_description to update_project --- diff --git a/tests/test_progit_flask_ui_repo.py b/tests/test_progit_flask_ui_repo.py index 4fb3243..e304c4b 100644 --- a/tests/test_progit_flask_ui_repo.py +++ b/tests/test_progit_flask_ui_repo.py @@ -254,24 +254,24 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertTrue( '
  • User removed
  • ' in output.data) - def test_update_description(self): - """ Test the update_description endpoint. """ - output = self.app.post('/foo/updatedesc') + def test_update_project(self): + """ Test the update_project endpoint. """ + output = self.app.post('/foo/update') self.assertEqual(output.status_code, 302) user = tests.FakeUser() with tests.user_set(pagure.APP, user): - output = self.app.post('/foo/updatedesc') + output = self.app.post('/foo/update') self.assertEqual(output.status_code, 404) tests.create_projects(self.session) - output = self.app.post('/test/updatedesc') + output = self.app.post('/test/update') self.assertEqual(output.status_code, 403) user.username = 'pingou' with tests.user_set(pagure.APP, user): - output = self.app.post('/test/updatedesc', follow_redirects=True) + output = self.app.post('/test/update', follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue('
    ' in output.data) self.assertTrue('

    Settings

    ' in output.data) @@ -286,7 +286,7 @@ class PagureFlaskRepotests(tests.Modeltests): 'csrf_token': csrf_token, } output = self.app.post( - '/test/updatedesc', data=data, follow_redirects=True) + '/test/update', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue('
    ' in output.data) self.assertTrue('

    Settings

    ' in output.data) @@ -303,7 +303,7 @@ class PagureFlaskRepotests(tests.Modeltests): 'csrf_token': csrf_token, } output = self.app.post( - '/test/updatedesc', data=data, follow_redirects=True) + '/test/update', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue('
    ' in output.data) self.assertTrue('

    Settings

    ' in output.data) @@ -321,7 +321,7 @@ class PagureFlaskRepotests(tests.Modeltests): 'csrf_token': csrf_token, } output = self.app.post( - '/test/updatedesc', data=data, follow_redirects=True) + '/test/update', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue('
    ' in output.data) self.assertTrue('

    Settings

    ' in output.data) From a770bfb746cd826519d292445087bf820572ffac Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 11 2015 16:54:50 +0000 Subject: [PATCH 8/8] Display the project's URL in the repo_master template near the description --- diff --git a/pagure/static/pagure.css b/pagure/static/pagure.css index 2f98001..58d064c 100644 --- a/pagure/static/pagure.css +++ b/pagure/static/pagure.css @@ -156,6 +156,14 @@ header h1 span { margin: .5em; } +#projectinfo { + display: inline-block; +} + +#projectinfo p { + display: inline-block; +} + .project_list > header { border-radius: 10px 10px 0 0; padding: .5em; diff --git a/pagure/templates/repo_master.html b/pagure/templates/repo_master.html index 103b8b4..ec64907 100644 --- a/pagure/templates/repo_master.html +++ b/pagure/templates/repo_master.html @@ -12,8 +12,10 @@ {% if branchname %} ({{ branchname }}) {% endif %} - {% if repo.description %}{% autoescape false %} - {{ repo.description | markdown }}{% endautoescape %}{% else %}-{% endif %} + + {% if repo.description %}{{ repo.description | markdown |safe }}{% else %}-{% endif -%} + {%- if repo.url %} | {{ repo.url }}{% endif %} + {% if repo.is_fork %}