Giter Site home page Giter Site logo

gratipay / gratipay.com Goto Github PK

View Code? Open in Web Editor NEW
1.1K 78.0 308.0 105.2 MB

Here lieth a pioneer in open source sustainability. RIP

Home Page: https://gratipay.news/the-end-cbfba8f50981

License: MIT License

JavaScript 5.46% Shell 0.92% Python 74.06% CSS 9.61% PLpgSQL 5.83% HTML 3.75% Makefile 0.25% SQLPL 0.12%

gratipay.com's Introduction

Welcome to Gratipay

Gratipay helps companies pay for open source, in order to cultivate an economy of gratitude, generosity, and love.

Scope Documentation
company
policies, procedures, etc.
http://inside.gratipay.com
product
customer-facing pages
https://gratipay.com/about
software installation โ† You are here!
python library https://gratipay.readthedocs.io/

Table of Contents

Quick Start

Thanks for hacking on Gratipay! Be sure to review CONTRIBUTING as well if that's what you're planning to do.

Unix-like

Given Python 2.7, Postgres 9.6, and a C/make toolchain:

git clone https://github.com/gratipay/gratipay.com.git
cd gratipay.com
createdb gratipay
make schema fake

Now make run to boot the app or make test to run the tests.

Read more.

Vagrant

Given VirtualBox 4.3 and Vagrant 1.7.x:

vagrant up

Read more.

Docker

Given some version(?) of Docker:

docker build -t gratipay .
docker run -p 8537:8537 gratipay

Read more.

Installing

Satisfying Dependencies

Building, launching, developing and testing gratipay.com requires several pieces of software:

Unix-like operating systems (Ubuntu, macOS, etc.) generally include a C/make toolchain. If you're on Windows, your best bet is to use Vagrant or Docker.

All Python dependencies are bundled in our repo (under vendor/), but some include C extensions with additional operating-system level dependencies that need to be met. Here are notes for psycopg2. Other candidates for trouble are libsass and cryptography. Good luck!

Debian/Ubuntu

Maybe try scripts/bootstrap-debian.sh?

macOS

If make env gives you an Operation not permitted error from shutil.copytree then you're probably using the system Python and you should try Homebrew instead:

brew install python

Here are the installation options for Postgres.

If you are getting an error about unknown argument: '-mno-fused-madd' when running make, then add Wno-error=unused-command-line-argument-hard-error-in-future to your ARCHFLAGS environment variable and run make clean env again (see this Stack Overflow answer for more information):

ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future make clean env

Setting up a Database

The best version of Postgres to use is 9.6.2, because that's what we're using in production at Heroku. You need at least 9.5 to support the features we depend on, along with the pg_stat_statements and pg_trgm extensions.

To setup Postgres for Gratipay's needs run:

sudo -u postgres createuser --superuser $USER
createdb gratipay
createdb gratipay-test

You can speed up the test suite when using a regular HDD by running:

psql -q gratipay-test -c 'alter database "gratipay-test" set synchronous_commit to off'

Schema

Once Postgres is set up, run:

make schema

Which populates the database named by DATABASE_URL with the schema from sql/schema.sql.

Example data

The gratipay database created in the last step is empty. To populate it with some fake data, so that more of the site is functional, run this command:

make fake

Building

All Python dependencies (including virtualenv) are bundled with Gratipay in the vendor/ directory. Gratipay is designed so that you don't manage its virtualenv (a Python-specific sandboxing mechanism) directly and you don't download its dependencies at build time but rather at clone time. To create a virtualenv with all Python dependencies installed:

make env

If you haven't run Gratipay for a while, you can reinstall the dependencies:

make clean env

Add the necessary schemas and insert dummy data into postgres:

make schema
make fake

Launching

Once you've installed Python and Postgres and set up a database, you can use make to build and launch Gratipay:

make run

If you don't have make, look at the Makefile to see what steps you need to perform to build and launch Gratipay. The Makefile is pretty simple and straightforward.

