From f04d5fa03453ea8ca27b7d0ed15906bca9c165b6 Mon Sep 17 00:00:00 2001 From: mattbk Date: Tue, 30 Aug 2016 17:11:10 -0500 Subject: [PATCH 1/5] Edit TOS to decouple payins and payouts --- www/about/policies/terms-of-service.md | 203 +++++++++++++------------ 1 file changed, 103 insertions(+), 100 deletions(-) diff --git a/www/about/policies/terms-of-service.md b/www/about/policies/terms-of-service.md index 38815245b8..c949d10e45 100644 --- a/www/about/policies/terms-of-service.md +++ b/www/about/policies/terms-of-service.md @@ -6,7 +6,7 @@ These Terms of Service ("Terms") are an agreement between you, a user Gratipay. When you register as a Gratipay Participant, you agree to be bound by these Terms. -If you have any questions about these terms, please contact us: +If you have any questions about these Terms, please contact us: Gratipay, LLC 716 Park Road @@ -35,94 +35,95 @@ or damage arising from your failure to keep your account secure. your legal guardian must consent to your use and must agree to be bound by these Terms. -1. The Gratipay Model and General Rules +1. General Terms - 1. The Service is a platform to enable Teams of Gratipay Participants to - receive payments to fund Open Work. Open Work means that the Team provides -a clear path for any individual to voluntarily begin contributing to the Team's -work and to share in any revenue the Team generates. Some examples of Teams -performing Open Work include an open source software project that pays -contributors, or a hackerspace that pays individuals to teach classes or manage -its operations. + 1. The Service is a platform to facilitate payments for goods or services. + The nature and scope of such goods or services (the "Work") is defined by +Projects established on the Service. - 1. The Participant who establishes a Team is its Owner. Teams may optionally - have other Members. + 1. A Participant who establishes a Project is also a Project Owner. - 1. When you establish a Team on the Service to fund your Open Work, you agree - that payments will be used exclusively to support the Open Work described -in your Team's profile. + 1. Projects may optionally have other Participants as Collaborators. The + Project Owner is also a Collaborator. - 1. When you make a payment to a Team, it is a payment to fund the Open Work - the Team provides. You understand and acknowledge that your payment does -not entitle you personally to receive any goods or services from the Team, -unless the Team explicitly offers those things to Participants. + 1. A Participant may make payments to a Project Owner via a Project. A + Participant who makes payments via a Project is a Giver. - 1. By accepting a payment from a Participant, a Team forms an agreement with - that Participant to perform the Open Work described in its profile. The -Service is a platform to facilitate this agreement. Gratipay is not a party to -the agreement, and is not responsible to either the Team or the Participant if -either party breaches the terms of the agreement (e.g. if the Team fails to -provide the promised services). +1. Terms for Project Owners - 1. Gratipay is not obligated to provide refunds under any circumstance. Teams - are responsible for producing the Open Work they offer. Gratipay does not -hold funds on behalf of Teams, and does not warrant or guarantee that Teams -will provide the Open Work they promise. + 1. A Project Owner can use the Service to receive payments from Givers for + Work provided by the Project's Collaborators. When you establish a Project +on the Service, you agree that payments via the Project will be used +exclusively to support the Work described in the Project's profile. -1. Payroll Rules + 1. Project Owners may only make payments to Collaborators for their + collaboration in the Project's Work. - 1. Teams can use the Service's Payroll feature to automatically divide - incoming payments among Team Members, according to the allocation set by -the Owner and/or Members. + 1. Gratipay is not a party to any agreement between Project Owners and + Givers, and is not responsible to either the Project Owner or the Giver if +either party breaches the terms of any such agreement (e.g. if the Project +Owner fails to provide the promised goods or services). - 1. Gratipay does not determine how a Team's Payroll is allocated and is not - responsible for how Teams internally distribute payments. The agreement -between Team Members and Owners regarding the allocation of payments is solely -between those parties. + 1. Establishing a Project on Gratipay involves an application and approval + process. As part of this process, the Gratipay community will have the +opportunity to publicly evaluate and provide commentary about the Project. +However, all decisions regarding whether to accept, reject, suspend, remove, or +take any other action regarding a Project belong solely to Gratipay. -1. Rules for Gratipay Teams + 1. Gratipay reserves the right to reject, suspend, or remove a Project at any + time, and for any reason. - 1. Teams may accept payments on the Service only for Open Work, meaning that - they provide a clear path for any individual to voluntarily begin -contributing to the Team's work, and to share in any revenue the Team -generates. +1. Terms for Collaborators - 1. A Team can only begin receiving payments from Participants once it has - provided a working withdrawal mechanism for receiving payments (e.g. bank -account information). + 1. Project Owners can use the Service to distribute payments to + Collaborators. - 1. Teams and their Open Work must be consistent with Gratipay's [Brand - Guidelines](http://inside.gratipay.com/big-picture/brand/) and Acceptable -Use Policy. + 1. Collaborators may only receive payments from Project Owners for their + collaboration in the Project's Work. - 1. Gratipay reserves the right to reject, suspend, or remove a Team at any - time, and for any reason. + 1. Gratipay is not a party to any agreement between Project Owners and + Collaborators, and is not responsible to either the Project Owner or the +Collaborator if either party breaches the terms of any such agreement (e.g. if +the Collaborator fails to provide the promised goods or services). - 1. Establishing a Team on Gratipay involves an application and approval - process. As part of this process, the Gratipay community will have the -opportunity to publicly evaluate and provide commentary about the Team. -However, all decisions regarding whether to accept, reject, suspend, remove, or -take any other action regarding a Team belong solely to Gratipay. + 1. Gratipay does not determine how payments are allocated and is not + responsible for how Project Owners distribute payments. Any agreement +between the Project's Owner and other Collaborators regarding the allocation of +payments is solely between those parties. + +1. Terms for Givers + + 1. Givers may only make payments to Project Owners for the Project's Work. + + 1. You understand and acknowledge that your payment does not entitle you + personally to receive any goods or services from the Project Owner, unless +the Project Owner explicitly offers those things to Givers. + + 1. Project Owners are the only party responsible to Givers for producing the + Work their Project describes. Gratipay does not warrant or guarantee that +Project Owners will provide the Work they promise, and Gratipay is not +obligated to provide refunds to Givers or produce work under any circumstance. 1. Fees and Taxes - 1. Gratipay does not take any fee from payments made by Participants to - Teams. Gratipay and the Service are funded through the Service itself, by -voluntary contributions from Gratipay Participants and Teams who wish to fund -our own Open Work. To contribute to Gratipay, please [visit Gratipay's Team -page](/Gratipay/). + 1. Gratipay does not take any fee from payments made by Givers to Project + Owners, or by Project Owners to Collaborators. Gratipay and the Service +are funded through the Service itself, by voluntary payments from Givers who +wish to fund our own Work. To contribute to Gratipay, please visit Gratipay's +[Project page for the Service](/Gratipay/). 1. You are responsible for paying any third-party fees associated with your use of the Service, such as credit card and bank fees. 1. You are responsible for paying any taxes and withholdings associated with - your use of the Service. Team Owners, and not Gratipay, are responsible -for compliance with all laws, as well as any taxes and withholding -requirements, applicable to payments made to Team Members (whether through the -Payroll feature or otherwise), including without limitation payroll tax, -unemployment insurance, and worker compensation insurance payments. Team Owners -are also responsible for providing any required tax and other documentation to -employees, independent contractors, tax authorities, or any other person. + your use of the Service. In particular, Project Owners, and not Gratipay, +are responsible for compliance with all laws, as well as any taxes and +withholding requirements, applicable to payments made to Collaborators (whether +through the Service or otherwise), including without limitation payroll tax, +unemployment insurance, and worker compensation insurance payments. Project +Owners are also responsible for providing any required tax and other +documentation to employees, independent contractors, tax authorities, or any +other person. 1. Content Accessible on the Service @@ -148,8 +149,8 @@ content. However, Gratipay has no obligation to monitor, filter, or disable access to any content, and shall not be responsible if you encounter objectionable content by using the Service. - 1. The Service, including Participant and Team profiles, may contain links to - other websites. When you access third-party websites linked to from the + 1. The Service, including Participant and Project profiles, may contain links + to other websites. When you access third-party websites linked to from the Service, you do so at your own risk. Gratipay does not review, control, or endorse those sites. @@ -177,45 +178,47 @@ permissible, for example as fair use. 1. The following conduct is prohibited on the Service: - * Illegal activities, including the promotion or solicitation of illegal - acts. + 1. Illegal activities, including the promotion or solicitation of illegal + acts. - * Malicious activity or content, such as the transmission of viruses, - malware, or any other malicious or destructive code, or content or + 1. Malicious activity or content, such as the transmission of viruses, + malware, or any other malicious or destructive code, or content or activity intended to harm or disrupt the hardware, networks, or infrastructure of Gratipay or any third parties. - * Unauthorized access, including: accessing or attempting to access any - non-public interface, system, or functionality of the Service, or testing -the Service for vulnerabilities, except as described in our [security + 1. Unauthorized access, including: accessing or attempting to access any + non-public interface, system, or functionality of the Service, or +testing the Service for vulnerabilities, except as described in our [security disclosure policy](/about/security/). - * Abuse, including threats of violence or harassment of a Participant - through repeated unwanted contact. + 1. Abuse, including threats of violence or harassment of a Participant + through repeated unwanted contact. - * Posting anyone's personal or confidential information, such as social - security numbers, credit card numbers, street addresses, phone numbers, + 1. Posting anyone's personal or confidential information, such as social + security numbers, credit card numbers, street addresses, phone numbers, confidential ID numbers, or account passwords, without their permission. - * Account hijacking, including any access to or use of another - Participant's account without their permission. + 1. Aggressive trolling or activism. + + 1. Account hijacking, including any access to or use of another + Participant's account without their permission. - * Child exploitation, including any content or activity that exploits or - abuses children. + 1. Child exploitation, including any content or activity that exploits or + abuses children. - * Spam, including posting unsolicited promotional or commercial content in - comments, sending invitations for the purpose of advertising to the + 1. Spam, including posting unsolicited promotional or commercial content in + comments, sending invitations for the purpose of advertising to the recipients, or posting content or links for the purpose of manipulating search or other algorithms. - * Intellectual property infringement, including the infringing use of third - party trademarks or the unauthorized and unlawful posting of copyrighted -content. We respond to reports of copyright infringement as described in the -Copyright Policy. + 1. Intellectual property infringement, including the infringing use of + third party trademarks or the unauthorized and unlawful posting of +copyrighted content. We respond to reports of copyright infringement as +described in the Copyright Policy. - * Fraud or impersonation, including any use of the Service to impersonate - or deceive others. Contests or promotions that violate any applicable law -or regulation, or that suggest in any way that Gratipay is involved in or + 1. Fraud or impersonation, including any use of the Service to impersonate + or deceive others. Contests or promotions that violate any applicable +law or regulation, or that suggest in any way that Gratipay is involved in or responsible for the activity. 1. Gratipay's Service Providers @@ -229,15 +232,15 @@ agreement](https://www.braintreepayments.com/legal/bank-agreement-us). 1. Nonprofits and Charities using Gratipay - 1. If your Team is associated with a nonprofit organization, soliciting - payments on Gratipay may subject you to certain state laws regarding -charitable solicitations, including various registration, reporting, and audit -requirements. You are solely responsible for compliance with these and any -other applicable law or regulation. + 1. If you are a nonprofit organization, soliciting payments on Gratipay may + subject you to local laws regarding charitable solicitations, including +various registration, reporting, and audit requirements. You are solely +responsible for compliance with these and any other applicable law or +regulation. 1. Gratipay makes no representation or warranty regarding the tax-exempt - status of any Team, or the tax-deductible status of any payment made via -the Service. + status of any Project Owner, or the tax-deductible status of any payment +made via the Service. 1. Copyright Policy @@ -348,7 +351,7 @@ SERVICE; (ii) ANY CONDUCT OR CONTENT OF ANY THIRD PARTY ON THE SERVICE, INCLUDING WITHOUT LIMITATION, ANY DEFAMATORY, OFFENSIVE OR ILLEGAL CONDUCT OF OTHER PARTICIPANTS OR THIRD PARTIES; (iii) ANY CONTENT OBTAINED FROM THE SERVICE; OR (iv) UNAUTHORIZED ACCESS, USE OR ALTERATION OF YOUR TRANSMISSIONS -OR CONTENT. IN NO EVENT SHALL THE AGGREGATE LIABILITY OF GRATIPAY OR ITS +OR CONTENT. IN NO EVENT SHALL THE AGGREGATE LIABILITY OF GRATIPAY OR ITS AFFILIATES EXCEED THE GREATER OF ONE HUNDRED U.S. DOLLARS (U.S. $100.00) OR THE AMOUNT YOU PAID GRATIPAY, IF ANY, IN THE PAST SIX MONTHS FOR THE SERVICE GIVING RISE TO THE CLAIM. From 76656061c457c730d608b3430789e4b724e4ccda Mon Sep 17 00:00:00 2001 From: Chad Whitacre Date: Wed, 7 Dec 2016 14:59:22 -0500 Subject: [PATCH 2/5] Build all branches This means we'll have duplicate checks again, but that's a small price to pay for having Travis run PR inception for us. --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index ad4c559667..85f2e0e378 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,6 @@ language: python addons: postgresql: 9.3 -branches: - only: - - master before_install: - git branch -vv | grep '^*' - pwd From ab63da006eb8f870ce61ba9ed760ef5de6ea42ce Mon Sep 17 00:00:00 2001 From: Chad Whitacre Date: Wed, 7 Dec 2016 15:58:33 -0500 Subject: [PATCH 3/5] Remove the To-do URL (#4214) --- gratipay/models/team/__init__.py | 9 ++++----- gratipay/testing/harness.py | 6 ++---- gratipay/utils/fake_data.py | 2 +- sql/branch.sql | 5 +++++ tests/py/test_team_edit.py | 6 +----- tests/py/test_teams.py | 9 +-------- www/%team/edit/edit.json.spt | 3 +-- www/%team/edit/index.html.spt | 3 --- www/%team/index.html.spt | 4 ---- www/new.spt | 4 ---- www/teams/create.json.spt | 3 +-- 11 files changed, 16 insertions(+), 38 deletions(-) create mode 100644 sql/branch.sql diff --git a/gratipay/models/team/__init__.py b/gratipay/models/team/__init__.py index 56ad8ce03b..45f8e6a270 100644 --- a/gratipay/models/team/__init__.py +++ b/gratipay/models/team/__init__.py @@ -101,10 +101,10 @@ def insert(cls, owner, **fields): INSERT INTO teams (slug, slug_lower, name, homepage, - product_or_service, todo_url, onboarding_url, + product_or_service, onboarding_url, owner) VALUES (%(slug)s, %(slug_lower)s, %(name)s, %(homepage)s, - %(product_or_service)s, %(todo_url)s, %(onboarding_url)s, + %(product_or_service)s, %(onboarding_url)s, %(owner)s) RETURNING teams.*::teams @@ -170,7 +170,7 @@ def get_payment_distribution(self): def update(self, **kw): updateable = frozenset(['name', 'product_or_service', 'homepage', - 'onboarding_url', 'todo_url']) + 'onboarding_url']) cols, vals = zip(*kw.items()) assert set(cols).issubset(updateable) @@ -320,8 +320,7 @@ def to_dict(self): 'owner': '~' + self.owner, 'receiving': self.receiving, 'slug': self.slug, - 'status': self.status, - 'todo_url': self.todo_url + 'status': self.status } diff --git a/gratipay/testing/harness.py b/gratipay/testing/harness.py index 503bae3f02..0a5b0a56ea 100644 --- a/gratipay/testing/harness.py +++ b/gratipay/testing/harness.py @@ -168,10 +168,10 @@ def make_team(self, *a, **kw): team = self.db.one(""" INSERT INTO teams - (slug, slug_lower, name, homepage, product_or_service, todo_url, + (slug, slug_lower, name, homepage, product_or_service, onboarding_url, owner, is_approved, available) VALUES (%(slug)s, %(slug_lower)s, %(name)s, %(homepage)s, %(product_or_service)s, - %(todo_url)s, %(onboarding_url)s, %(owner)s, %(is_approved)s, + %(onboarding_url)s, %(owner)s, %(is_approved)s, %(available)s) RETURNING teams.*::teams """, _kw) @@ -321,5 +321,3 @@ def get_tip(self, tipper, tippee): LIMIT 1 """, (tipper, tippee), back_as=dict, default=default)['amount'] - - diff --git a/gratipay/utils/fake_data.py b/gratipay/utils/fake_data.py index dc018ac7d7..d5db0c0a15 100644 --- a/gratipay/utils/fake_data.py +++ b/gratipay/utils/fake_data.py @@ -142,6 +142,7 @@ def fake_team(db, teamowner, teamname=None): teamname = faker.first_name() + fake_text_id(3) ctime = teamowner.ctime + datetime.timedelta(days=7) + try: teamslug = slugize(teamname) homepage = 'http://www.example.org/' + fake_text_id(3) @@ -153,7 +154,6 @@ def fake_team(db, teamowner, teamname=None): , homepage=homepage , ctime=ctime , product_or_service=random.sample(productorservice,1)[0] - , todo_url=homepage + '/tickets' , onboarding_url=homepage + '/contributing' , owner=teamowner.username , is_approved=random.sample(isapproved,1)[0] diff --git a/sql/branch.sql b/sql/branch.sql new file mode 100644 index 0000000000..0cf462e947 --- /dev/null +++ b/sql/branch.sql @@ -0,0 +1,5 @@ +--https://github.com/gratipay/gratipay.com/pull/4214 + +BEGIN; + ALTER TABLE teams DROP COLUMN todo_url; +END; diff --git a/tests/py/test_team_edit.py b/tests/py/test_team_edit.py index 79eed96af4..417f82aaa9 100644 --- a/tests/py/test_team_edit.py +++ b/tests/py/test_team_edit.py @@ -242,7 +242,6 @@ def test_edit(self): 'product_or_service': 'We save galaxies.', 'homepage': 'http://starwars-enterprise.com/', 'onboarding_url': 'http://starwars-enterprise.com/onboarding', - 'todo_url': 'http://starwars-enterprise.com/todos', 'image': FileUpload(IMAGE, 'logo.png'), } data = json.loads(self.client.POST( '/enterprise/edit/edit.json' @@ -256,7 +255,6 @@ def test_edit(self): assert team.product_or_service == 'We save galaxies.' assert team.homepage == 'http://starwars-enterprise.com/' assert team.onboarding_url == 'http://starwars-enterprise.com/onboarding' - assert team.todo_url == 'http://starwars-enterprise.com/todos' assert team.load_image('original') == IMAGE def test_edit_supports_partial_updates(self): @@ -275,7 +273,6 @@ def test_edit_supports_partial_updates(self): assert team.product_or_service == 'We save galaxies.' assert team.homepage == 'http://starwars-enterprise.com/' assert team.onboarding_url == '' - assert team.todo_url == '' assert team.load_image('original') == IMAGE def test_edit_needs_auth(self): @@ -332,7 +329,7 @@ def test_can_edit_teams_under_review(self): def test_can_only_edit_allowed_fields(self): allowed_fields = set(['name', 'image', 'product_or_service', - 'homepage', 'onboarding_url', 'todo_url']) + 'homepage', 'onboarding_url']) team = self.make_team(slug='enterprise', is_approved=None) @@ -398,7 +395,6 @@ def test_edit_with_empty_data_does_nothing(self): 'product_or_service': 'We save galaxies.', 'homepage': 'http://starwars-enterprise.com/', 'onboarding_url': 'http://starwars-enterprise.com/onboarding', - 'todo_url': 'http://starwars-enterprise.com/todos', } self.make_team(**team_data) r = self.client.POST( '/enterprise/edit/edit.json' diff --git a/tests/py/test_teams.py b/tests/py/test_teams.py index 0fa8452c04..b83ee294b4 100644 --- a/tests/py/test_teams.py +++ b/tests/py/test_teams.py @@ -170,7 +170,6 @@ class TestTeams(Harness): 'product_or_service': 'We make widgets.', 'homepage': 'http://gratipay.com/', 'onboarding_url': 'http://inside.gratipay.com/', - 'todo_url': 'https://github.com/gratipay', 'agree_public': 'true', 'agree_payroll': 'true', 'agree_terms': 'true', @@ -227,12 +226,10 @@ def test_casing_of_urls_survives(self): self.post_new(dict( self.valid_data , homepage='Http://gratipay.com/' , onboarding_url='http://INSIDE.GRATipay.com/' - , todo_url='hTTPS://github.com/GRATIPAY' )) team = T('gratiteam') assert team.homepage == 'Http://gratipay.com/' assert team.onboarding_url == 'http://INSIDE.GRATipay.com/' - assert team.todo_url == 'hTTPS://github.com/GRATIPAY' def test_casing_of_slug_survives(self): self.make_participant('alice', claimed_time='now', email_address='', last_paypal_result='') @@ -301,9 +298,6 @@ def test_error_message_for_bad_url(self): r = self.post_new(dict(self.valid_data, onboarding_url='foo'), expected=400) assert "an http[s]:// URL for the 'Self-onboarding Documentation URL' field." in r.body - r = self.post_new(dict(self.valid_data, todo_url='foo'), expected=400) - assert "Please enter an http[s]:// URL for the 'To-do URL' field." in r.body - def test_error_message_for_invalid_team_name(self): self.make_participant('alice', claimed_time='now', email_address='alice@example.com', last_paypal_result='') data = dict(self.valid_data) @@ -451,7 +445,6 @@ def test_update_works(self): 'product_or_service': 'We save galaxies.', 'homepage': 'http://starwars-enterprise.com/', 'onboarding_url': 'http://starwars-enterprise.com/onboarding', - 'todo_url': 'http://starwars-enterprise.com/todos', } team.update(**update_data) team = T('enterprise') @@ -460,7 +453,7 @@ def test_update_works(self): def test_can_only_update_allowed_fields(self): allowed_fields = set(['name', 'product_or_service', 'homepage', - 'onboarding_url', 'todo_url']) + 'onboarding_url',]) team = self.make_team(slug='enterprise') diff --git a/www/%team/edit/edit.json.spt b/www/%team/edit/edit.json.spt index b9ba8f074c..e7f92830ad 100644 --- a/www/%team/edit/edit.json.spt +++ b/www/%team/edit/edit.json.spt @@ -21,7 +21,6 @@ field_names = { 'product_or_service': 'Product or Service', 'homepage': 'Homepage', 'onboarding_url': 'Self-onboarding Documentation URL', - 'todo_url': 'To-do URL', } if user.ANON: @@ -54,7 +53,7 @@ for field in data.keys(): if not value: raise Response(400, _("Please fill out the '{}' field.", field_names[field])) - if (field in ('homepage', 'onboarding_url', 'todo_url') + if (field in ('homepage', 'onboarding_url') and not valid_url(value)): raise Response(400, _( "Please enter an http[s]:// URL for the '{}' field." diff --git a/www/%team/edit/index.html.spt b/www/%team/edit/index.html.spt index a721cf3ad7..351574ac69 100644 --- a/www/%team/edit/index.html.spt +++ b/www/%team/edit/index.html.spt @@ -60,9 +60,6 @@ suppress_sidebar = True - - -

diff --git a/www/%team/index.html.spt b/www/%team/index.html.spt index 6517aef79f..b6b9665b8e 100644 --- a/www/%team/index.html.spt +++ b/www/%team/index.html.spt @@ -45,10 +45,6 @@ is_team_owner = not user.ANON and team.owner == user.participant.username | {{ _("Onboarding") }} {% endif %} - {% if team.todo_url %} - | {{ _("To-do") }} - {% endif %} - {% if user.ADMIN or is_team_owner %} |{{ _( "{a} Edit team {_a}" , a=''|safe diff --git a/www/new.spt b/www/new.spt index b116af13ba..9c39338763 100644 --- a/www/new.spt +++ b/www/new.spt @@ -68,10 +68,6 @@ suppress_sidebar = True ) }}

- -

{{ _("Where can people find a list of available work to do for your Team?") }}

- -

{{ _("Agreements") }}

- + - - - - - - + + +

diff --git a/www/%team/index.html.spt b/www/%team/index.html.spt index b6b9665b8e..89fc0f5e03 100644 --- a/www/%team/index.html.spt +++ b/www/%team/index.html.spt @@ -41,10 +41,6 @@ is_team_owner = not user.ANON and team.owner == user.participant.username
{{ _("Homepage") }} - {% if team.onboarding_url %} - | {{ _("Onboarding") }} - {% endif %} - {% if user.ADMIN or is_team_owner %} |{{ _( "{a} Edit team {_a}" , a=''|safe diff --git a/www/new.spt b/www/new.spt index 9c39338763..a5e54de5b3 100644 --- a/www/new.spt +++ b/www/new.spt @@ -6,15 +6,15 @@ from gratipay.models.team import Team request.allow('GET') if user.ANON: - raise Response(401, _("You must sign in to apply for a new Team.")) + raise Response(401, _("You must sign in to apply for your project to join Gratipay.")) if user.participant.email_address is None: - raise Response(400, _("You must have a verified email address to apply for a new Team.")) + raise Response(400, _("You must have a verified email address to apply for your project to join Gratipay.")) if not user.participant.has_payout_route: - raise Response(400, _("You must attach a PayPal account to apply for a new Team.")) + raise Response(400, _("You must attach a PayPal account to apply for your project to join Gratipay.")) -title = _("Apply for a New Team") +title = _("Apply to Join Gratipay") banner = _("Apply") suppress_sidebar = True [---] text/html @@ -33,7 +33,7 @@ suppress_sidebar = True }