Actually take out approval code
[oweals/karmaworld.git] / README.md
1 # KarmaWorld
2 __Description__: A django application for sharing and uploading class notes.
3
4 __Copyright__: FinalsClub, a 501c3 non-profit organization
5
6 __License__: GPLv3 except where otherwise noted
7
8 __Contact__: info@karmanotes.org
9
10 v3.0 of the karmanotes.org website from the FinalsClub Foundation
11
12 # Purpose
13
14 KarmaNotes is an online database of college lecture notes.  KarmaNotes empowers college students to participate in the free exchange of knowledge. 
15
16 # Pre-Installation
17
18 ## Code
19
20 Before doing anything, you'll need the code. Grab it from github.
21
22 Clone the project from the central repo using your github account:
23
24     git clone git@github.com:FinalsClub/karmaworld.git
25
26 If you aren't using a system setup for github, then grab the project with
27 this command instead:
28
29     git clone https://github.com/FinalsClub/karmaworld.git
30
31 Generally speaking, this will create a subdirectory called `karmaworld` under
32 the directory where the `git` command was run. This git repository directory
33 will be referred to herein as `{project_root}`.
34
35 There might be some confusion as the git repository's directory will likely be
36 called `karmaworld` (this is `{project_root}`), but there is also a `karmaworld`
37 directory underneath that (`{project_root}/karmaworld`) alongside files like
38 `fabfile.py` (`{project_root}/fabfile.py`) and `README.md`
39 (`{project_root}/README.md`).
40
41 ## External Service Dependencies
42
43 Notice: This software makes use of external third party services which require
44 accounts to access the service APIs. Without these third parties available,
45 this software may require considerable overhaul. These services have
46 API keys, credentials, and other information that you must provide to KarmaNotes
47 as environment variables. The best way to persist these environment variables is
48 by using a `.env` file. Copy `.env.example` to `.env` and populate the fields as
49 required.
50
51 ### Heroku
52 This project has chosen to use [Heroku](www.heroku.com) to host the Django and
53 celery software. While not a hard requirement, the more up-to-date parts of this
54 documentation will operate assuming Heroku is in use.
55
56 See README.heroku for more information.
57
58 ### Celery Queue
59 Celery uses the Apache Message Queueing Protocol for passing messages to its workers.
60 We recommend using Heroku's CloudAMQP add-on, getting your own CloudAMQP account, or
61 running a queueing system on your own. The `CLOUDAMQP_URL` environment variable must be set correctly
62 for KarmaNotes to be able to use Celery. The `CELERY_QUEUE_NAME` environment variable
63 must be set to the name of the queue you wish to use. Settings this to something unique
64 allows multiple instances of KarmaNotes (or some other software) to share the same queueing server.
65
66 ### Amazon S3
67 The instructions for creating an [S3](http://aws.amazon.com/s3/) bucket may be
68 [found on Amazon.](http://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html)
69
70 Two, separate buckets will be needed in production: one for static file hosting
71 and one as a communication bus with Filepicker.
72
73 This software uses S3 to store files which are sent to or received 
74 from Filepicker. Filepicker will need to know the S3 bucket name, access key,
75 and secret key.
76
77 Filepicker users can only make use of an S3 bucket with a paid account. For
78 development purposes, no Filepicker S3 bucket is needed. Skip all references to
79 the Filepicker S3 bucket in the development case.
80
81 The software will not need to know the S3 credentials for the Filepicker
82 bucket, because the software will upload files to the Filepicker S3 bucket
83 through Filepicker's API and it will link to or download files from the
84 Filepicker S3 bucket through Filepicker's URLs. This will be covered in the
85 Filepicker section below.
86
87 This software uses S3 for hosting static files. The software will need to
88 update static files on the S3 bucket. As such, the software will need the
89 S3 bucket name, access key, and secret key via the environment variables. This
90 is described in subsections below.
91
92 To support static hosting, `DEFAULT_FILE_STORAGE` should be set to
93 `'storages.backends.s3boto.S3BotoStorage'`, unless there is a compelling reason
94 to change it.
95
96 There are three ways to setup access to the S3 buckets depending upon speed
97 and security. The more secure, the slower it will be to setup.
98
99 #### insecure S3 access
100 For quick and dirty insecure S3 access, create a single group and a single user
101 with full access to all buckets. Full access to all buckets is insecure!
102
103 Create an 
104 [Amazon IAM group](http://docs.aws.amazon.com/IAM/latest/UserGuide/Using_CreatingAndListingGroups.html)
105 with full access to the S3 bucket. Select the "Amazon S3 Full Accesss" Policy
106 Template.
107
108 Create an
109 [Amazon IAM user](http://docs.aws.amazon.com/IAM/latest/UserGuide/Using_SettingUpUser.html).
110 Copy the credentials into the `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`
111 environment variables. Be sure to write down the access information, as it
112 will only be shown once.
113
114 #### secure S3 access
115 For secure S3 access, two users will be needed. One with access to the
116 Filepicker bucket and one with access to the static hosting bucket.
117
118 Note: this might need to be modified to prevent creation and deletion of
119 buckets?
120
121 Create an 
122 [Amazon IAM group](http://docs.aws.amazon.com/IAM/latest/UserGuide/Using_CreatingAndListingGroups.html)
123 with full access to the S3 bucket. The quick way is to select the
124 "Amazon S3 Full Accesss" Policy Template and replace `"Resource": "*"` with 
125 `"Resource": "arn:aws:s3:::<static_bucket_name>"`.
126
127 Create an
128 [Amazon IAM user](http://docs.aws.amazon.com/IAM/latest/UserGuide/Using_SettingUpUser.html).
129 Copy the credentials into the `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`
130 environment variables. Be sure to write down the access information, as it
131 will only be shown once.
132
133 Ensure the created user is a member of the group with access to the S3
134 static files bucket.
135
136 Repeat the process again, creating a group for the Filepicker bucket and
137 creating a user with access to that group. These credentials will be passed
138 on to Filepicker.
139
140 #### somewhat secure S3 access
141 Create two groups as described in the `secure S3 access` section above.
142
143 Create a single user, save the credentials as described in the
144 `insecure S3 access` section above, and pass the credentials on to Filepicker.
145
146 Add the single user to both groups.
147
148 This is less secure because if your web server or Filepicker get compromised
149 (so there are two points for potential failure), the single compromised
150 user has full access to both buckets.
151
152 ### Amazon Cloudfront CDN
153 [Cloudfront CDN](http://aws.amazon.com/cloudfront/) assists static file hosting.
154
155 Follow
156 [Amazon's instructions](http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/GettingStarted.html)
157 to host static files out of the appropriate S3 bucket. Note that Django's static
158 file upload process has been modified to mark static files as publicly
159 assessible.
160
161 In the settings for the Cloudfront Distribution, copy the "Domain Name" from
162 General settings and set `CLOUDFRONT_DOMAIN` to it. For example, `abcdefghij.cloudfront.net`.
163
164 ### Amazon Mechanical Turk
165 Mechanical turk is employed to generate human feedback from uploaded notes.
166 This service is helpful for generating flash cards and quizzes.
167
168 This service is optional and it might cause unexpected charges when
169 deployed.  If the required environment variable is not found,
170 then no errors will occur and no mechanical turk tasks will be created, avoiding any unexpected
171 costs.
172
173 The `MTURK_HOST` environment variable is almost certainly
174 `"mechanicalturk.amazonaws.com"`.
175
176 The code will create and publish HITs on your behalf.
177
178 ### Google Drive
179 This software uses [Google Drive](https://developers.google.com/drive/) to
180 convert documents to and from various file formats.
181
182 A Google Drive service account with access to the Google Drive is required.
183 This may be done with a Google Apps account with administrative privileges, or ask
184 your business sysadmin.
185
186 Follow [Google's instructions](https://developers.google.com/drive/delegation)
187 to create a Google Drive service account.
188
189 Convert the p12 file into a Base64 encoded string for the
190 `GOOGLE_SERVICE_KEY_BASE64` environment variable. There are many ways to do
191 this. If Python is available, the
192 [binascii library](https://docs.python.org/2/library/binascii.html#binascii.b2a_base64)
193 makes this very easy:
194
195         import binascii
196         with open('file.p12', 'r') as f:
197             print binascii.b2a_base64(f.read)
198
199 Copy the contents of `client_secret_*.apps.googleusercontent.com.json` into the
200 `GOOGLE_CLIENT_SECRETS` environment variable.
201
202 ### Filepicker
203 This software uses [Filepicker.io](https://www.inkfilepicker.com/) for uploading
204 files. This requires an account with Filepicker.
205
206 Filepicker can use an additional third party file hosting site where it may
207 send uploaded files. This project, in production, uses Amazon S3 as the third
208 party. See the Amazon S3 section above for more information.  
209
210 Create a new App with Web SDK and provide the Heroku App URL for the
211 Application's URL. You'll be given an API Key for the App. Paste this into the
212 `FILEPICKER_API_KEY` environment variable.
213
214 Find the 'App Security' button on the left hand side of the web site. Make sure
215 'Use Security' is enabled. Generate a new secret key. Paste this key into the
216 `FILEPICKER_SECRET` environment variable.
217
218 If you have an upgraded plan, you can configure Filepicker to have access to
219 your Filepicker S3 bucket. Click 'Amazon S3' on the left hand side menu and
220 supply the credentials for the user with access to the Filepicker S3 bucket.
221
222 ### IndexDen
223 KarmaNotes uses IndexDen to create a searchable index of all the notes in the
224 system. Create an free IndexDen account at
225 [their homepage](http://indexden.com/). You will be given a private URL that
226 accesses your IndexDen account. This URL is visible on your dashboard (you
227 might need to scroll down).
228
229 Set the `INDEXDEN_PRIVATE_URL` environment variable to your private URL.
230
231 Set the `INDEXDEN_INDEX` environment variable to the name of the index you want
232 to use for KarmaNotes. The index will be created automatically when KarmaNotes
233 is run if it doesn't already exist. It may be created through the GUI if
234 desired.
235
236 ### Twitter
237
238 Twitter is used to post updates about new courses. Access to the Twitter API
239 will be required for this task.
240
241 If this Twitter feature is desired, the consumer key and secret as well as the
242 access token key and secret are needed by the software.
243
244 If the required environment variables are not found, then no errors will occur
245 and no tweets will be posted.
246
247 To set this up,
248 [create a new Twitter application](https://dev.twitter.com/apps/new).
249 Use your Heroku App URL for the website field. Leave the Callback field blank.
250
251 Make sure this application has read/write access. Generate an access token. Go
252 to your OAuth settings, and grab the "Consumer key", "Consumer secret",
253 "Access token", and "Access token secret". Paste these, respectively, into the
254 environment variables `TWITTER_CONSUMER_KEY`, `TWITTER_CONSUMER_SECRET`,
255 `TWITTER_ACCESS_TOKEN_KEY`, `TWITTER_ACCESS_TOKEN_SECRET`.
256
257 ### SSL Certificate
258
259 If you wish to host your system publicly, you'll need an SSL certificate
260 signed by a proper authority.
261
262 Follow [Heroku's SSL setup](https://devcenter.heroku.com/articles/ssl-endpoint)
263 to get SSL running on your server.
264
265 You may set the `SSL_REDIRECT` environment variable to `true` to make KarmaNotes
266 redirect insecure connections to secure ones.
267
268 # Local Install
269
270 KarmaNotes is a Heroku application. Download the [Heroku toolbelt](https://toolbelt.heroku.com/).
271
272 Before your running it for the first time, there are
273 a few setup steps:
274   1. `virtualenv venv`
275   1. `source venv/bin/activate`
276   1. `pip install -r requirements.txt`
277   1. `pip install -r requirements-dev.txt`
278   1. `foreman run python manage.py syncdb --migrate --noinput`
279   1. `foreman run python manage.py createsuperuser`
280   1. `foreman run python manage.py fetch_usde_csv ./schools.csv`
281   1. `foreman run python manage.py import_usde _csv ./schools.csv`
282   1. `foreman run python manage.py sanitize_usde_schools`
283
284 To run KarmaNotes locally, make sure you are inside your
285 virtual environment (`source venv/bin/activate`) and run `foreman start`.
286 Press ctrl-C to kill foreman. Foreman will run Django's runserver command.
287 If you wish to have more control over how this is done, you can do
288 `foreman run python manage.py runserver <options>`. For running any other
289 `manage.py` commands, you should also precede them with `foreman run` like just shown.
290 This simply ensures that the environment variables from `.env` are present.
291
292 # Heroku Install
293
294 KarmaNotes is a Heroku application. Download the [Heroku toolbelt](https://toolbelt.heroku.com/).
295
296 To run KarmaNotes on Heroku, do `heroku create` and `git push heroku master` as typical
297 for a Heroku application. Set your the variable `BUILDPACK_URL` to
298 `https://github.com/charlesconnell/heroku-buildpack-karmanotes` to use a buildpack designed
299 to support KarmaNotes.
300
301 You will need to import the US Department of Education's list of accredited schools.
302    1. Fetch USDE schools with
303       `heroku run python manage.py fetch_usde_csv ./schools.csv`
304    1. Upload the schools into the database with
305       `heroku run python /manage.py import_usde _csv ./schools.csv`
306    1. Clean up redundant information with
307       `heroku run python /manage.py sanitize_usde_schools`
308
309
310 # Django Database management
311
312 ## South
313
314 We have setup Django to use
315 [south](http://south.aeracode.org/wiki/QuickStartGuide) for migrations. When
316 changing models, it is important to run
317 `foreman run python manage.py schemamigration` which will create a migration
318  to reflect the model changes into the database. These changes can be pulled
319 into the database with `foreman run python manage.py migrate`.
320
321 Sometimes the database already has a migration performed on it, but that
322 information wasn't told to south. There are subtleties to the process which
323 require looking at the south docs. As a tip, start by looking at the `--fake`
324 flag.
325
326 # Assets from Third Parties
327
328 A number of assets have been added to the repository which come from external
329 sources. It would be difficult to keep a complete list in this README and keep
330 it up to date. Software which originally came from outside parties can
331 generally be found in `karmaworld/assets`.
332
333 Additionally, all third party Python projects (downloaded and installed with
334 pip) are listed in these files:
335
336 * `requirements.txt`
337 * `requirements-dev.txt`
338
339 # Thanks
340
341 * KarmaNotes.org is a project of the FinalsClub Foundation with generous funding from the William and Flora Hewlett Foundation
342
343 * Also thanks to [rdegges](https://github.com/rdegges/django-skel) for the django-skel template