If Gratipay launches successfully it will look like this:

$ make run
PATH=env/bin:{lots-more-of-your-own-PATH} env/bin/honcho run -e defaults.env,local.env web
[2017-08-25 15:05:18 -0400] [18093] [INFO] Starting gunicorn 19.7.1
[2017-08-25 15:05:18 -0400] [18093] [INFO] Listening at: http://0.0.0.0:8537 (18093)
[2017-08-25 15:05:18 -0400] [18093] [INFO] Using worker: sync
[2017-08-25 15:05:18 -0400] [18096] [INFO] Booting worker with pid: 18096
pid-18096 thread-140736833041344 (MainThread) Instantiating Application from gunicorn_entrypoint
pid-18096 thread-140736833041344 (MainThread) Reading configuration from defaults, environment, and kwargs.
pid-18096 thread-140736833041344 (MainThread)   base_url                                              default                 
pid-18096 thread-140736833041344 (MainThread)   changes_reload         False                          default                 
pid-18096 thread-140736833041344 (MainThread)   changes_reload         True                           environment variable ASPEN_CHANGES_RELOAD=yes
pid-18096 thread-140736833041344 (MainThread)   charset_dynamic        UTF-8                          default                 
pid-18096 thread-140736833041344 (MainThread)   charset_static         None                           default                 
pid-18096 thread-140736833041344 (MainThread)   colorize_tracebacks    True                           default                 
pid-18096 thread-140736833041344 (MainThread)   indices                [u'index.html', u'index.json', u'index', u'index.html.spt', u'index.json.spt', u'index.spt'] default                 
pid-18096 thread-140736833041344 (MainThread)   list_directories       False                          default                 
pid-18096 thread-140736833041344 (MainThread)   logging_threshold      0                              default                 
pid-18096 thread-140736833041344 (MainThread)   media_type_default     text/plain                     default                 
pid-18096 thread-140736833041344 (MainThread)   media_type_json        application/json               default                 
pid-18096 thread-140736833041344 (MainThread)   project_root           None                           default                 
pid-18096 thread-140736833041344 (MainThread)   project_root           .                              environment variable ASPEN_PROJECT_ROOT=.
pid-18096 thread-140736833041344 (MainThread)   renderer_default       stdlib_percent                 default                 
pid-18096 thread-140736833041344 (MainThread)   show_tracebacks        False                          default                 
pid-18096 thread-140736833041344 (MainThread)   show_tracebacks        True                           environment variable ASPEN_SHOW_TRACEBACKS=yes
pid-18096 thread-140736833041344 (MainThread)   www_root               None                           default                 
pid-18096 thread-140736833041344 (MainThread)   www_root               www/                           environment variable ASPEN_WWW_ROOT=www/
pid-18096 thread-140736833041344 (MainThread) project_root is relative to CWD: '.'.
pid-18096 thread-140736833041344 (MainThread) project_root set to /Users/whit537/personal/gratipay/gratipay.com.
pid-18096 thread-140736833041344 (MainThread) Found plugin for renderer 'jinja2'
pid-18096 thread-140736833041344 (MainThread) Renderers (*ed are unavailable, CAPS is default):
pid-18096 thread-140736833041344 (MainThread)   json_dump        
pid-18096 thread-140736833041344 (MainThread)   jsonp_dump       
pid-18096 thread-140736833041344 (MainThread)   stdlib_template  
pid-18096 thread-140736833041344 (MainThread)   stdlib_format    
pid-18096 thread-140736833041344 (MainThread)   jinja2           
pid-18096 thread-140736833041344 (MainThread)   STDLIB_PERCENT   
pid-18096 thread-140736833041344 (MainThread) Won't log to Sentry (SENTRY_DSN is empty).
pid-18096 thread-140736833041344 (MainThread) AWS SES is not configured! Mail will be dumped to the console here.
pid-18096 thread-140736833041344 (MainThread) Cron: not installing update_cta.
pid-18096 thread-140736833041344 (MainThread) Cron: not installing self_check.
pid-18096 thread-140736833041344 (MainThread) Cron: not installing <lambda>.
pid-18096 thread-140736833041344 (MainThread) Cron: not installing flush.
pid-18096 thread-140736833041344 (MainThread) Cron: not installing log_metrics.

