From 1323835a9f0234349b2ee8d89aed285d64fc3e16 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 08 2015 10:22:44 +0000 Subject: [PATCH 1/6] Add an avatar_email field to the projects table This field is aimed at saving the identifier used in libravatar --- diff --git a/alembic/versions/3c25e14b855b_add_an_avatar_email_for_project.py b/alembic/versions/3c25e14b855b_add_an_avatar_email_for_project.py new file mode 100644 index 0000000..886d20d --- /dev/null +++ b/alembic/versions/3c25e14b855b_add_an_avatar_email_for_project.py @@ -0,0 +1,29 @@ +"""add an avatar email for project + +Revision ID: 3c25e14b855b +Revises: b5efae6bb23 +Create Date: 2015-06-08 12:05:13.832348 + +""" + +# revision identifiers, used by Alembic. +revision = '3c25e14b855b' +down_revision = 'b5efae6bb23' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + ''' Add the column merge_status to the table pull_requests. + ''' + op.add_column( + 'projects', + sa.Column('avatar_email', sa.Text, nullable=True) + ) + + +def downgrade(): + ''' Remove the column merge_status from the table pull_requests. + ''' + op.drop_column('projects', 'avatar_email') diff --git a/pagure/lib/model.py b/pagure/lib/model.py index da2db78..77cb7e6 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -256,6 +256,7 @@ class Project(BASE): description = 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) parent_id = sa.Column( sa.Integer, sa.ForeignKey('projects.id', onupdate='CASCADE'), From 13de4a383a09ba243e9622e298440fb4ea6c169b Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 08 2015 10:25:10 +0000 Subject: [PATCH 2/6] Add a new jinja filter just returning the URL for libravatar for a given email --- diff --git a/pagure/ui/filters.py b/pagure/ui/filters.py index 8fa2c44..8ee1735 100644 --- a/pagure/ui/filters.py +++ b/pagure/ui/filters.py @@ -194,6 +194,14 @@ def avatar(packager, size=64): return output +@APP.template_filter('avatar_url') +def avatar_url(email, size=64): + """ Template filter sorting the given branches, Fedora first then EPEL, + then whatever is left. + """ + return pagure.lib.avatar_url_from_openid(email, size) + + @APP.template_filter('short') def shorted_commit(cid): """Gets short version of the commit id""" From 542f1a82f111a3116f37101428d898bc2031c8f3 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 08 2015 10:25:46 +0000 Subject: [PATCH 3/6] Show the project's logo via libravatar if the project was configured with one --- diff --git a/pagure/templates/_render_repo.html b/pagure/templates/_render_repo.html index aa70058..a5d59f6 100644 --- a/pagure/templates/_render_repo.html +++ b/pagure/templates/_render_repo.html @@ -10,8 +10,11 @@ {% endif %} + {% else %} style="background-image: url({{ url_for('static', filename='placebo.png') }})"> - {# TODO: get project logo #} + {% endif %} {{ repo.name }} {% if repo.description %} {{ repo.description | wraps(20) }} From 05bc5503367caa16c14a2ca2e3b1d5ed9fd82b84 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 08 2015 10:41:22 +0000 Subject: [PATCH 4/6] Add an avatar_email field in the DescriptionForm --- diff --git a/pagure/forms.py b/pagure/forms.py index 87715d6..8ea955a 100644 --- a/pagure/forms.py +++ b/pagure/forms.py @@ -203,6 +203,10 @@ class DescriptionForm(wtf.Form): 'description *', [wtforms.validators.Required()] ) + avatar_email = wtforms.TextField( + 'Avatar email', + [wtforms.validators.optional()] + ) class ConfirmationForm(wtf.Form): From dda077635aa512513b974b035771b92a1d5ef491 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 08 2015 10:41:52 +0000 Subject: [PATCH 5/6] Adjust the update_description endpoint to support editing the avatar_email as well --- diff --git a/pagure/templates/settings.html b/pagure/templates/settings.html index 7dad6a7..cf4da4d 100644 --- a/pagure/templates/settings.html +++ b/pagure/templates/settings.html @@ -15,10 +15,27 @@

Settings

-

Update description

+

Update project

- + + + + + + + + + +
+ + +
+
+ + + +
diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index dd9a8d5..623a50a 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -774,11 +774,15 @@ def update_description(repo, username=None): form = pagure.forms.DescriptionForm() 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 SESSION.add(repo) SESSION.commit() - flask.flash('Description updated') + flask.flash('Project updated') except SQLAlchemyError, err: # pragma: no cover SESSION.rollback() flask.flash(str(err), 'error') From a3121edb8020f4df6f7c6e7f0ac681d941be4855 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 08 2015 10:43:23 +0000 Subject: [PATCH 6/6] Adjust the unit-tests for testing updating the avatar_email field in the UI --- diff --git a/tests/test_progit_flask_ui_repo.py b/tests/test_progit_flask_ui_repo.py index 6ca66b6..4fb3243 100644 --- a/tests/test_progit_flask_ui_repo.py +++ b/tests/test_progit_flask_ui_repo.py @@ -290,8 +290,46 @@ class PagureFlaskRepotests(tests.Modeltests): self.assertEqual(output.status_code, 200) self.assertTrue('
' in output.data) self.assertTrue('

Settings

' in output.data) + self.assertIn( + '', output.data) + self.assertTrue( + '
  • Project updated
  • ' + in output.data) + + # Edit the avatar_email + data = { + 'description': 'new description for test project #1', + 'avatar_email': 'pingou@fp.o', + 'csrf_token': csrf_token, + } + output = self.app.post( + '/test/updatedesc', data=data, follow_redirects=True) + self.assertEqual(output.status_code, 200) + self.assertTrue('
    ' in output.data) + self.assertTrue('

    Settings

    ' in output.data) + self.assertIn( + '', + output.data) self.assertTrue( - '
  • Description updated
  • ' + '
  • Project updated
  • ' + in output.data) + + # Reset the avatar_email + data = { + 'description': 'new description for test project #1', + 'avatar_email': '', + 'csrf_token': csrf_token, + } + output = self.app.post( + '/test/updatedesc', data=data, follow_redirects=True) + self.assertEqual(output.status_code, 200) + self.assertTrue('
    ' in output.data) + self.assertTrue('

    Settings

    ' in output.data) + self.assertIn( + '', + output.data) + self.assertTrue( + '
  • Project updated
  • ' in output.data) @patch('pagure.ui.repo.admin_session_timedout') @@ -386,7 +424,6 @@ class PagureFlaskRepotests(tests.Modeltests): '' in output.data) - data = { 'csrf_token': csrf_token, 'project_documentation': 'y',