You should then find this in your browser at http://localhost:8537/:

Success

Congratulations! Now enter a dollar amount less than 2000 (ironically), and submit the form to complete the basic flow:

More Success

You're off and running! At some point, try running the test suite.

Help!

If you get stuck somewhere along the way, make an issue here on GitHub.

Thanks for installing Gratipay! ๐Ÿ˜ƒ

Installing with Vagrant

Vagrant provides a convenient interface to VirtualBox to run and test Gratipay in virtual machine. This may be handy if you're on Windows.

You will need Vagrant and VirtualBox installed. On Linux you may need to install nfs-kernel-server as well.

With Vagrant, you can run Gratipay by running vagrant up from the project directory. Please note that if you ever switch between running Gratipay on your own machine to Vagrant or vice versa, you will need to run make clean.

The Vagrantfile will download a pristine Ubuntu image (base box), save it, and create a virtual machine (VM) in VirtualBox. Then it will set up Gratipay prerequisites (the process is known as "provisioning") and show a welcome message.

The next time you run vagrant up, it will reuse the VM. Vagrant uses SSH based authentication. To login to VM, use the vagrant ssh command. If you're prompted for a password when logging in, please use vagrant.

Mac users: If you're prompted for a password during initial installation, it's sudo and you should enter your Mac OS password.

Ubuntu users: If you experience problems, please see this issue. As mentioned there, you will also need to be wary of projects that are nested in encrypted directories.

Installing with Docker

You can also install/run Gratipay with Docker.

Build it with the included Dockerfile:

$ git clone https://github.com/gratipay/gratipay.com.git
$ cd gratipay.com
$ docker build -t gratipay .

Once you've built the image, you can launch a container:

$ docker run -d -p 8537:8537 gratipay

Check it out at localhost:8537!

To edit files and have those changes reflect in the running container, mount your local folder when you execute the run command:

$ docker run -d -v $PWD:/srv/gratipay.com -p 8537:8537 gratipay

You can get the running container's ID with docker ps. With that, you can

  • view the logs:
$ docker logs [container_id]
  • run commands within the project root:
$ docker exec [container_id] make schema
$ docker exec [container_id] make fake

Once you're done, kill the running container:

$ docker kill [container_id]

Configuring

Gratipay's default configuration lives in defaults.env. If you'd like to override some settings, create a file named local.env to store them.

The following explains some of the content of that file:

The GITHUB_* keys are for a gratipay-dev application in the Gratipay organization on Github. It points back to localhost:8537, which is where Gratipay will be running if you start it locally with make run. Similarly with the TWITTER_* keys, but there they required us to spell it 127.0.0.1.

If you are running Gratipay somewhere other than localhost:8537, then you'll need to set BASE_URL, but your options are limited because we use proprietary fonts from Typography.com, and they filter by Referer. You won't get the right fonts unless you use an approved domain. We've configured gratipay.dev as well as localhost, so if you don't want to run on localhost then configure gratipay.dev in your /etc/hosts file and set this in local.env:

BASE_URL=http://gratipay.dev:8537
GITHUB_CLIENT_ID=ca4a9a35c161af1d024d
GITHUB_CLIENT_SECRET=8744f6333d51b5f4af38d46cf035ecfcf34c671e
GITHUB_CALLBACK=http://gratipay.dev:8537/on/github/associate

If you wish to use a different username or database name for the database, you should override the DATABASE_URL in local.env using the following format:

DATABASE_URL=postgres://<username>@localhost/<database name>

We use Amazon Web Services' Simple Email Service (AWS SES) for sending emails. In development, we dump outbound mail to the console by default. This is fine if all you need to do is, e.g., copy/paste verification links. If you need to receive emails within a proper mail client during development, then sign up for AWS's free tier and override the AWS_* credentials from defaults.env in your local.env. You'll have to verify the email addresses you want to receive email with on SES.

Developing

Codebase Overview

Directory Frontend Backend Description
www โœ… web requests land here, e.g., https://gratipay.com/on/npm/express hits www/on/npm/%platform.spt (a simplate)
js
scss
โœ… JavaScript (w/ jQuery) and SCSS files, dynamically pipelined via endpoints at www/assets/gratipay.js.spt and .css.spt
templates
emails
โœ… templating files for web and email, respectively, using Jinja
gratipay โœ… a Python library with app wiring, models, and business logic
sql โœ… SQL files, the main one is schema.sql, changes go in a branch.sql, but there's also lots of raw SQL in Python strings throughout gratipay and even www
tests โœ… โœ… test scripts, tests/ttw run "through the web" on a real browser, tests/py simulate HTTP calls and exercise Python APIs
gratipay/testing โœ… โœ… submodule for infrastructure used by test scripts

Modifying CSS and JavaScript

We use SCSS, with files stored in scss/. All of the individual files are combined in scss/gratipay.scss which itself is compiled by libsass in www/assets/gratipay.css.spt on each request (it's behind a CDN in production).

We use a similar pattern for JavaScript. Individual files are in js/, and they're concatenated on the fly (and put behind a CDN in production) in www/assets/gratipay.js.spt.

Modifying the Database

We write SQL, specifically the PostgreSQL variant. To make schema or data changes, use deploy hooks.

Testing Build Status

Run Gratipay's test suite with:

make test

This invokes the pyflakes linter and then the pytest test runner with four layers of configuration (last wins): defaults.env, local.env, tests/defaults.env, tests/local.env. To run a subset of the test suite or otherwise influence the test run, pass arguments to py.test using an ARGS environment variable like so:

ARGS="tests/py/test_billing_payday.py -k notify -vvv" make test

The tests in tests/ttw ("through the web") require Firefox and geckodriver. The tests in tests/py do not.

Be careful! The test suite deletes data in all tables in the public schema of the database configured in your testing environment.

API

The Gratipay API is comprised of these four endpoints:

/about/charts.json (source)โ€”publicโ€”Returns an array of objects, one per week, showing aggregate numbers over time. The stats page uses this.

/about/paydays.json (source)โ€”publicโ€”Returns an array of objects, one per week, showing aggregate numbers over time. The old charts page used to use this.

/~username/public.json (example, source)โ€”publicโ€”Returns an object with these keys:

  • "taking"โ€”an estimate of the amount the given participant will take from Teams this week

  • "elsewhere"โ€”participant's connected accounts elsewhere; returns an object with these keys:

    • "bitbucket"โ€”participant's Bitbucket account; possible values are:
      • undefined (key not present)โ€”no Bitbucket account connected
      • https://bitbucket.org/api/1.0/users/%bitbucket_username
    • "github"โ€”participant's GitHub account; possible values are:
      • undefined (key not present)โ€”no GitHub account connected
      • https://api.github.com/users/%github_username
    • "twitter"โ€”participant's Twitter account; possible values are:
      • undefined (key not present)โ€”no Twitter account connected
      • https://api.twitter.com/1.1/users/show.json?id=%twitter_immutable_id&include_entities=1
    • "openstreetmap"โ€”participant's OpenStreetMap account; possible values are:
      • undefined (key not present)โ€”no OpenStreetMap account connected
      • http://www.openstreetmap.org/user/%openstreetmap_username

/~username/payment-instructions.json (source)โ€”privateโ€”Responds to GET with an array of objects representing your current payment instructions. A payment instruction is created when a ~user instructs Gratipay to make voluntary payments to a Team. Pass a team_slug with GET to fetch payment instruction only for that particular team. POST an array of objects containing team_slug and amount to bulk upsert payment instructions (make sure to set Content-Type to application/json). The amount must be encoded as a string rather than a number. In case the upsert is not successful for any object, there will be an error attribute in the response explaining the error along with the team_slug to identify the object for which the error occurred.

This endpoint requires authentication. Look up your user ID and API key on your account page and pass them using basic auth.

E.g.: Request

curl https://gratipay.com/~username/payment-instructions.json \
    -u $userid:$api_key \
    -X POST \
    -d '[{"amount": "1.00", "team_slug": "foobar"}]' \
    -H "Content-Type: application/json"

Response

[
    {
        "amount": "1.00",
        "ctime": "2016-01-30T12:38:00.182230+00:00",
        "due": "0.00",
        "mtime": "2016-02-06T14:37:28.532508+00:00",
        "team_name": "Foobar team",
        "team_slug": "foobar"
    }
]

API Implementations

Below are some projects that use the Gratipay APIs, that can serve as inspiration for your project!

Renamed to Gratipay

Still Using Gittip

These probably still work, but are using our old name:

Glossary

Account Elsewhere - An entity's registration on a platform other than Gratipay (e.g., Twitter).

Entity - An entity.

Participant - An entity registered with Gratipay.

User - A person using the Gratipay website. Can be authenticated or anonymous. If authenticated, the user is guaranteed to also be a participant.

License

MIT

gratipay.com's People

Contributors

aandis avatar bruceadams avatar cakey avatar chadwhitacre avatar changaco avatar clone1018 avatar edoverflow avatar eswat avatar galuszkak avatar jeromegn avatar jessawitzel avatar joealcorn avatar joeyespo avatar joonas avatar kaguillera avatar mattbk avatar mushketyk avatar mvdkleijn avatar oakes avatar patcon avatar rohitpaulk avatar rorepo avatar rummik avatar seanlinsley avatar sigmavirus24 avatar sim6 avatar simon-weber avatar techtonik avatar wyze avatar zwn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gratipay.com's Issues

make suggestions on homepage dynamic

Need more velocity for this to make sense.

We should only list people on the homepage who have claimed their account. That will mean they've opted in to the system as a participant.

add link to source and new issue submit on each page

We should funnel feedback from site users straight into Github. We'll get more feedback if we make a gremlin Github account for this purpose. We should communicate to users that if they want to interact about the issue they'll need a Github account.

start a test suite

It's barely acceptable to have launched without any testing, but if we go another bump without tests and code docs/comments I'm not going to feel good about it.

assess different fee for debit and credit cards

Original: "do what Venmo does, maybe"

Learned about Venmo tonight.

"This payment was free! You have $499.00 left of free credit card payments. After that, you can make debit payments from your bank for free, or choose to make credit card payments for a fee. "

Check them out for mobile payments.

reconfigure Google Analytics for blog + www

We want to funnel analytics from both subdomains into the same GA account. Here's the tracking code to add to both sites, I believe (note the "domain" attribute):

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-247427-33']);
  _gaq.push(['_setDomainName', 'gittip.com']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

automate payday

Heroku Scheduler doesn't have a weekly option, only daily. Open a support request with Heroku for this. In the meantime do one of:

  • modify the script to work when scheduled daily
  • use a cron on a different box than Heroku
  • run the script manually

Right now we're running it manually (on my laptop ๐Ÿ˜ฑ). We should automate this.

Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

implement a history page

We want this so we can review a user's activity deterministically. This will be important for support requests and our own troubleshooting. It should be available privately to users as well as to admins.

the sign out to reclaim flow is broken

If you are signed in as one github user we give the option to sign out and sign back in to claim a different github account. But signing out of gittip is not enough, you also need to sign out of github. We can link to the github signout link, but can we then redirect back to the gittip page? Not sure. Figure it out and implement it and then make the text prompt reflect reality.

clean up ui for managing my tips

  • Clicking a tip button on your own page should update the total tip amount dynamically.
  • It should also resort the list, probably after a 10 second delay or something. Reticketed as #568
  • I also think we want to show "people you stopped tipping recently" so that accidental untips can be rectified easily. Reticketed as #570.

pay in with bitcoin

Status: We need someone to join Team Gittip and take ownership of our bitcoin integration. Is it you?!

The essence of Gittip is recurring gifts, and there is (I gather) no way to do recurring bitcoin payments. Gittip will likely add explicit support for one-off (#5) and pre-paid (#113) gifts once the core recurring feature has matured. At that point we'll be ready for funding with bitcoin.

I (@whit537) am going to let someone else contribute the bulk of this work. On the pattern of Balanced contributing integration with their system (#78), my ideal would be to see a bitcoin processor such as Bit-Pay step forward and contribute integration with their service. A lesser option would be for a non-Bit-Pay member of the Gittip community to contribute the integration.

make run complains about missing conf

Hi, sorry I don't have much time to contribute, I just tried to run it and it doesn't work. I didn't see any documentation in your README referring to where to put the required configuration or in general how to startup the development environment.

sudo ./swaddle local.env ./env/bin/aspen \
        --www_root=www/ \
        --project_root=.. \
        --show_tracebacks=yes \
        --changes_reload=yes \
        --network_address=:80
[SWADDLE] local.env is not a file; environment unchanged.
pid-23591 thread-47493497806592 (MainThread) Reading configuration from defaults, environment, and command line.
pid-23591 thread-47493497806592 (MainThread)   changes_reload         False                          default                 
pid-23591 thread-47493497806592 (MainThread)   changes_reload         True                           command line option --changes_reload=yes
pid-23591 thread-47493497806592 (MainThread)   charset_dynamic        UTF-8                          default                 
pid-23591 thread-47493497806592 (MainThread)   charset_static         None                           default                 
pid-23591 thread-47493497806592 (MainThread)   configuration_scripts  []                             default                 
pid-23591 thread-47493497806592 (MainThread)   indices                [u'index.html', u'index.json', u'index'] default                 
pid-23591 thread-47493497806592 (MainThread)   list_directories       False                          default                 
pid-23591 thread-47493497806592 (MainThread)   logging_threshold      0                              default                 
pid-23591 thread-47493497806592 (MainThread)   media_type_default     text/plain                     default                 
pid-23591 thread-47493497806592 (MainThread)   media_type_json        application/json               default                 
pid-23591 thread-47493497806592 (MainThread)   network_address        ((u'0.0.0.0', 8080), 2)        default                 
pid-23591 thread-47493497806592 (MainThread)   network_address        ((u'0.0.0.0', 80), 2)          command line option --network_address=:80
pid-23591 thread-47493497806592 (MainThread)   network_engine         cherrypy                       default                 
pid-23591 thread-47493497806592 (MainThread)   project_root           None                           default                 
pid-23591 thread-47493497806592 (MainThread)   project_root           ..                             command line option --project_root=..
pid-23591 thread-47493497806592 (MainThread)   renderer_default       tornado                        default                 
pid-23591 thread-47493497806592 (MainThread)   show_tracebacks        False                          default                 
pid-23591 thread-47493497806592 (MainThread)   show_tracebacks        True                           command line option --show_tracebacks=yes
pid-23591 thread-47493497806592 (MainThread)   www_root               None                           default                 
pid-23591 thread-47493497806592 (MainThread)   www_root               www/                           command line option --www_root=www/
pid-23591 thread-47493497806592 (MainThread) project_root is relative: '..'.
pid-23591 thread-47493497806592 (MainThread) project_root set to /home/marko/Projects/www.gittip.com.
pid-23591 thread-47493497806592 (MainThread) Renderers (*ed are unavailable, CAPS is default):
pid-23591 thread-47493497806592 (MainThread)   TORNADO   
pid-23591 thread-47493497806592 (MainThread)  *pystache  ImportError: No module named pystache
pid-23591 thread-47493497806592 (MainThread)  *jinja2    ImportError: No module named jinja2
pid-23591 thread-47493497806592 (MainThread) Oh no! Aspen crashed!
pid-23591 thread-47493497806592 (MainThread) Traceback (most recent call last):
pid-23591 thread-47493497806592 (MainThread)   File "/home/marko/Projects/www.gittip.com/env/local/lib/python2.7/site-packages/aspen/server.py", line 122, in main
pid-23591 thread-47493497806592 (MainThread)     _main(argv)
pid-23591 thread-47493497806592 (MainThread)   File "/home/marko/Projects/www.gittip.com/env/local/lib/python2.7/site-packages/aspen/server.py", line 48, in _main
pid-23591 thread-47493497806592 (MainThread)     website = Website(argv)
pid-23591 thread-47493497806592 (MainThread)   File "/home/marko/Projects/www.gittip.com/env/local/lib/python2.7/site-packages/aspen/website.py", line 25, in __init__
pid-23591 thread-47493497806592 (MainThread)     self.configure(argv)
pid-23591 thread-47493497806592 (MainThread)   File "/home/marko/Projects/www.gittip.com/env/local/lib/python2.7/site-packages/aspen/configuration/__init__.py", line 347, in configure
pid-23591 thread-47493497806592 (MainThread)     execfile(filepath, {'website': self})
pid-23591 thread-47493497806592 (MainThread)   File "/home/marko/Projects/www.gittip.com/configure-aspen.py", line 8, in <module>
pid-23591 thread-47493497806592 (MainThread)     gittip.wireup.canonical()
pid-23591 thread-47493497806592 (MainThread)   File "/home/marko/Projects/www.gittip.com/gittip/wireup.py", line 13, in canonical
pid-23591 thread-47493497806592 (MainThread)     gittip.canonical_scheme = os.environ['CANONICAL_SCHEME']
pid-23591 thread-47493497806592 (MainThread)   File "/home/marko/Projects/www.gittip.com/env/lib/python2.7/UserDict.py", line 23, in __getitem__
pid-23591 thread-47493497806592 (MainThread)     raise KeyError(key)
pid-23591 thread-47493497806592 (MainThread) KeyError: 'CANONICAL_SCHEME'

collect anonymous two-sentence thank yous from tippers

Tippers should be able to leave two-sentence anonymous thank yous for tippees. These will show on tippee profile pages, and in a "featured" section on the homepage.

Was: Create Template for Features Content and Nominations

Warning, noob work below:

In order to highlight some of the great work being done by lesser-known civil-servant programmers and open-source heroes, Gittip should rotate ultra-short "Features"... short bios on tip-able git-members (around 10 lines). In order to crowd-source the content for the bio/feature and obtain nominations to help choose the features, an ultra-simple template should be made. Nominations are anonymous.

--Template Rough Draft--

Nominee's Github Username: WHIT537

Current Project: Gittip

Major Contributions: Aspen.io, Gittip, IHasAMoney.com

Anonymous two-sentence "Thank You": Chad has changed my life with all of his techno-shenanigans. If it weren't for his IHasAMoney project, I wouldn't know what to do WIF it, Thanks Chad, keep up the great work!

NOMINATE CHAD WHITACRE FOR MORE TIPS


Would it be useful to create this as a google form? Then you could later pull the content from a g-docs spreadsheet and input it into a content box on the main page. Thoughts on the concept as a whole?

add facebook authentication

Should be able to authenticate with a Facebook account. If already authenticated, should associated Facebook profile with existing Gittip participant account.

prevent tips to organization accounts

Right now you can tip to any github account, including organization accounts. I want to constrain it to personal accounts for now. If anyone should tip to an org before this is fixed then the policy is to reassign those tips amongst the organization's public members.

add google authentication

Should be able to authenticate with a Google+ account. If already authenticated, should associated Google+ profile with existing Gittip participant account.

This is near and dear to my heart because Guido uses Google+, and doesn't use Github or Facebook or Twitter.

solidify numbers for people

It's tricky because we don't want to require a credit card in order to tip, but we also want accurate numbers of what people are actually getting on the site.

We don't want to require a credit card because that is a huge barrier to entry and we want as many people as possible to have the fun of tipping (and for them to spread the word).

We also don't want to require a credit card because people can be given money through the site, of course, and that can then be used to give to other people later on.

We want accurate numbers of what people are being given through the site so that their expectations are not frustrated. I have $10 in my tipjar! What does that mean? I am getting $10 on Friday? I have a total balance of $10 already given to me? This is unclear. Currently we say "$10 pledged" but of course only $1.00 of that is backed. So (a) it's a downer when they only get $1, and (b) it's misleading to people watching who think, "Wow! This guy is really being given a lot!" when he's not really. Underpromise and overdeliver.

On the other hand we want the new tippers to have a good experience. If we're reporting tips pledged and they pledge a tip then we want that to be reflected immediately as positive feedback for the new tipper.

Here's what we'll do:

  1. Change the main profile heading from "foo has a few tips pledged" to "foo has received $100.00 over three months." In other words, make it reflect the (solid) past and not the (squishy) future. If they haven't received anything say "foo is waiting for their first tip."
  2. Add a second <h2> below the person's statement that says "foo has $1.00 in backed tips." (Drop the word pledge. It's not ours and it's kind of gross.) Add an explanatory note: "Backed tips are tips from people who either have a credit card on file that worked last week, or have enough in their account to cover all of their tips."
  3. When a new person tips, do more to encourage them to back their tip. "Back your tip with a credit card so that {{ username }} gets their tip from you this Friday!"

project tips

We need support for organizations and projects somehow. I would like to emphasize that groups are made up of individuals, and the individuals are responsible (for both good and ill). Need to define the semantics around individuals leaving and joining the group.

This is really a tough nut to crack. It's the line between group and individual. Right now Gittip is designed for individuals, but that means every individual has to be their own marketing department. It only works for "Internet rock stars." What about normal people? What about everyone who labors tirelessly without tooting their own horn? How does Gittip work for them?

comprehend bank transactions

It's vital that we aren't paying more fees than we're expecting for cc transactions, or we won't have cash to cover withdrawals.

switch to opt-in

Gittip.com is currently opt-out, and that's not cool. See below for discussion.

Original:

We've got a fine line to toe. Kachinga pissed people off by collecting money on their behalf without explicit permission. We're a bit different (donor pays fee vs. cut to recipient, coop vs. corp) but it remains to be seen whether we're different enough.

Even if the world is okay with us being opt-out instead of opt-in, we still need an opt-out mechanism. This would involve claiming an account and then clicking a big red "Stop taking donations for me" button.

(This started as #26 but then got derailed. Reticketing.)

expose UI for profile statement

There's a field in the database for each participant to make a "statement." It's actually already presented if it exists, there's just no UI for users to edit it. There should be.

I'm thinking of a prompt like, "I'm trying to make the world better by ..."

It's fine to start with a save button.

Nice to have: an auto-save feature (saves after 1 second of inactivity with a clear "Saved!" indication that then fades).

allow for one-off tips

The essence of Gittip is recurring tips, but once we solidify that I'm open to mixing in one-offs.

The reason recurring tips are important is because my mortgage is recurring and Gittip is about paying my mortgage.

There is a $80 open bounty on this issue. Add to the bounty at Bountysource.

add twitter authentication

Should be able to authenticate with a Twitter account. If already authenticated, should associated Twitter profile with existing Gittip participant account.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.