diff --git a/KNotes/settings.py b/KNotes/settings.py index 1728516..7dfeb2d 100644 --- a/KNotes/settings.py +++ b/KNotes/settings.py @@ -1,5 +1,9 @@ -# settings.py is part of Karma Notes -# Django settings for KNotes project. +#!/usr/bin/python2.7 +# -*- coding:utf8 -*- +""" Django settings for KNotes project. """ +import os + +from djcelery import setup_loader ''' Secrets ''' from notes.credentials import FACEBOOK_ID @@ -28,10 +32,7 @@ from notes.credentials import DEFAULT_FROM_EMAIL -import os -import djcelery -djcelery.setup_loader() # Is this running on the karmanotes.org box? DEPLOY = True @@ -86,16 +87,12 @@ ADMINS = ( ("Seth Woodworth", 'seth@finalsclub.org'), - ("David Brodsky", 'david@finalsclub.org'), ("Charles Holbrow", 'charles@finalsclub.org') ) MANAGERS = ADMINS -# For autocomplete -SIMPLE_AUTOCOMPLETE_MODELS = ('notes.School', 'notes.Course') - -TIME_ZONE = 'America/New_York' +IME_ZONE = 'America/New_York' # Language code for this installation. All choices can be found here: # http://www.i18nguy.com/unicode/language-identifiers.html @@ -302,7 +299,12 @@ 'notes', ) -# Django-Celery settings +###=========================== +# django-celery configuration + +setup_loader() + +# TODO: set up rabbitmq properly BROKER_URL = "django://" if DEPLOY: @@ -313,8 +315,12 @@ else: CELERY_RESULT_DBURI = "sqlite:///karmaNotes.sql" +# end django-celery conf +######################## + +###======================= +## HAYSTACK Configuration -### HAYSTACK Configuration HAYSTACK_SITECONF = 'notes.search_sites' HAYSTACK_SEARCH_ENGINE = 'solr' @@ -323,6 +329,9 @@ # ...or for multicore... #HAYSTACK_SOLR_URL = 'http://127.0.0.1:8983/solr/mysite' +## end HAYSTACK conf +###================== + # A sample logging configuration. The only tangible logging # performed by this configuration is to send an email to # the site admins on every HTTP 500 error when DEBUG=False. @@ -352,6 +361,9 @@ } } +###=================== +## AWS SES email conf + EMAIL_USE_TLS = True EMAIL_HOST = 'email-smtp.us-east-1.amazonaws.com' EMAIL_HOST_USER = SMTP_USERNAME @@ -361,6 +373,9 @@ TEMPLATED_EMAIL_TEMPLATE_DIR = 'templated_email/' # use '' for top level template dir, ensure there is a trailing slash TEMPLATED_EMAIL_FILE_EXTENSION = 'email' +## end SES email conf +###=================== + try: # For development, mv the initial file `dev_settings.py` to be named `local_settings.py` from local_settings import * diff --git a/KNotes/templates/ajax/search_results.html b/KNotes/templates/ajax/search_results.html deleted file mode 100644 index a910b96..0000000 --- a/KNotes/templates/ajax/search_results.html +++ /dev/null @@ -1,26 +0,0 @@ -{% for result in results %} - - {% if result.object.viewCount %} - - {% include "file.html" with file=result.object %} - - - {% elif result.object.academic_year %} - - {% include "course.html" with course=result.object %} - - - {% elif result.object.name %} - - {% include "school.html" with school=result.object %} - {% endif %} - -{% endfor %} -{% if page.has_previous or page.has_next %} - -
- {% if page.has_previous %}{% endif %}« Previous{% if page.has_previous %}{% endif %} - | - {% if page.has_next %}{% endif %}Next »{% if page.has_next %}{% endif %} -
-{% endif %} diff --git a/KNotes/templates/ajax/view-file.html b/KNotes/templates/ajax/view-file.html deleted file mode 100644 index 2531a68..0000000 --- a/KNotes/templates/ajax/view-file.html +++ /dev/null @@ -1,74 +0,0 @@ -{% extends 'navigation.html' %} - -{% block title %} -{{ file.course.title }} || {{ file.title }} -{% endblock %} - -{% block navinner %} -
-
- -
-
-
-

{{ file.title }}

- - {# TODO: make this use something like the course_info.html file #} -
-

About this Class

-

{{ file.course.title }}

- {{ file.course.instructor }} | {{ file.school.name }} - - -
- {% if file.course.files.count >= 1 %} - This class has {{ file.course.files.count }} notes. - {% endif %} - -
- -

About this file

-
{{file.description}} -
- - -
- {{ file_type }}: 10 points - {{ file.viewCount }} views -
-
- {% include "file-actions.html" with file=file %} -
-
-
-
- -
- -
-
-
-
-
- -{% endblock %} - -{% block scripts %} - - - -{% endblock %} diff --git a/KNotes/templates/ajaxFormResponse_min.html b/KNotes/templates/ajaxFormResponse_min.html deleted file mode 100644 index 2239634..0000000 --- a/KNotes/templates/ajaxFormResponse_min.html +++ /dev/null @@ -1,27 +0,0 @@ -{% load url from future %} - -

{{ message }}


-
-
- {% csrf_token %} - {% for field in form.hidden_fields %} - {{field}} - {% endfor %} - {% for field in form.visible_fields %} -
- -
- {{ field }} - {{field.errors}} -
-
- {% endfor %}
- -
-
- \ No newline at end of file diff --git a/KNotes/templates/base.html b/KNotes/templates/base.html deleted file mode 100644 index 15d76b8..0000000 --- a/KNotes/templates/base.html +++ /dev/null @@ -1,126 +0,0 @@ -{% load url from future %} - - - - - - - - - - - - - - - - - - - - - - - - Karma Notes -- {% block title %}{% endblock %} - - {% block header %} - {% endblock %} - - - - - -{% block content %} -{% endblock %} - - - - - - - - - - -{% include 'modal_add_course.html' %} -{% include 'modal_share_karma.html' %} -{% include 'modal_upload.html' %} - -{% if not user.is_authenticated %} - -{% endif %} - -{% block scripts %} -{% endblock %} - - diff --git a/KNotes/templates/browse_courses.html b/KNotes/templates/browse_courses.html deleted file mode 100644 index 6bfa65f..0000000 --- a/KNotes/templates/browse_courses.html +++ /dev/null @@ -1,27 +0,0 @@ -{% extends 'navigation.html' %} - -{% block title %} - Browse {{ school.name }} Courses -{% endblock %} - -{% block navinner %} -
-

Browse {{ school.name }} Courses

Click on a course to see notes from that course. -
-
-{% if courses %} - {% for course in courses %} - {% include 'course.html' with course=course %} - {% endfor %} -{% else %} -

Sorry, there don't seem to be any courses for this school

-

Would you like to -

- Upload notes -
-

-{% endif %} -
- -{% endblock %} - diff --git a/KNotes/templates/browse_one_course.html b/KNotes/templates/browse_one_course.html deleted file mode 100644 index fa81873..0000000 --- a/KNotes/templates/browse_one_course.html +++ /dev/null @@ -1,91 +0,0 @@ -{% extends 'navigation.html' %} - -{% block title %} - Course -- {{ course.title }} -{% endblock %} - -{% block navinner %} - -{% include 'course_info.html' %} - - - - -
-
- - - {% for event in events %} - - - - - - {% endfor %} - -
- - - {% include 'karma_events/course_log.html' with event=event %}
-
- at {{ event.timestamp }} -
-
- -
-{% if files %} - {% for file in files %} - {% include 'file.html' with file=file %} - {% endfor %} -{% else %} -

There aren't any notes for this course yet. Would you like to upload some?

-

Would you like to -

-

-{% endif %} -
- -{% endblock %} - -{% block scripts %} - - -{% endblock %} - diff --git a/KNotes/templates/browse_schools.html b/KNotes/templates/browse_schools.html deleted file mode 100644 index 5635c0d..0000000 --- a/KNotes/templates/browse_schools.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends 'navigation.html' %} - -{% block title %} - Browse Schools -{% endblock %} - -{% block navinner %} -
-

Browse Schools

Click on a school to see courses from that school. -
-
- {% for school in schools %} - {% include 'school.html' with school=school %} - {% endfor %} -
- -{% endblock %} - diff --git a/KNotes/templates/course_info.html b/KNotes/templates/course_info.html deleted file mode 100644 index 5a3c1f1..0000000 --- a/KNotes/templates/course_info.html +++ /dev/null @@ -1,53 +0,0 @@ -
-

About this Class

-

{{ course.title }}

- - {{ course.instructor }} | {{ course.school.name }} - - - - -
- {% if course.files.count >= 1 %} - This class has {{ course.files.count }} notes. - {% else %} - This course doesn't have any notes yet. - {% endif %} -    - {% if course.url %} - Course Homepage - {% else %} - {# TODO: js inline editing and ajax save endpoint #} - add a Course Homepage - {% endif %} - - {# TODO: implement actual count here before launch or remove it #} - -
- {% include "course-actions.html" with course=course %} -
-
-
- - {# TODO: include professor email address if we have it #} - -
-

Students Enrolled

- {# TODO: find limit of horizontal space and set upper bound to forloop #} - {% for user in profiles %} - - {% endfor %} - - {% if user.get_profile not in profiles %} - add this course to my profile - {% endif %} - -
-
-
diff --git a/KNotes/templates/email_confirmed.html b/KNotes/templates/email_confirmed.html deleted file mode 100644 index 9f29939..0000000 --- a/KNotes/templates/email_confirmed.html +++ /dev/null @@ -1,53 +0,0 @@ -{% extends "base.html" %} -{% load url from future %} - -{% block header %} - - -{% endblock %} - -{% block content %} -
- - - - -
-
-
-
-

Email Confirmed!

-
-

It's you after all! We're redirecting you to your profile...

-
-
-
-
-
- -{% include 'footer.html' %} -{% endblock %} - -{% block scripts %} - - - -{% endblock %} diff --git a/KNotes/templates/footer.html b/KNotes/templates/footer.html deleted file mode 100644 index ad68dc4..0000000 --- a/KNotes/templates/footer.html +++ /dev/null @@ -1,20 +0,0 @@ - diff --git a/KNotes/templates/getting-started.html b/KNotes/templates/getting-started.html deleted file mode 100644 index 19661ad..0000000 --- a/KNotes/templates/getting-started.html +++ /dev/null @@ -1,24 +0,0 @@ -{% extends 'navigation.html' %} - -{% block title %} - Getting Started -{% endblock %} - -{% block navinner %} - - {% for task in tasks %} - - - - - - - {% endfor %} - -

{{ forloop.counter }}.

- {{ task.message }} -
{{ task.karma }} points{% if task.status %} {% endif %} -
-{% endblock %} - diff --git a/KNotes/templates/home.html b/KNotes/templates/home.html deleted file mode 100644 index b4d37ea..0000000 --- a/KNotes/templates/home.html +++ /dev/null @@ -1,151 +0,0 @@ -{% extends "base.html" %} -{% load url from future %} - -{% block header %} - - -{% endblock %} - -{% block content %} -
- - - - -
-
- -
-
-

Share notes. Ace your exams.

-

Upload your notes to get instant access to over {{ file_count }} study materials. Free.

-
- UPLOAD FILE -
-
for instant access
- {#
Or drag + drop anywhere on this page
#} -
-
-
-
- - - - -

Recently uploaded notes

- - -
-{% include 'footer.html' %} -{% endblock %} - -{% block scripts %} - - - - - -{% endblock %} diff --git a/KNotes/templates/jobs.html b/KNotes/templates/jobs.html deleted file mode 100644 index 4adc442..0000000 --- a/KNotes/templates/jobs.html +++ /dev/null @@ -1,151 +0,0 @@ -{% extends "base.html" %} -{% load url from future %} - -{% block header %} - - -{% endblock %} - -{% block content %} -
- - - - -
-
-
-
-

Jobs

-
-

Web Pioneer

-

The FinalsClub foundation is looking for a Django web developer who's excited about advancing education through open source software.

- -

We're building KarmaNotes.org, a community which enables students across the world to share notes and other academic materials.

- -

Our team is small, so you'll have an opportunity to leave your mark and build experience throughout our application. You'll deploy on a daily basis and build a respectable portfolio. All our code is open source and publicly available on GitHub!

- -

Our site digests user files (documents, pdfs, and images) and presents them for viewing (and eventually editing) all within the browser. The back-end logic is Python/Django with JavaScript/jQuery folded in to the front-end templates.

- -

Requirements

- -
    -
  • 1-3 years experience with an object oriented programming language (Python preferred).
  • -
  • Mastery of basic computer science concepts, such as data structures and algorithmic complexity.
  • -
  • Familiarity with relational databases.
  • -
  • You know how the web works, at least from HTTP to HTML.
  • -
  • A self-starter with the ability to work independently and meet team goals.
  • -
  • Experience shipping real products.
  • -
-

Apply!

-
-
-
-
- -{% include 'footer.html' %} -{% endblock %} - -{% block scripts %} - - - - - -{% endblock %} diff --git a/KNotes/templates/karma-events.html b/KNotes/templates/karma-events.html deleted file mode 100644 index 2dd9ab7..0000000 --- a/KNotes/templates/karma-events.html +++ /dev/null @@ -1,35 +0,0 @@ -{% extends 'navigation.html' %} - -{% block title %} - Karma Events -{% endblock %} - -{% block navinner %} -
-
-
-

Karma Events

- This is a list of activities that have added or subtracted to your karma score -
- - - - {% for event in events %} - - - - - - {% endfor %} - - - - -{% endblock %} diff --git a/KNotes/templates/karma_wall.html b/KNotes/templates/karma_wall.html deleted file mode 100644 index 5ec1f4b..0000000 --- a/KNotes/templates/karma_wall.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends 'index.html' %} -{% block content %} - -

Hey {{user.get_profile.getName}}!

-
-

You need a bit more Karma to {{permission}}!

-
-
-
-
-

{{request.user.get_profile.karma}} / {{ required_level.karma }}

-

Pts

- -{% endblock %} \ No newline at end of file diff --git a/KNotes/templates/modal/modal_add_course.html b/KNotes/templates/modal/modal_add_course.html deleted file mode 100644 index 3228056..0000000 --- a/KNotes/templates/modal/modal_add_course.html +++ /dev/null @@ -1,31 +0,0 @@ - - - diff --git a/KNotes/templates/modal/modal_login.html b/KNotes/templates/modal/modal_login.html deleted file mode 100644 index 1c92177..0000000 --- a/KNotes/templates/modal/modal_login.html +++ /dev/null @@ -1,31 +0,0 @@ -{# TODO: Is this used and does it work? the homepage has a different dropdown defined there that works #} - diff --git a/KNotes/templates/modal/modal_share_karma.html b/KNotes/templates/modal/modal_share_karma.html deleted file mode 100644 index f637698..0000000 --- a/KNotes/templates/modal/modal_share_karma.html +++ /dev/null @@ -1,38 +0,0 @@ - - - diff --git a/KNotes/templates/modal/modal_upload.html b/KNotes/templates/modal/modal_upload.html deleted file mode 100644 index 8a8a22a..0000000 --- a/KNotes/templates/modal/modal_upload.html +++ /dev/null @@ -1,166 +0,0 @@ -{% load url from future %} - - - - - - -{# TODO: Break this script into a js template file #} - - - - - diff --git a/KNotes/templates/models/school.html b/KNotes/templates/models/school.html deleted file mode 100644 index 540cba7..0000000 --- a/KNotes/templates/models/school.html +++ /dev/null @@ -1,18 +0,0 @@ - -
-
- -
- - -
-
diff --git a/KNotes/templates/navigation.html b/KNotes/templates/navigation.html deleted file mode 100644 index 5570b44..0000000 --- a/KNotes/templates/navigation.html +++ /dev/null @@ -1,532 +0,0 @@ -{% extends "base.html" %} -{% load url from future %} - -{% block title %} - Your Personal Profile Page {{ user.get_profile.getName }} -{% endblock %} - -{% block content %} - - -
-
-
- - -
- - - {% block navinner %} -
-

Welcome, {{ user.get_profile.getName }}!

- - {% comment %} - {# disabling messages for now #} - {# ------ Messages ------ #} - {% for message in messages %} -
- - {{ message.body}} -
- {% endfor %} - {% endcomment%} - - - -
- {% if user.get_profile.courses.all %} -

Your Courses

- {% for course in user.get_profile.courses.all %} - {% include 'course.html' with course=course %} - {% endfor %} - {% else %} -

You haven't added any courses yet

-

Would you like to

- - {% endif %} -
- - {% if request.user.get_profile.school != None %} -
- Would you like to add additional courses to your school? - - -
- {% endif %} - - {% if your_files %} -
-

Your Files

- {% for file in your_files %} - {% include 'file.html' with file=file %} - {% endfor %} -
- {% endif %} - -
-{% endblock %} -
-
-
-
- -{% endblock %} - -{% block scripts %} - - - - - - -{% endblock %} diff --git a/KNotes/templates/search_results2.html b/KNotes/templates/search_results2.html deleted file mode 100644 index 186efcc..0000000 --- a/KNotes/templates/search_results2.html +++ /dev/null @@ -1,39 +0,0 @@ -{% extends 'navigation.html' %} -{% load highlight %} - -{% block navinner %} -{% if results|length == 0 %} -

No Results

-{% endif %} -{% for result in results %} - - {% if result.object.viewCount %} - - {% include "file.html" with file=result.object %} - {% for highlight in result.highlighted.text %} - {{highlight|safe}} - {% endfor %} - - - - {% elif result.object.academic_year %} - - {% include "course.html" with course=result.object %} - - - {% elif result.object.name %} - - {% include "school.html" with school=result.object %} - {% endif %} - -{% endfor %} -{% if page.has_previous or page.has_next %} - -
- {% if page.has_previous %}{% endif %}« Previous{% if page.has_previous %}{% endif %} - | - {% if page.has_next %}{% endif %}Next »{% if page.has_next %}{% endif %} -
-{% endif %} - -{% endblock %} diff --git a/KNotes/templates/static/ToS.html b/KNotes/templates/static/ToS.html deleted file mode 100644 index 79d2bdb..0000000 --- a/KNotes/templates/static/ToS.html +++ /dev/null @@ -1,72 +0,0 @@ -{% extends "base.html" %} - -{% block scripts %} -{% endblock %} - -{% block content %} -
- -
-
-
-
-

KarmaNotes.org Terms of Service

-
-

Last updated: April 13, 2012

-

These Terms of Service ("Terms") govern your access to and use of the services, websites, and applications offered by KarmaNotes (the "Service"). Your access to and use of the Service is conditioned on your acceptance of and compliance with these Terms. By accessing or using the Service you agree to be bound by these Terms.

- -

Use of the Service

-

You may use the Service only if you can form a binding contract with KarmaNotes, and only in compliance with these Terms and all applicable local, state, national, and international laws, rules and regulations. You must provide us accurate information when you create your account on KarmaNotes. We may, without prior notice, change the Service; stop providing the Service or features of the Service, to you or to users generally; or create usage limits for the Service. You are responsible for safeguarding the password that you use to access the Service and for any activities or actions under your password. We encourage you to use "strong" passwords (that use a combination of upper and lower case letters, numbers and symbols) with your account. KarmaNotes will not be liable for any loss or damage arising from your failure to comply with these requirements.

- -

User Content

-

"Content" means any information, text, graphics, or other materials uploaded, downloaded or appearing on the Service. The original copyright holder retains all rights to any content that you (the user) submit, post, display, or otherwise make available on the Service.

- -

Your License to KarmaNotes

-

By submitting, posting or displaying Content on or through the Service, you grant KarmaNotes permission to share all content under a Creative Commons Attribution Share-Alike 3.0 Unported (CC BY-SA 3.0) license. For more information, see http://creativecommons.org/licenses/by-sa/3.0/us/ If you would like more information, please contact us directly.

- -

You agree that this license includes the right for other users of the Service to modify your Content, and for KarmaNotes to make your Content available to others for the publication, distribution, syndication, or broadcast of such Content on other media and services, subject to our terms and conditions for such Content use. Such additional uses by KarmaNotes or others may be made with no compensation paid to you with respect to the Content that you submit, post, transmit or otherwise make available through the Service. We may modify or adapt your Content in order to transmit, display or distribute it over computer networks and in various media and/or make changes to your Content as are necessary to conform and adapt that Content to any requirements or limitations of any networks, devices, services or media.

- - - -

KarmaNotes's Licenses to You

-

Subject to these Terms, KarmaNotes gives you a worldwide, royalty-free, non-assignable and non-exclusive license to re-post any of the Content on KarmaNotes anywhere on the rest of the web provided that the Content was added to the Service after June 22, 2011, and provided that the user who created the content has not explicitly marked the content as not for reproduction, and provided that you: (a) do not modify the Content; (b) attribute KarmaNotes with a human and machine-followable link (an A tag) linking back to the page displaying the original source of the content on KarmaNotes.org (c) upon request, either by KarmaNotes or a user, remove the user's name from Content which the user has subsequently made anonymous; (d) upon request, either by KarmaNotes or by a user who contributed to the Content, make a reasonable effort to update a particular piece of Content to the latest version on KarmaNotes.org; and (e) upon request, either by KarmaNotes or by a user who contributed to the Content, make a reasonable attempt to delete Content that has been deleted on KarmaNotes.org. Your Content will be viewable by other users of the Service and through third party services and websites. You should only provide Content for which you have received express consent to record and share under these Terms.

- -

All Content, whether publicly posted or privately transmitted, is the sole responsibility of the person who originated such Content. We may not monitor or control the Content posted via the Service. Any use of or reliance on any Content or materials posted via the Service or obtained by you through the Service is at your own risk. We do not endorse, support, represent or guarantee the completeness, truthfulness, accuracy, or reliability of any Content or communications posted via the Service or endorse any opinions expressed via the Service. You understand that by using the Service, you may be exposed to Content that might be offensive, harmful, inaccurate or otherwise inappropriate. Under no circumstances will KarmaNotes be liable in any way for any Content, including, but not limited to, any errors or omissions in any Content, or any loss or damage of any kind incurred as a result of the use of any Content made available via the Service or broadcast elsewhere. You are responsible for your use of the Service, for any Content you provide, and for any consequences thereof, including the use of your Content by other users and third parties partners. You understand that your Content may be republished and if you do not have the right to submit Content for such use, it may subject you to liability. KarmaNotes will not be responsible or liable for any use of your Content by KarmaNotes in accordance with these Terms. You represent and warrant that you have all the rights, power and authority necessary to grant the rights granted herein to any Content that you submit.

- -

We reserve the right at all times (but will not have an obligation) to remove or refuse to distribute any Content on the Service and to terminate users or reclaim usernames. We also reserve the right to access, read, preserve, and disclose any information as we reasonably believe is necessary to (i) satisfy any applicable law, regulation, legal process or governmental request, (ii) enforce the Terms, including investigation of potential violations hereof, (iii) detect, prevent, or otherwise address fraud, security or technical issues, (iv) respond to user support requests, or (v) protect the rights, property or safety of KarmaNotes, its users and the public.

- -

Rules

-

You must not do any of the following while accessing or using the Service: (i) use the Service for any unlawful purposes or for promotion of illegal activities; (ii) post any Content (as defined below) or use the Service in violation of any applicable law (including intellectual property laws, right of privacy or publicity laws, and any laws of a non-U.S. jurisdiction applicable to you), or any contractual or other legal obligation; (iii) post Content that is hateful, abusive, threatening, profane, or otherwise objectionable; (iv) post Content or use the Service to create an impression that you know is incorrect, misleading, or deceptive, including by impersonating others or otherwise misrepresenting your affiliation with a person or entity; (v) publish or post other people's private or personally identifiable information without their express authorization and permission; (vi) use the Service for the purpose of spamming anyone; (vii) publish or link to malicious content intended to damage or disrupt another user's browser or computer or to compromise a user's privacy; (viii) access or tamper with non-public areas of the Service, KarmaNotes's computer systems, or the technical delivery systems of KarmaNotes's providers; (ix) probe, scan, or test the vulnerability of any system or network or breach or circumvent any security or authentication measures; (x) access or search or attempt to access or search the Service by any means (automated or otherwise) other than through the currently available, published interfaces that are provided by KarmaNotes (and only pursuant to those terms and conditions), unless you have been specifically allowed to do so in a separate agreement with KarmaNotes (crawling the Service is permissible in accordance with these Terms, but scraping the Service without the prior consent of KarmaNotes except as permitted by these Terms is expressly prohibited); (xi) forge any TCP/IP packet header or any part of the header information in any email or posting, or in any way use the Service to send altered, deceptive or false source-identifying information; or (xii) interfere with or disrupt (or attempt to do so) the access of any user, host or network, including, without limitation, sending a virus, overloading, flooding, spamming, mail-bombing the Service, or by scripting the creation of Content in such a manner as to interfere with or create an undue burden on the Service.

- -

Proprietary Rights

-

All right, title, and interest in and to the Service (excluding Content provided by users) are and will remain the exclusive property of the original copyright holder.

- -

Copyright Policy

-

KarmaNotes respects the intellectual property rights of others and expects users of the Service to do the same. We will respond to notices of alleged copyright infringement that comply with applicable law and are properly provided to us. If you believe that your Content has been copied in a way that constitutes copyright infringement, please provide our copyright agent with the following information in accordance with the Digital Millennium Copyright Act: (i) a physical or electronic signature of the copyright owner or a person authorized to act on their behalf; (ii) identification of the copyrighted work claimed to have been infringed; (iii) identification of the material that is claimed to be infringing or to be the subject of infringing activity and that is to be removed or access to which is to be disabled, and information reasonably sufficient to permit us to locate the material; (iv) your contact information, including your address, telephone number, and an email address; (v) a statement by you that you have a good faith belief that use of the material in the manner complained of is not authorized by the copyright owner, its agent, or the law; and (vi) a statement that the information in the notification is accurate, and, under penalty of perjury, that you are authorized to act on behalf of the copyright owner. Our designated copyright agent for notice of alleged copyright infringement or other legal notices regarding Content appearing on the Service is: - -

KarmaNotes.org. Attn: Copyright Agent 1132 Massachusetts Avenue Cambridge, MA 02138 Email: Info [at] KarmaNotes.org

- -

Please note that in addition to being forwarded to the person who provided the allegedly illegal content, we may send a copy of your notice (with your personal information removed) to Chilling Effects (www.chillingeffects.org) for publication and/or annotation. You can see an example of such a publication at http://www.chillingeffects.org/fairuse/notice.cgi?NoticeID=16887. A link to your published notice will be displayed on KarmaNotes in place of the removed content. We reserve the right to remove Content alleged to be infringing or otherwise illegal without prior notice and at our sole discretion. In appropriate circumstances, KarmaNotes will also terminate a user's account if the user is determined to be a repeat infringer.

- -

Privacy

-

KarmaNotes values your privacy. We will never sell any personal user information stored on KarmaNotes.org with any third-party corporations or organizations without your express consent. By using the Service you consent to the transfer of your information to the United States and/or other countries for storage, processing and use by KarmaNotes. Note that user information stored with any of our affiliate services, such as docs.google.com, is subject to the terms of service of those service-providers. Please consult the respective Terms of Service for any affiliate services for specific details.

- -

Links

- -

The Service may contain links to third-party websites or resources. You acknowledge and agree that we are not responsible or liable for: (i) the availability or accuracy of such websites or resources; or (ii) the content, products, or services on or available from such websites or resources. Links to such websites or resources do not imply any endorsement by KarmaNotes of such websites or resources or the content, products, or services available from such websites or resources. You acknowledge sole responsibility for and assume all risk arising from your use of any such websites or resources. Disclaimers; Indemnity Your access to and use of the Service or any Content is at your own risk. You understand and agree that the Service is provided to you on an "AS IS" and "AS AVAILABLE" basis. Without limiting the foregoing, KARMANOTES AND ITS PARTNERS DISCLAIM ANY WARRANTIES, EXPRESS OR IMPLIED, OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. We make no warranty and disclaim all responsibility and liability for the completeness, accuracy, availability, timeliness, security or reliability of the Service or any content thereon. KarmaNotes will not be responsible or liable for any harm to your computer system, loss of data, or other harm that results from your access to or use of the Service, or any Content. You also agree that KarmaNotes has no responsibility or liability for the deletion of, or the failure to store or to transmit, any Content and other communications maintained by the Service. We make no warranty that the Service will meet your requirements or be available on an uninterrupted, secure, or error-free basis. No advice or information, whether oral or written, obtained from KarmaNotes or through the Service, will create any warranty not expressly made herein. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, KARMANOTES AND ITS AFFILIATES, OFFICERS, EMPLOYEES, AGENTS, PARTNERS AND LICENSORS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR PUNITIVE DAMAGES, INCLUDING WITHOUT LIMITATION, LOSS OF PROFITS, DATA, USE, GOOD-WILL, OR OTHER INTANGIBLE LOSSES, RESULTING FROM (i) YOUR ACCESS TO OR USE OF OR INABILITY TO ACCESS OR USE THE SERVICE; (ii) ANY CONDUCT OR CONTENT OF ANY THIRD PARTY ON THE SERVICE, INCLUDING WITHOUT LIMITATION, ANY DEFAMATORY, OFFENSIVE OR ILLEGAL CONDUCT OF OTHER USERS OR THIRD PARTIES; (iii) ANY CONTENT OBTAINED FROM THE SERVICE; AND (iv) UNAUTHORIZED ACCESS, USE OR ALTERATION OF YOUR TRANSMISSIONS OR CONTENT, WHETHER BASED ON WARRANTY, CONTRACT, TORT (INCLUDING NEGLIGENCE) OR ANY OTHER LEGAL THEORY, WHETHER OR NOT KARMANOTES HAS BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGE, AND EVEN IF A REMEDY SET FORTH HEREIN IS FOUND TO HAVE FAILED OF ITS ESSENTIAL PURPOSE. Some jurisdictions do not allow the exclusion of certain warranties or the exclusion or limitation of liability for consequential or incidental damages, so the limitations above may not apply to you.

- -

If anyone brings a claim against us related to your actions or Content on the Service, or actions or Content by or from someone using your account, you will indemnify and hold us harmless from and against all damages, losses, and expenses of any kind (including reasonable legal fees and costs) related to such claim.

- -

General Terms

-

These Terms and any action related thereto will be governed by the laws of the State of Massachusetts without regard to or application of its conflict of law provisions or your state or country of residence. Unless submitted to arbitration as set forth in the following paragraph, all claims, legal proceedings or litigation arising in connection with the Service will be brought solely in Cambridge, Massachusetts, and you consent to the jurisdiction of and venue in such courts and waive any objection as to inconvenient forum. For any claim (excluding claims for injunctive or other equitable relief) under these Terms where the total amount of the award sought is less than $10,000, the party requesting relief may elect to resolve the dispute through binding non-appearance-based arbitration. The party electing such arbitration shall initiate the arbitration through an established alternative dispute resolution ("ADR") provider mutually agreed upon by the parties. The ADR provider and the parties must comply with the following rules: a) the arbitration shall be conducted by telephone, online and/or be solely based on written submissions, as selected by the party initiating the arbitration; b) the arbitration shall not involve any personal appearance by the parties or witnesses unless otherwise mutually agreed by the parties; and c) any judgment on the award rendered by the arbitrator may be entered in any court of competent jurisdiction. These Terms are the entire and exclusive agreement between KarmaNotes and you regarding the Service (excluding any services for which you have a separate agreement with KarmaNotes that is explicitly in addition or in place of these Terms), and these Terms supersede and replace any prior agreements between KarmaNotes and you regarding the Service. The failure of KarmaNotes to enforce any right or provision of these Terms will not be deemed a waiver of such right or provision. In the event that any provision of these Terms is held to be invalid or unenforceable, the remaining provisions of these Terms will remain in full force and effect. We may revise these Terms from time to time. The most current version will always be on this page (or such other page as the Service may indicate). If the revision, in our sole discretion, is material we will notify you via posting to our website or e-mail to the email associated with your account. By continuing to access or use the Service after those revisions become effective, you agree to be bound by the revised Terms.

- -

The Service is operated and provided by the FinalsClub Foundation, a 501(c)(3) non-profit corporation located at 1132 Massachusetts Avenue Cambridge, MA 02138. If you have questions about these Terms, please contact Info [at] KarmaNotes.org or Info [at] FinalsClub.org.

- -
-
-
-
-
-
-{% include 'footer.html' %} -{% endblock %} diff --git a/KNotes/templates/static/about.html b/KNotes/templates/static/about.html deleted file mode 100644 index 312353f..0000000 --- a/KNotes/templates/static/about.html +++ /dev/null @@ -1,31 +0,0 @@ -{% extends "base.html" %} - -{% block scripts %} -{% endblock %} - -{% block content %} - -
- -
-
-
-
-

Welcome to KarmaNotes.org

-
- -

KarmaNotes is a community of sharing. By posting your notes, study guides, and assignments to the cloud, you will earn Karma Points and access to a growing database of academic resources. Thanks to scholars like you, we are making education more open, one lecture at a time.

-

Because KarmaNotes is a 501(c)(3) non-profit project all of our content is freely shared under Creative Commons Share-Alike license to encourage open access and remixing. We also respect the rights of copyright holders and maintain full compliance with the Digital Millenium Copyright Act. Please do not upload any copyrighted files or they may be subject to removal.

-

Share the academic wealth!

-

Want to learn more about KarmaNotes.org? Check out our free and open source code or email us: Info [at] KarmaNotes.org

-

Thanks Again,
- Team KarmaNotes

- -
-
-
-
-
-
-{% include 'footer.html' %} -{% endblock %} diff --git a/KNotes/templates/your-courses.html b/KNotes/templates/your-courses.html deleted file mode 100644 index f8626df..0000000 --- a/KNotes/templates/your-courses.html +++ /dev/null @@ -1,39 +0,0 @@ -{% extends 'navigation.html' %} - -{% block title %} - Your Courses -{% endblock %} - -{% block navinner %} -
-

Welcome, {{ user.get_profile.getName }}! Your Courses

-
- - -
-{% if request.user.get_profile.courses.all %} - {% for course in user.get_profile.courses.all %} - {% include 'course.html' with course=course %} - {% endfor %} -{% else %} -

You haven't added any courses yet

-

Would you like to -

-

-{% endif %} -
- -{% if request.user.get_profile.school != None %} -
- Would you like to add additional courses to your school? - - -
-{% endif %} - -{% endblock %} - diff --git a/KNotes/urls.py b/KNotes/urls.py index f7f300f..576b21b 100644 --- a/KNotes/urls.py +++ b/KNotes/urls.py @@ -1,23 +1,9 @@ # urls.py is part of Karma Notes # Copyright (C) 2012 FinalsClub Foundation -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . from django.conf.urls import patterns, include, url from django.contrib import admin -#from django.conf.urls.defaults import * from django.contrib.auth.views import password_reset from django.contrib.auth.views import password_reset_done from django.contrib.auth.views import password_reset_confirm @@ -48,13 +34,6 @@ url(r'^terms$', 'notes.views.terms', name='terms'), url(r'^jobs$', 'notes.views.jobs', name='jobs'), - # --------------------------------------------------- - ## Personal pages - # Karma events - url(r'^getting-started$', 'notes.views.getting_started', name='getting-started'), - url(r'^karma-events$', 'notes.views.karma_events', name='karma-events'), - url(r'^profile$', 'notes.views.profile', name='profile'), - # --------------------------------------------------- # Search url(r'^search/', 'notes.views.search'), @@ -72,20 +51,15 @@ url(r'^filemeta$', 'notes.views.fileMeta', name='fileMeta'), # Ajax Voting url(r'^vote/(\d{1,9999})$', 'notes.views.vote'), - # Ajax requests from upload usher. Text input to model get / create - url(r'^smartModelQuery$', 'notes.views.smartModelQuery'), # Ajax requests from note upload form for autocomplete fields url(r'^courses$', 'notes.views.courses'), url(r'^schools$', 'notes.views.schools', name='schools'), url(r'^accredited-schools$', 'notes.views.accredited_schools'), url(r'^instructors$', 'notes.views.instructors'), - url(r'^simple-autocomplete/', include('simple_autocomplete.urls')), # Ajax request to add a course to a user's profile url(r'^create-course', 'notes.views.create_course', name='create-course'), url(r'^add-course', 'notes.views.add_course_to_profile', name='add-course'), url(r'^drop-course', 'notes.views.drop_course', name='drop-course'), - # Add Course, School forms - url(r'^add', 'notes.views.addModel', name='add'), # Edit course # --------------------------------------------------- @@ -109,9 +83,6 @@ # --------------------------------------------------- # Auth - # This logout allows us to pass a redirect: - # Logout - #url(r'^logout/(?P.*)/$', 'django.contrib.auth.views.logout', name='auth_logout_next'), url(r'^accounts/confirm/(?P[^/]+)$', 'notes.views.confirm_email', name='confirm_email'), url(r'^accounts/logout/$', 'django.contrib.auth.views.logout', {'next_page': '/'}, name='auth_logout'), url(r'^accounts/login/$', 'django.contrib.auth.views.login', name='login'), @@ -133,13 +104,3 @@ url(r'^oauth2callback', 'notes.views.gdrive_oauth_handshake'), ) - # Ajax requests from search page to populate 'Browse by School and Course' accordion - # Not being used and might be depricated - #url(r'^browseBySchool/$', 'notes.views.searchBySchool', name='browse'), - # TODO: change these routes so they are unique regardless of path query for reverse() - #url(r'^browse/(?P[^/]+)$', 'notes.views.browse_courses', name='browse-courses'), # This is a duplicate - #url(r'^course/(?P[^/]+)$', 'notes.views.browse_one_course', name='browse-course'), - # latest browse views, must come last because they are greedy - #url(r'^schools$', 'notes.views.browse_schools', name='browse-schools'), - # Note View - #url(r'^file/(?P\d{1,99})/(?P[^/]+)$', 'notes.views.file'), diff --git a/KNotes/wsgi.py b/KNotes/wsgi.py index 95f8bed..c5fef51 100644 --- a/KNotes/wsgi.py +++ b/KNotes/wsgi.py @@ -1,21 +1,5 @@ -# wsgi.py is part of Karma Notes -# Copyright (C) 2012 FinalsClub Foundation -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - """ -WSGI config for KNotes project. +WSGI config for djKarma project. This module contains the WSGI application used by Django's development server and any production WSGI deployments. It should expose a module-level variable diff --git a/README.md b/README.md index 3c794a7..b884c07 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Deployment (Fresh Install) 1. Checkout code from the git repository. -2. install requirements with : `sudo pip install -r requirements` from `$SRC_ROOT`. +2. install requirements with : `sudo pip install -r requirements/common.txt` from `$SRC_ROOT`. 3. Setup postresql: @@ -74,7 +74,7 @@ Deployment ---------- 1. checkout the git repository, we use `/var/www/djKarma` and will refer to this as the root of the repo -2. install requirements with `sudo pip install -r requirements.txt` +2. install requirements with `sudo pip install -r requirements/common.txt` 3. Create the database if a new deployment with `./manage.py syncdb` If this is not a new deployment, see the section below on database migrations. NOTE: You can't create a superuser BEFORE loading the fixtures. 4. Use south to migrate `djcelery` and `kombu.transport.django`: ./manage.py migrate djcelery @@ -277,7 +277,7 @@ Importing finalsclub database 3. install requirements - sudo pip install -r requirements.txt + sudo pip install -r requirements/common.txt 4. Re-populate the contents of the static ./manage.py collectstatic diff --git a/manage.py b/manage.py index 80aeb0a..577f1c9 100755 --- a/manage.py +++ b/manage.py @@ -1,18 +1,4 @@ #!/usr/bin/env python -# Copyright (C) 2012 FinalsClub Foundation -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . import os import sys diff --git a/notes/admin.py b/notes/admin.py index e371ee0..f337e5c 100644 --- a/notes/admin.py +++ b/notes/admin.py @@ -20,12 +20,10 @@ admin.site.register(models.DriveAuth) admin.site.register(models.Course) admin.site.register(models.Instructor) -admin.site.register(models.File) +admin.site.register(models.Note) admin.site.register(models.Tag) admin.site.register(models.ReputationEvent) admin.site.register(models.ReputationEventType) -admin.site.register(models.SiteStats) -admin.site.register(models.Level) admin.site.register(models.Vote) admin.site.register(models.UsdeSchool) admin.site.unregister(User) diff --git a/notes/forms.py b/notes/forms.py index 8f1079b..8e59e6c 100644 --- a/notes/forms.py +++ b/notes/forms.py @@ -11,7 +11,7 @@ from simple_autocomplete.widgets import AutoCompleteWidget from simplemathcaptcha.fields import MathCaptchaField -from models import School, Course, File, Tag, Instructor +from models import School, Course, Note, Tag, Instructor class UserCreateForm(UserCreationForm): @@ -39,7 +39,7 @@ class FileMetaDataForm(forms.Form): widget=forms.HiddenInput(attrs={'id': 'file-form-school_pk'})) course_pk = forms.CharField(max_length=255, \ widget=forms.HiddenInput(attrs={'id': 'file-form-course_pk'})) - type = forms.ChoiceField(choices=File.FILE_PTS) + type = forms.ChoiceField(choices=Note.FILE_PTS) title = forms.CharField(max_length=50, \ error_messages={'required': 'Enter a title.'}, \ widget=forms.TextInput(attrs={'class': 'text-input'})) @@ -78,7 +78,7 @@ class FileMetaDataFormNoCaptcha(forms.Form): attrs={'id': 'file-form-course_pk'} ) ) - type = forms.ChoiceField(choices=File.FILE_PTS, required=False) + type = forms.ChoiceField(choices=Note.FILE_PTS, required=False) created_on = forms.DateField(required=False) title = forms.CharField(max_length=50, error_messages={'required': 'Enter a title.'}, @@ -176,7 +176,7 @@ class ModelSearchForm(forms.Form): class UsherUploadFileForm(forms.Form): - type = forms.ChoiceField(choices=File.FILE_PTS) + type = forms.ChoiceField(choices=Note.FILE_PTS) title = forms.CharField(max_length=50, \ error_messages={'required': 'Enter a title.'}) description = forms.CharField(required=False, max_length=511, \ @@ -318,7 +318,7 @@ class SmartSchoolForm(forms.Form): # Upload file form class UploadFileForm(forms.Form): - type = forms.ChoiceField(choices=File.FILE_PTS) + type = forms.ChoiceField(choices=Note.FILE_PTS) title = forms.CharField(max_length=50, error_messages={'required': 'Enter a title.'}) description = forms.CharField(max_length=511, error_messages={'required': 'Enter a description.'}) #school = forms.ModelChoiceField(queryset=School.objects.all(), empty_label="") diff --git a/notes/gdrive.py b/notes/gdrive.py index fbc92af..a9abbcb 100755 --- a/notes/gdrive.py +++ b/notes/gdrive.py @@ -11,7 +11,7 @@ from apiclient.http import MediaFileUpload from oauth2client.client import flow_from_clientsecrets -from notes.models import DriveAuth, File +from notes.models import DriveAuth, Note CLIENT_SECRET = './notes/client_secrets.json' from credentials import GOOGLE_USER @@ -135,7 +135,7 @@ def convert_with_google_drive(u_file): # set u_file.is_pdf if file_type == 'application/pdf': # Get a new copy of the file from the database with the new metadata from filemeta - new_file = File.objects.get(id=u_file.id) + new_file = Note.objects.get(id=u_file.id) # If it's a pdf, instead save an embed_url from resource['selfLink'] new_file.is_pdf = True new_file.embed_url = file_dict[u'selfLink'] @@ -155,13 +155,13 @@ def convert_with_google_drive(u_file): if resp.status in [200]: print "\t downloaded!" - # save to the File.property resulting field + # save to the Note.property resulting field content_dict[download_type] = content else: print "\t Download failed: %s" % resp.status # Get a new copy of the file from the database with the new metadata from filemeta - new_file = File.objects.get(id=u_file.id) + new_file = Note.objects.get(id=u_file.id) # set the .odt as the download from google link new_file.gdrive_url = file_dict[u'exportLinks']['application/vnd.oasis.opendocument.text'] diff --git a/notes/model_utils.py b/notes/model_utils.py deleted file mode 100644 index 7024df1..0000000 --- a/notes/model_utils.py +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf8 -*- -""" Utilities for model classes. Separate namespace here to avoid circular imports -""" -from random import choice -import string - -def fast_hash(letters=6): - """ Generates a unique pseudo-random identifier of hex values. - Used for invite codes on user_profiles - """ - return ''.join([choice(string.hexdigits) for n in xrange(letters)]) diff --git a/notes/models.py b/notes/models.py index d04603e..5681ce2 100644 --- a/notes/models.py +++ b/notes/models.py @@ -58,88 +58,6 @@ def __unicode__(self): (self.email, self.stored_at) -class Level(models.Model): - """ Define User Levels - Each slug title is related to a minimum karma level - """ - title = models.SlugField(max_length=255) - karma = models.IntegerField(default=0) - - def __unicode__(self): - return u"%s %d" % (self.title, self.karma) - - -class SiteStats(models.Model): - """ Used to incrementally tally site statistics - For display on landing page, etc. - This is more efficient then calculating totals on every request - Upon installing the app we should initialize ONE instance of SiteStats - The increment/decrement methods will act only on the first instance (pk=1) - """ - # TODO: make this class name singular - numNotes = models.IntegerField(default=0) - numStudyGuides = models.IntegerField(default=0) - numSyllabi = models.IntegerField(default=0) - numAssignments = models.IntegerField(default=0) - numExams = models.IntegerField(default=0) - - numCourses = models.IntegerField(default=0) - numSchools = models.IntegerField(default=0) - - def __unicode__(self): - return u"%d Notes, %d Guides, %d Syllabi, %d Assignments, %d Exams for %d total Courses at %d Schools" % (self.numNotes, self.numStudyGuides, self.numSyllabi, self.numAssignments, self.numExams, self.numCourses, self.numSchools) - - -def decrement(sender, **kwargs): - """ Decrease the appropriate stat given a Model - Called in Model save() and post_delete() (not delete() due to queryset behavior) - """ - # TODO, impement this as a method on the SiteStat object, rather than in the global scope of models - stats = SiteStats.objects.get(pk=1) - if isinstance(sender, File): - if sender.type == 'N': - stats.numNotes -= 1 - elif sender.type == 'G': - stats.numStudyGuides -= 1 - elif sender.type == 'S': - stats.numSyllabi -= 1 - elif sender.type == 'A': - stats.numAssignments -= 1 - elif sender.type == 'E': - stats.numExams -= 1 - elif isinstance(sender, School): - stats.numSchools -= 1 - elif isinstance(sender, Course): - stats.numCourses -= 1 - stats.save() - - -def increment(sender, **kwargs): - """ Increment the appropriate stat given a Model - Called in Model save() and post_delete() (not delete() due to queryset behavior) - """ - # TODO, modify decrement to increment or decrement based on a passed flag, rather than duplicating this if else logic - stats = SiteStats.objects.get(pk=1) - #print stats.numNotes - if isinstance(sender, File): - print sender.type - if sender.type == 'N': - stats.numNotes += 1 - elif sender.type == 'G': - stats.numStudyGuides += 1 - elif sender.type == 'S': - stats.numSyllabi += 1 - elif sender.type == 'A': - stats.numAssignments += 1 - elif sender.type == 'E': - stats.numExams += 1 - elif isinstance(sender, School): - stats.numSchools += 1 - elif isinstance(sender, Course): - stats.numCourses += 1 - stats.save() - - class Tag(models.Model): """ This class represents a meta-tag of a note Used for searching @@ -217,18 +135,12 @@ def sum_karma(self): def save(self, *args, **kwargs): - # If a new School is being saved, increment SiteStat School count - if not self.pk: - increment(self) if not self.slug: # FIXME: make this unique # TODO: add a legacy slugs table that provide redirects to new slug pages self.slug = slugify(self.name) super(School, self).save(*args, **kwargs) -# On School delete, decrement numSchools -post_delete.connect(decrement, sender=School) - class UsdeSchool(models.Model): """Table of schools imported from the U.S. Department of Education @@ -289,13 +201,13 @@ class Course(models.Model): url = models.URLField(max_length=511, blank=True) field = models.CharField(max_length=255, blank=True, null=True) semester = models.IntegerField(choices=SEMESTERS, blank=True, null=True) - academic_year = models.IntegerField(blank=True, null=True, default=datetime.datetime.now().year) + academic_year = models.IntegerField(blank=True, null=True, default=datetime.datetime.utcnow().year) instructor = models.ForeignKey(Instructor, blank=True, null=True) instructor_name = models.CharField(max_length=255, blank=True, null=True) instructor_email= models.EmailField(blank=True, null=True) - last_updated = models.DateTimeField(default=datetime.datetime.now) + last_updated = models.DateTimeField(default=datetime.datetime.utcnow) desc = models.TextField(max_length=1023, blank=True, null=True) - # last_updated is updated with the datetime of the latest File.save() ran. Not on user join/drop + # last_updated is updated with the datetime of the latest Note.save() ran. Not on user join/drop browsable = models.BooleanField(default=False) karma = models.IntegerField(default=0) @@ -323,7 +235,7 @@ def get_notes(course_query, school): else: print "No course found, so no notes" raise Http404 - return _course, File.objects.filter(course=_course).order_by('timestamp').distinct() + return _course, Note.objects.filter(course=_course).order_by('timestamp').distinct() def sum_karma(self): """calculate the total karma for all ReputationEvents for this course @@ -337,9 +249,6 @@ def sum_karma(self): self.save() def save(self, *args, **kwargs): - # If a new Course is being saved, increment SiteStat Course count - if not self.pk: - increment(self) if not self.slug: # FIXME: make this unique # TODO: add a legacy slugs table that provide redirects to new slug pages @@ -356,11 +265,8 @@ class Meta: # can't refer to more than one course unique_together = ('school', 'slug') -# On Course delete, decrement numCourses -post_delete.connect(decrement, sender=Course) - -class File(models.Model): +class Note(models.Model): # FIXME: list of tuples can't be addressed, dicts can # FILE_TYPES['N'] @@ -398,7 +304,7 @@ class File(models.Model): school = models.ForeignKey(School, blank=True, null=True) file = models.FileField(upload_to="uploads/notes", blank=True, null=True) tags = models.ManyToManyField(Tag, blank=True, null=True) - timestamp = models.DateTimeField(default=datetime.datetime.now) + timestamp = models.DateTimeField(default=datetime.datetime.utcnow) created_on = models.DateField(blank=True, null=True, default=datetime.date.today) viewCount = models.IntegerField(default=0) numUpVotes = models.IntegerField(default=0) @@ -462,21 +368,11 @@ def save(self, *args, **kwargs): self.html = re.escape(self.html) self.cleaned = True - super(File, self).save(*args, **kwargs) + super(Note, self).save(*args, **kwargs) # update associated course last_updated - try: - self.course.last_updated = datetime.datetime.now() + if self.course: + self.course.last_updated = datetime.datetime.utcnow() self.course.save - except: - pass - - def ownedBy(self, user_pk): - """ Returns true if the user owns or has "paid" for this file - """ - # If the file is in the user's collection, or the user owns the file - if self.owner == User.objects.get(pk=user_pk) or User.objects.get(pk=user_pk).get_profile().files.filter(pk=self.pk).exists(): - return True - return False def vote(self, voter, vote_value): """ Calls UserProfile.award_karma @@ -485,7 +381,7 @@ def vote(self, voter, vote_value): upvote - vote_value=1 , downvote - vote_value=-1 :voter: a User object who is trying to register a vote """ - print "models.File.vote: Creating Vote object" + print "models.Note.vote: Creating Vote object" print "voter:", voter print "value:", vote_value @@ -528,7 +424,7 @@ def vote(self, voter, vote_value): # Award karma if self.owner: - print 'models.File.vote: profile', self.owner.get_profile() + print 'models.Note.vote: profile', self.owner.get_profile() self.owner.get_profile().award_karma( event=event, course=self.course, @@ -537,7 +433,7 @@ def vote(self, voter, vote_value): user=voter) else: - print "models.File.vote: file has no owner:", self + print "models.Note.vote: file has no owner:", self self.save() @@ -564,8 +460,10 @@ def karmaValue(self): except: return 0 -# On File delete, decrement appropriate stat -post_delete.connect(decrement, sender=File) + class Meta: + # we re-factored the model. Old name is 'File'. New name is 'Note' + db_table = 'notes_file' + class Vote(models.Model): @@ -575,7 +473,7 @@ class Vote(models.Model): """ user = models.ForeignKey(User) up = models.BooleanField(default=True) - note = models.ForeignKey(File) + note = models.ForeignKey(Note) def __unicode__(self): return u"%s voted %s" % (self.user, str(self.up)) @@ -607,9 +505,9 @@ class ReputationEvent(models.Model): timestamp = models.DateTimeField(auto_now_add=True) # optional fkeys to related models. used for displaying activity for user/school/course - user = models.ForeignKey(User, blank=True, null=True, related_name='actor') # FIXME: rename actor_user - target = models.ForeignKey(User, blank=True, null=True, related_name='target') - file = models.ForeignKey(File, blank=True, null=True) + user = models.ForeignKey(User, blank=True, null=True, related_name='reputation_event_actor') + target = models.ForeignKey(User, blank=True, null=True, related_name='reputation_event_target') + file = models.ForeignKey(Note, blank=True, null=True) course = models.ForeignKey(Course, blank=True, null=True) school = models.ForeignKey(School, blank=True, null=True) @@ -643,7 +541,6 @@ class UserProfile(models.Model): # it is more efficient to incrementally tally the total value # vs summing all ReputationEvents every time karma is needed karma = models.IntegerField(default=0) - reputationEvents = models.ManyToManyField(ReputationEvent, blank=True, null=True) # Optional fields: # TODO: update this when User.save() is run, check if gravatar has an image for their email @@ -661,7 +558,7 @@ class UserProfile(models.Model): can_moderate = models.BooleanField(default=False) # user-submitted files and those the user has "paid for" - files = models.ManyToManyField(File, blank=True, null=True) + viewed_notes = models.ManyToManyField(Note, blank=True, null=True) # courses a user is currently, or has been enrolled courses = models.ManyToManyField(Course, null=True, blank=True) @@ -712,30 +609,6 @@ def add_course(self, course_title=None, course_id=None): self.courses.add(course) # implies save() return True - def getLevel(self): - """ Determine the current level of the user - based on their karma and the Levels. - Returns a dictionary of - [current_level] -> Level - [next_level] -> Next Level - - """ - response = {} - levels = Level.objects.all().order_by('karma') - for (counter, level) in enumerate(levels): - if self.karma < level.karma: - if counter > 0: - response['next_level'] = level - response['current_level'] = levels[counter - 1] - else: - # If the user has not surpassed the first level - response['current_level'] = level - response['next_level'] = levels[counter + 1] - break - if not 'next_level' in response: - response['current_level'] = levels[len(levels) - 1] - return response - def get_picture(self, size='small'): """ get the url of an appropriately size image for a user :size: if size is set to anything but small, it will return a 180px image @@ -796,7 +669,6 @@ def get_name(self): def award_karma(self, event, target_user=None, school=None, course=None, user=None, file=None): """ Award user karma given a ReputationEventType slug title - and add a new ReputationEvent to UserProfile.reputationEvents Does not call UserProfile.save() because it is used in The UserProfile save() method @@ -805,7 +677,7 @@ def award_karma(self, event, target_user=None, school=None, course=None, user=No :school: is a School object (optional) :course: a Course object (optional) :user: a User object (optional), for recalling username when showing other's karmaevents - :file: a notes.models.File object (optional) + :file: a notes.models.Note object (optional) returns True or False """ @@ -825,10 +697,13 @@ def award_karma(self, event, target_user=None, school=None, course=None, user=No event.course = course if user: event.user = user + if target_user: + event.target = target_user + print 'UserProfile.award_karma: target user set' if file: event.file = file event.save() # FIXME: might be called on UserProfile.save() - self.reputationEvents.add(event) + # Don't self.save(), because this method is called # from UserProfile.save() return self @@ -837,34 +712,35 @@ def award_karma(self, event, target_user=None, school=None, course=None, user=No print e return False - def addFile(self, File): - """ Called by notes.views.upload after saving File + def addFile(self, note): + """ Called by notes.views.upload after saving Note Generates the appropriate ReputationEvent, and modifies the user's karma """ - # Set File.owner to the user - File.owner = self.user - File.save() + # Set note.owner to the user + note.owner = self.user + note.save() # Add this file to the user's collection - self.files.add(File) + self.viewed_notes.add(note) # Generate a reputation event title = "" - if File.type == 'N': + if note.type == 'N': title = 'lecture-note' - elif File.type == 'G': + elif note.type == 'G': title = 'mid-term-study-guide' - elif File.type == 'S': + elif note.type == 'S': title = 'syllabus' - elif File.type == 'A': + elif note.type == 'A': title = 'assignment' - elif File.type == 'E': + elif note.type == 'E': title = 'exam-or-quiz' # Remember to load all ReputationEventTypes with # python manage.py loaddata ./fixtures/data.json repType = ReputationEventType.objects.get(title=title) - repEvent = ReputationEvent.objects.create(type=repType) - self.reputationEvents.add(repEvent) + repEvent = ReputationEvent.objects.create(type=repType, + user = self.user, + file = note) #FIXME: check if we need to add a school to this list # Assign user points as prescribed by ReputationEventType self.karma += repType.actor_karma @@ -900,16 +776,6 @@ def save(self, *args, **kwargs): self.submitted_school = True self.award_karma('profile-school', user=self.user) - # Add read permissions if Prospect karma level is reached - if not self.can_read and self.karma >= Level.objects.get(title='Prospect').karma: - self.can_read = True - - # Add vote permissions if Prospect karma level is reached - #if self.can_vote == False and self.karma >= Level.objects.get(title='Prospect').karma: - # self.can_vote = True - - # TODO: Add other permissions... - super(UserProfile, self).save(*args, **kwargs) diff --git a/notes/profile_tasks.py b/notes/profile_tasks.py index b7a9369..3534580 100644 --- a/notes/profile_tasks.py +++ b/notes/profile_tasks.py @@ -65,7 +65,7 @@ class UploadedFile(): karma = u"5-10" def check(self, user_profile): - if len(user_profile.files.all()) >= 1: + if len(user_profile.viewed_notes.all()) >= 1: return True return False diff --git a/notes/search_indexes.py b/notes/search_indexes.py index bac575a..b3cc479 100644 --- a/notes/search_indexes.py +++ b/notes/search_indexes.py @@ -4,7 +4,7 @@ from haystack.indexes import * from haystack.fields import EdgeNgramField from haystack import site -from models import School, Course, File +from models import School, Course, Note class SchoolIndex(SearchIndex): @@ -25,7 +25,7 @@ class SchoolIndex(SearchIndex): ''' def index_queryset(self): """Used when the entire index for model is updated.""" - return Note.objects.filter(pub_date__lte=datetime.datetime.now()) + return Note.objects.filter(pub_date__lte=datetime.datetime.utcnow()) ''' @@ -51,7 +51,7 @@ def prepare_school(self, obj): return None -class FileIndex(SearchIndex): +class NoteIndex(SearchIndex): text = CharField(document=True, use_template=True) title = CharField(model_attr='title') school = CharField(null=True) @@ -79,7 +79,7 @@ def prepare_course(self, obj): # Use Apache Solr's Rich Content Extraction # To index document text for search def prepare(self, obj): - data = super(FileIndex, self).prepare(obj) + data = super(NoteIndex, self).prepare(obj) try: # This could also be a regular Python open() call, a StringIO instance # or the result of opening a URL. Note that due to a library limitation @@ -95,11 +95,11 @@ def prepare(self, obj): data['text'] = t.render(Context({'object': obj, 'extracted': extracted_data})) except IOException: - print "FileIndex: error accessing " + obj.file.path + print "NoteIndex: error accessing " + obj.file.path # actual file is not available return data ''' -site.register(File, FileIndex) +site.register(Note, NoteIndex) site.register(School, SchoolIndex) site.register(Course, CourseIndex) diff --git a/notes/templates/css/fontface/fontface.css b/notes/static/fontface/fontface.css similarity index 100% rename from notes/templates/css/fontface/fontface.css rename to notes/static/fontface/fontface.css diff --git a/notes/templates/css/fontface/museo_sans/2386DB_0_0.eot b/notes/static/fontface/museo_sans/2386DB_0_0.eot similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_0_0.eot rename to notes/static/fontface/museo_sans/2386DB_0_0.eot diff --git a/notes/templates/css/fontface/museo_sans/2386DB_0_0.ttf b/notes/static/fontface/museo_sans/2386DB_0_0.ttf similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_0_0.ttf rename to notes/static/fontface/museo_sans/2386DB_0_0.ttf diff --git a/notes/templates/css/fontface/museo_sans/2386DB_0_0.woff b/notes/static/fontface/museo_sans/2386DB_0_0.woff similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_0_0.woff rename to notes/static/fontface/museo_sans/2386DB_0_0.woff diff --git a/notes/templates/css/fontface/museo_sans/2386DB_1_0.eot b/notes/static/fontface/museo_sans/2386DB_1_0.eot similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_1_0.eot rename to notes/static/fontface/museo_sans/2386DB_1_0.eot diff --git a/notes/templates/css/fontface/museo_sans/2386DB_1_0.ttf b/notes/static/fontface/museo_sans/2386DB_1_0.ttf similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_1_0.ttf rename to notes/static/fontface/museo_sans/2386DB_1_0.ttf diff --git a/notes/templates/css/fontface/museo_sans/2386DB_1_0.woff b/notes/static/fontface/museo_sans/2386DB_1_0.woff similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_1_0.woff rename to notes/static/fontface/museo_sans/2386DB_1_0.woff diff --git a/notes/templates/css/fontface/museo_sans/2386DB_2_0.eot b/notes/static/fontface/museo_sans/2386DB_2_0.eot similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_2_0.eot rename to notes/static/fontface/museo_sans/2386DB_2_0.eot diff --git a/notes/templates/css/fontface/museo_sans/2386DB_2_0.ttf b/notes/static/fontface/museo_sans/2386DB_2_0.ttf similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_2_0.ttf rename to notes/static/fontface/museo_sans/2386DB_2_0.ttf diff --git a/notes/templates/css/fontface/museo_sans/2386DB_2_0.woff b/notes/static/fontface/museo_sans/2386DB_2_0.woff similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_2_0.woff rename to notes/static/fontface/museo_sans/2386DB_2_0.woff diff --git a/notes/templates/css/fontface/museo_sans/2386DB_3_0.eot b/notes/static/fontface/museo_sans/2386DB_3_0.eot similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_3_0.eot rename to notes/static/fontface/museo_sans/2386DB_3_0.eot diff --git a/notes/templates/css/fontface/museo_sans/2386DB_3_0.ttf b/notes/static/fontface/museo_sans/2386DB_3_0.ttf similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_3_0.ttf rename to notes/static/fontface/museo_sans/2386DB_3_0.ttf diff --git a/notes/templates/css/fontface/museo_sans/2386DB_3_0.woff b/notes/static/fontface/museo_sans/2386DB_3_0.woff similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_3_0.woff rename to notes/static/fontface/museo_sans/2386DB_3_0.woff diff --git a/notes/templates/css/fontface/museo_sans/2386DB_4_0.eot b/notes/static/fontface/museo_sans/2386DB_4_0.eot similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_4_0.eot rename to notes/static/fontface/museo_sans/2386DB_4_0.eot diff --git a/notes/templates/css/fontface/museo_sans/2386DB_4_0.ttf b/notes/static/fontface/museo_sans/2386DB_4_0.ttf similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_4_0.ttf rename to notes/static/fontface/museo_sans/2386DB_4_0.ttf diff --git a/notes/templates/css/fontface/museo_sans/2386DB_4_0.woff b/notes/static/fontface/museo_sans/2386DB_4_0.woff similarity index 100% rename from notes/templates/css/fontface/museo_sans/2386DB_4_0.woff rename to notes/static/fontface/museo_sans/2386DB_4_0.woff diff --git a/notes/templates/css/fontface/museo_slab/2395FA_0_0.eot b/notes/static/fontface/museo_slab/2395FA_0_0.eot similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_0_0.eot rename to notes/static/fontface/museo_slab/2395FA_0_0.eot diff --git a/notes/templates/css/fontface/museo_slab/2395FA_0_0.ttf b/notes/static/fontface/museo_slab/2395FA_0_0.ttf similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_0_0.ttf rename to notes/static/fontface/museo_slab/2395FA_0_0.ttf diff --git a/notes/templates/css/fontface/museo_slab/2395FA_0_0.woff b/notes/static/fontface/museo_slab/2395FA_0_0.woff similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_0_0.woff rename to notes/static/fontface/museo_slab/2395FA_0_0.woff diff --git a/notes/templates/css/fontface/museo_slab/2395FA_1_0.eot b/notes/static/fontface/museo_slab/2395FA_1_0.eot similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_1_0.eot rename to notes/static/fontface/museo_slab/2395FA_1_0.eot diff --git a/notes/templates/css/fontface/museo_slab/2395FA_1_0.ttf b/notes/static/fontface/museo_slab/2395FA_1_0.ttf similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_1_0.ttf rename to notes/static/fontface/museo_slab/2395FA_1_0.ttf diff --git a/notes/templates/css/fontface/museo_slab/2395FA_1_0.woff b/notes/static/fontface/museo_slab/2395FA_1_0.woff similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_1_0.woff rename to notes/static/fontface/museo_slab/2395FA_1_0.woff diff --git a/notes/templates/css/fontface/museo_slab/2395FA_2_0.eot b/notes/static/fontface/museo_slab/2395FA_2_0.eot similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_2_0.eot rename to notes/static/fontface/museo_slab/2395FA_2_0.eot diff --git a/notes/templates/css/fontface/museo_slab/2395FA_2_0.ttf b/notes/static/fontface/museo_slab/2395FA_2_0.ttf similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_2_0.ttf rename to notes/static/fontface/museo_slab/2395FA_2_0.ttf diff --git a/notes/templates/css/fontface/museo_slab/2395FA_2_0.woff b/notes/static/fontface/museo_slab/2395FA_2_0.woff similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_2_0.woff rename to notes/static/fontface/museo_slab/2395FA_2_0.woff diff --git a/notes/templates/css/fontface/museo_slab/2395FA_3_0.eot b/notes/static/fontface/museo_slab/2395FA_3_0.eot similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_3_0.eot rename to notes/static/fontface/museo_slab/2395FA_3_0.eot diff --git a/notes/templates/css/fontface/museo_slab/2395FA_3_0.ttf b/notes/static/fontface/museo_slab/2395FA_3_0.ttf similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_3_0.ttf rename to notes/static/fontface/museo_slab/2395FA_3_0.ttf diff --git a/notes/templates/css/fontface/museo_slab/2395FA_3_0.woff b/notes/static/fontface/museo_slab/2395FA_3_0.woff similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_3_0.woff rename to notes/static/fontface/museo_slab/2395FA_3_0.woff diff --git a/notes/templates/css/fontface/museo_slab/2395FA_4_0.eot b/notes/static/fontface/museo_slab/2395FA_4_0.eot similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_4_0.eot rename to notes/static/fontface/museo_slab/2395FA_4_0.eot diff --git a/notes/templates/css/fontface/museo_slab/2395FA_4_0.ttf b/notes/static/fontface/museo_slab/2395FA_4_0.ttf similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_4_0.ttf rename to notes/static/fontface/museo_slab/2395FA_4_0.ttf diff --git a/notes/templates/css/fontface/museo_slab/2395FA_4_0.woff b/notes/static/fontface/museo_slab/2395FA_4_0.woff similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_4_0.woff rename to notes/static/fontface/museo_slab/2395FA_4_0.woff diff --git a/notes/templates/css/fontface/museo_slab/2395FA_5_0.eot b/notes/static/fontface/museo_slab/2395FA_5_0.eot similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_5_0.eot rename to notes/static/fontface/museo_slab/2395FA_5_0.eot diff --git a/notes/templates/css/fontface/museo_slab/2395FA_5_0.ttf b/notes/static/fontface/museo_slab/2395FA_5_0.ttf similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_5_0.ttf rename to notes/static/fontface/museo_slab/2395FA_5_0.ttf diff --git a/notes/templates/css/fontface/museo_slab/2395FA_5_0.woff b/notes/static/fontface/museo_slab/2395FA_5_0.woff similarity index 100% rename from notes/templates/css/fontface/museo_slab/2395FA_5_0.woff rename to notes/static/fontface/museo_slab/2395FA_5_0.woff diff --git a/notes/static/js/app.js b/notes/static/js/app.js index 3ed3d67..ff21866 100644 --- a/notes/static/js/app.js +++ b/notes/static/js/app.js @@ -238,8 +238,7 @@ $(document).ready(function(){ // Choose a course, hide the select field $('.course-select').click( function() { - var course_pk = $(this).data('id'); - console.log("course selected"); + course_pk = $(this).data('id'); // fill the lightbox_instruction with the chosen course's title $('#lightbox_upload_course_sidebar').text($(this).text()); // hide the my courses drop down diff --git a/notes/templates/500.html b/notes/templates/500.html new file mode 100644 index 0000000..611b9ce --- /dev/null +++ b/notes/templates/500.html @@ -0,0 +1,38 @@ +{% extends "n_base.html" %} +{% load url from future %} +{% load humanize %} + +{% block pagestyle %} + +{% endblock %} + +{% block title %} +404 page not found :( +{% endblock %} + + +{% block content %} +
+ +
+
+   +
+
+ +
+
+ +
+
+ +
+
+   +
+
+ + + +
+{% endblock %} diff --git a/notes/templates/about.html b/notes/templates/about.html deleted file mode 100644 index 8f3f3e6..0000000 --- a/notes/templates/about.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - KarmaNotes Home - - - - - - - - - - - -
- -
-
-
-
-
- This is a picture of the KarmaNotes team or something.If there’s no picture, the text just starts at the top of the page. -
-
-
-
-
- -
-
- Thank you for helping to spread the academic wealth! -
-
- -
-
-

A common learning database for scholars everywhere, KarmaNotes encourages you to upload your notes, study guides, syllabi and assignments to the cloud. By sharing your knowledge on KarmaNotes, you can earn Karma Points and access a constantly growing library of academic resources.

-

Because KarmaNotes is a non-profit project all content is freely shared under Creative Commons Share-Alike license to encourage open access and remixing. We also respect the rights of copyright holders and maintain full compliance with the Digital Millennium Copyright Act. Please do not upload any copyrighted files or they will be subject to removal.

-

Want to know more? Check out our free and open source code or email us.

-
-
- -
- - - -
-
- Karma University Leaderboard -
-
- -
-
- These schools are tops spreading the Karma -
-
- -
-
- -
-
- 1 -
-
- Massachusetts Institute of Technology -
-
- 15,189 -
-
- -
-
- 2 -
-
- University of California Berkeley -
-
- 8,720 -
-
- -
-
- 3 -
-
- Carnegie Melon University -
-
- 5,130 -
-
- -
-
- -
- - - - - - \ No newline at end of file diff --git a/notes/templates/course.html b/notes/templates/course.html deleted file mode 100644 index a1f87ad..0000000 --- a/notes/templates/course.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - KarmaNotes Course - - - - - - - - - - - - - -
- -
-
-
- course -
-
- -
-
- Week 3 Notes: Fractals -
-
- -
- -
- -
-
-
-
-
- drop -
-
-
- course_action_gear -
-
-
-
- -
-
- Proin gravida nibh vel velit auctor aliquet. Aenean sollicitudin, lorem quis bibendum auctor, nisi elit consequat ipsum, nec sagittis sem nibh id elit. Duis sed odio sit amet nibh vulputate cursus a sit amet mauris. Morbi accumsan ipsum velit. Nam nec tellus a odio tincidunt auctor a ornare odio. Sed non mauris vitae erat consequat auctor eu in elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris in erat justo. Nullam ac urna eu felis dapibus condimentu. -
-
- -
- - -
-
-
- -
-
-
- 5pm // tues nov 23 2012 -
- - -
-
-
- dashboard_activity_callout_icon_notebook -
-
- Bacon ipsum dolor sit amet pancetta capicola pork belly strip steak tri-tip turkey ribeye shank meatloaf tongue pork shankle venison turducken corned beef. Swine jowl meatball bresaola, tongue jerky turducken ham hock strip steak ground round filet mignon. Corned beef ground round pork chop, turducken -
-
-
-
-
- So far, 13 people have completely fallen in love with with these notes. -
-
-
-
- -
-
-
- 5pm // tues nov 23 2012 -
- - -
-
-
- dashboard_activity_callout_icon_notebook -
-
- Bacon ipsum dolor sit amet pancetta capicola pork belly strip steak tri-tip turkey ribeye shank meatloaf tongue pork shankle venison turducken corned beef. Swine jowl meatball bresaola, tongue jerky turducken ham hock strip steak ground round filet mignon. Corned beef ground round pork chop, turducken -
-
-
-
-
- So far, 13 people have completely fallen in love with with these notes. -
-
-
-
- -
-
-
- 5pm // tues nov 23 2012 -
- - -
-
-
- dashboard_activity_callout_icon_notebook -
-
- Bacon ipsum dolor sit amet pancetta capicola pork belly strip steak tri-tip turkey ribeye shank meatloaf tongue pork shankle venison turducken corned beef. Swine jowl meatball bresaola, tongue jerky turducken ham hock strip steak ground round filet mignon. Corned beef ground round pork chop, turducken -
-
-
-
-
- So far, 13 people have completely fallen in love with with these notes. -
-
-
-
- -
-
-
- 5pm // tues nov 23 2012 -
- - -
-
-
- dashboard_activity_callout_icon_notebook -
-
- Bacon ipsum dolor sit amet pancetta capicola pork belly strip steak tri-tip turkey ribeye shank meatloaf tongue pork shankle venison turducken corned beef. Swine jowl meatball bresaola, tongue jerky turducken ham hock strip steak ground round filet mignon. Corned beef ground round pork chop, turducken -
-
-
-
-
- So far, 13 people have completely fallen in love with with these notes. -
-
-
-
-
-
- -
- -
-
-
-
- search_arrow_left -
-
-
    -
  • 1
  • -
  • 2
  • -
  • 3
  • -
  • 4
  • -
  • 5
  • -
  • 6
  • -
-
-
- search_arrow_right -
-
-
-
- -
- - - - - - \ No newline at end of file diff --git a/notes/templates/courses_results.html b/notes/templates/courses_results.html deleted file mode 100644 index fae2842..0000000 --- a/notes/templates/courses_results.html +++ /dev/null @@ -1,339 +0,0 @@ - - - - - KarmaNotes Search Results - - - - - - - - - - - -
- -
-
-
- YOU SEARCHED FOR -
-
- -
-
- Business Ethics in Space -
-
- -
-
-
-
    -
  • -
    top results
    -
  • -
  • -
    notes
    -
  • -
  • -
    courses
    -
  • -
  • -
    professors
    -
  • -
  • -
    schools
    -
  • -
  • -
    users
    -
  • -
-
-
-
-
- -
-
-
- courses -
- -
-
-
- join -
-
- -
-
-
- last updated october 23, 2012 4:45pm -
-
- Dilemmas in Bio-Medical Ethics: Playing God or Doing good? -
- -
-
-
- 27 -
-
- notes -
-
-
-
- 43 -
-
- students -
-
-
-
-
-
- -
-
-
- drop -
-
- -
-
-
- last updated october 23, 2012 4:45pm -
-
- Macro-Economics -
- -
-
-
- 27 -
-
- notes -
-
-
-
- 43 -
-
- students -
-
-
-
-
-
- -
-
-
- join -
-
- -
-
-
- last updated october 23, 2012 4:45pm -
-
- Dilemmas in Bio-Medical Ethics: Playing God or Doing good? -
- -
-
-
- 27 -
-
- notes -
-
-
-
- 43 -
-
- students -
-
-
-
-
-
- -
-
-
- drop -
-
- -
-
-
- last updated october 23, 2012 4:45pm -
-
- Dilemmas in Bio-Medical Ethics: Playing God or Doing good? -
- -
-
-
- 27 -
-
- notes -
-
-
-
- 43 -
-
- students -
-
-
-
-
-
-
- -
- - -
-
-
-
- search_arrow_left -
-
-
    -
  • 1
  • -
  • 2
  • -
  • 3
  • -
  • 4
  • -
  • 5
  • -
  • 6
  • -
-
-
- search_arrow_right -
-
-
-
- -
-
- Don't see what you're looking for? Add your note or course now. -
-
- -
- - - - - - \ No newline at end of file diff --git a/notes/templates/dashboard.html b/notes/templates/dashboard.html deleted file mode 100644 index e43b26a..0000000 --- a/notes/templates/dashboard.html +++ /dev/null @@ -1,482 +0,0 @@ - - - - - KarmaNotes Dashboard - - - - - - - - - - - -
- -
-
-
- -
-
- you've earned -
-
- you've uploaded -
-
- you've downloaded -
-
- you've liked -
-
- -
-
- 473 -
-
- 34 -
-
- 67 -
-
- 72 -
-
- -
-
- karma points -
-
- items -
-
- things -
-
- posts -
-
- -
-
-
- -
-
-
- -
-
-
- dashboard_profile_avatar -
-
- René Decartes -
-
-
- -
-
- My School -
-
- Harvard University -
-
- -
-
- My Courses -
-
-
    -
  • Macro Economics
  • -
  • Dance 101
  • -
  • Spanglish
  • -
-
- -
- - -
-
-
- -
- -
-
- latest activity -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- - -
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
- - -
-
-
-
- dashboard_activity_callout_icon_notebook -
-
- Bacon ipsum dolor sit amet pancetta capicola pork belly strip steak tri-tip turkey ribeye shank meatloaf tongue pork shankle venison turducken corned beef. Swine jowl meatball bresaola, tongue jerky turducken ham hock strip steak ground round filet mignon. Corned beef ground round pork chop, turducken -
-
-
-
-
-
- So far, 13 people have completely fallen in love with with these notes. -
-
-
-
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
-
-
- You added Class Economics 101 at Harvard University to your list of courses -
-
-
-
- So far, 13 people have completely fallen in love with with these notes. -
-
-
-
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
-
-
- Andrew Mogliozzi downloaded your notes, Tango for Beginners. -
-
-
-
- That just earned you 5 Karma points. -
-
-
-
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
-
-
- Gabi Schaffzin tought your notes, Tango for Beginners, were the créme de la créme. -
-
-
-
- That just earned you 1 Karma point. -
-
-
-
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
-
- -
- -
-
-
-
- dashboard_activity_callout_icon_notebook -
-
- Bacon ipsum dolor sit amet pancetta capicola pork belly strip steak tri-tip turkey ribeye shank meatloaf tongue pork shankle venison turducken corned beef. Swine jowl meatball bresaola, tongue jerky turducken ham hock strip steak ground round filet mignon. Corned beef ground round pork chop, turducken -
-
-
-
-
-
- So far, 2 people have found these notes mind-blowing. -
-
-
-
- -
- -
-
- -
- -
-
-
- dashboard_more_plusicon -
-
-
- -
- - - - - - \ No newline at end of file diff --git a/notes/templates/global.html b/notes/templates/global.html deleted file mode 100644 index 5d99182..0000000 --- a/notes/templates/global.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - KarmaNotes Global Header/Footer - - - - - - - - - - - -
- -
- - - - - \ No newline at end of file diff --git a/notes/templates/global_loggedin.html b/notes/templates/global_loggedin.html deleted file mode 100644 index f2c885e..0000000 --- a/notes/templates/global_loggedin.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - KarmaNotes Global Header/Footer - - - - - - - - - - - -
- -
- - - - - \ No newline at end of file diff --git a/notes/templates/home.html b/notes/templates/home.html deleted file mode 100644 index fdf7ce2..0000000 --- a/notes/templates/home.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - KarmaNotes Home - - - - - - - - - - - -
- -
-
-
-
-
- -
-
-
- -
-
-
-
-
-
- KarmaNotes rocks. Here's a sentence to tell you how much it rocks. -
-
-
-
- Watch the awesome video for more. - home_video_arrow -
-
-
-
-
-
-
-
- -
- -
-
-
- recently uploaded notes -
-
-
-   -
-
-
    -
  • Study Guide: Justice and the American Way
  • -
  • Harvard University
  • -
  • Themes and Motifs With Johnson
  • -
  • Massachusetts College of Art & Design
  • -
-
-
-   -
-
-
-
- -
- -
-
-

- Proin gravida nibh vel velit auctor aliquet. Aenean sollicitudin, lorem quis bibendum auctor, nisi elit consequat ipsum, nec sagittis sem nibh id elit. Duis sed odio sit amet nibh vulputate cursus a sit amet mauris. Morbi accumsan ipsum velit. Nam nec tellus a odio tincidunt auctor a ornare odio. -

-
-
- -
- - - - - - \ No newline at end of file diff --git a/notes/templates/img/about_hero.jpg b/notes/templates/img/about_hero.jpg deleted file mode 100644 index bc929ab..0000000 Binary files a/notes/templates/img/about_hero.jpg and /dev/null differ diff --git a/notes/templates/img/course_action_gear.png b/notes/templates/img/course_action_gear.png deleted file mode 100644 index 2ccb3be..0000000 Binary files a/notes/templates/img/course_action_gear.png and /dev/null differ diff --git a/notes/templates/img/course_meta_drop_bg.png b/notes/templates/img/course_meta_drop_bg.png deleted file mode 100644 index 9e4cf73..0000000 Binary files a/notes/templates/img/course_meta_drop_bg.png and /dev/null differ diff --git a/notes/templates/img/course_meta_join_bg.png b/notes/templates/img/course_meta_join_bg.png deleted file mode 100644 index e064e0d..0000000 Binary files a/notes/templates/img/course_meta_join_bg.png and /dev/null differ diff --git a/notes/templates/img/dashboard_activity_alt_on_bg.gif b/notes/templates/img/dashboard_activity_alt_on_bg.gif deleted file mode 100644 index 78c53db..0000000 Binary files a/notes/templates/img/dashboard_activity_alt_on_bg.gif and /dev/null differ diff --git a/notes/templates/img/dashboard_activity_callout_icon_notebook.png b/notes/templates/img/dashboard_activity_callout_icon_notebook.png deleted file mode 100644 index b15c87c..0000000 Binary files a/notes/templates/img/dashboard_activity_callout_icon_notebook.png and /dev/null differ diff --git a/notes/templates/img/dashboard_more_plusicon.png b/notes/templates/img/dashboard_more_plusicon.png deleted file mode 100644 index f1bdbf7..0000000 Binary files a/notes/templates/img/dashboard_more_plusicon.png and /dev/null differ diff --git a/notes/templates/img/dashboard_profile_avatar.jpg b/notes/templates/img/dashboard_profile_avatar.jpg deleted file mode 100644 index ecff16a..0000000 Binary files a/notes/templates/img/dashboard_profile_avatar.jpg and /dev/null differ diff --git a/notes/templates/img/dashboard_profile_avatar_ad.jpg b/notes/templates/img/dashboard_profile_avatar_ad.jpg deleted file mode 100644 index 2375ecb..0000000 Binary files a/notes/templates/img/dashboard_profile_avatar_ad.jpg and /dev/null differ diff --git a/notes/templates/img/dashboard_profile_avatar_dm.jpg b/notes/templates/img/dashboard_profile_avatar_dm.jpg deleted file mode 100644 index 9118b60..0000000 Binary files a/notes/templates/img/dashboard_profile_avatar_dm.jpg and /dev/null differ diff --git a/notes/templates/img/dashboard_profile_avatar_gs.jpg b/notes/templates/img/dashboard_profile_avatar_gs.jpg deleted file mode 100644 index bf3f7be..0000000 Binary files a/notes/templates/img/dashboard_profile_avatar_gs.jpg and /dev/null differ diff --git a/notes/templates/img/dashboard_profile_avatar_jh.jpg b/notes/templates/img/dashboard_profile_avatar_jh.jpg deleted file mode 100644 index d863e05..0000000 Binary files a/notes/templates/img/dashboard_profile_avatar_jh.jpg and /dev/null differ diff --git a/notes/templates/img/dashboard_profile_foldericon.png b/notes/templates/img/dashboard_profile_foldericon.png deleted file mode 100644 index e06e86e..0000000 Binary files a/notes/templates/img/dashboard_profile_foldericon.png and /dev/null differ diff --git a/notes/templates/img/dashboard_profile_plusicon.png b/notes/templates/img/dashboard_profile_plusicon.png deleted file mode 100644 index 8e15956..0000000 Binary files a/notes/templates/img/dashboard_profile_plusicon.png and /dev/null differ diff --git a/notes/templates/img/dashboard_statsbar_bg.gif b/notes/templates/img/dashboard_statsbar_bg.gif deleted file mode 100644 index 09a5320..0000000 Binary files a/notes/templates/img/dashboard_statsbar_bg.gif and /dev/null differ diff --git a/notes/templates/img/global_button_orange_arrow.png b/notes/templates/img/global_button_orange_arrow.png deleted file mode 100644 index cb2c265..0000000 Binary files a/notes/templates/img/global_button_orange_arrow.png and /dev/null differ diff --git a/notes/templates/img/global_footer_cc_logo.png b/notes/templates/img/global_footer_cc_logo.png deleted file mode 100644 index 1ad4253..0000000 Binary files a/notes/templates/img/global_footer_cc_logo.png and /dev/null differ diff --git a/notes/templates/img/global_header_add_course.png b/notes/templates/img/global_header_add_course.png deleted file mode 100644 index b9064cb..0000000 Binary files a/notes/templates/img/global_header_add_course.png and /dev/null differ diff --git a/notes/templates/img/global_header_avatar.jpg b/notes/templates/img/global_header_avatar.jpg deleted file mode 100644 index a91bbfc..0000000 Binary files a/notes/templates/img/global_header_avatar.jpg and /dev/null differ diff --git a/notes/templates/img/global_header_bg.gif b/notes/templates/img/global_header_bg.gif deleted file mode 100644 index 9e85256..0000000 Binary files a/notes/templates/img/global_header_bg.gif and /dev/null differ diff --git a/notes/templates/img/global_header_gear.png b/notes/templates/img/global_header_gear.png deleted file mode 100644 index 6f3d662..0000000 Binary files a/notes/templates/img/global_header_gear.png and /dev/null differ diff --git a/notes/templates/img/global_header_login_fbbg.png b/notes/templates/img/global_header_login_fbbg.png deleted file mode 100644 index 9b993b9..0000000 Binary files a/notes/templates/img/global_header_login_fbbg.png and /dev/null differ diff --git a/notes/templates/img/global_header_login_fbbtn.png b/notes/templates/img/global_header_login_fbbtn.png deleted file mode 100644 index fd2b3db..0000000 Binary files a/notes/templates/img/global_header_login_fbbtn.png and /dev/null differ diff --git a/notes/templates/img/global_header_login_formbg.png b/notes/templates/img/global_header_login_formbg.png deleted file mode 100644 index 68041ba..0000000 Binary files a/notes/templates/img/global_header_login_formbg.png and /dev/null differ diff --git a/notes/templates/img/global_header_login_menu_arrow.png b/notes/templates/img/global_header_login_menu_arrow.png deleted file mode 100644 index 6cd7211..0000000 Binary files a/notes/templates/img/global_header_login_menu_arrow.png and /dev/null differ diff --git a/notes/templates/img/global_header_logo.png b/notes/templates/img/global_header_logo.png deleted file mode 100644 index 07e56aa..0000000 Binary files a/notes/templates/img/global_header_logo.png and /dev/null differ diff --git a/notes/templates/img/global_header_more_info.png b/notes/templates/img/global_header_more_info.png deleted file mode 100644 index 7ab5ea5..0000000 Binary files a/notes/templates/img/global_header_more_info.png and /dev/null differ diff --git a/notes/templates/img/global_header_my_notes.png b/notes/templates/img/global_header_my_notes.png deleted file mode 100644 index 130521a..0000000 Binary files a/notes/templates/img/global_header_my_notes.png and /dev/null differ diff --git a/notes/templates/img/global_header_plusnote.png b/notes/templates/img/global_header_plusnote.png deleted file mode 100644 index 7c6f5d6..0000000 Binary files a/notes/templates/img/global_header_plusnote.png and /dev/null differ diff --git a/notes/templates/img/global_header_search.png b/notes/templates/img/global_header_search.png deleted file mode 100644 index a432cf7..0000000 Binary files a/notes/templates/img/global_header_search.png and /dev/null differ diff --git a/notes/templates/img/home_recent_uploaded_scroller_screen.png b/notes/templates/img/home_recent_uploaded_scroller_screen.png deleted file mode 100644 index b486b1e..0000000 Binary files a/notes/templates/img/home_recent_uploaded_scroller_screen.png and /dev/null differ diff --git a/notes/templates/img/home_recent_uploaded_scroller_screen_right.png b/notes/templates/img/home_recent_uploaded_scroller_screen_right.png deleted file mode 100644 index 7a27408..0000000 Binary files a/notes/templates/img/home_recent_uploaded_scroller_screen_right.png and /dev/null differ diff --git a/notes/templates/img/home_video_arrow.png b/notes/templates/img/home_video_arrow.png deleted file mode 100644 index b64868b..0000000 Binary files a/notes/templates/img/home_video_arrow.png and /dev/null differ diff --git a/notes/templates/img/home_video_screen_60opacity.png b/notes/templates/img/home_video_screen_60opacity.png deleted file mode 100644 index 463f381..0000000 Binary files a/notes/templates/img/home_video_screen_60opacity.png and /dev/null differ diff --git a/notes/templates/img/home_video_screen_80opacity.png b/notes/templates/img/home_video_screen_80opacity.png deleted file mode 100644 index 49623cf..0000000 Binary files a/notes/templates/img/home_video_screen_80opacity.png and /dev/null differ diff --git a/notes/templates/img/lightbox_close_x.png b/notes/templates/img/lightbox_close_x.png deleted file mode 100644 index 27b6558..0000000 Binary files a/notes/templates/img/lightbox_close_x.png and /dev/null differ diff --git a/notes/templates/img/lightbox_search_icon.png b/notes/templates/img/lightbox_search_icon.png deleted file mode 100644 index c785a2b..0000000 Binary files a/notes/templates/img/lightbox_search_icon.png and /dev/null differ diff --git a/notes/templates/img/lightbox_signu_fb_lage.jpg b/notes/templates/img/lightbox_signu_fb_lage.jpg deleted file mode 100644 index 4b34420..0000000 Binary files a/notes/templates/img/lightbox_signu_fb_lage.jpg and /dev/null differ diff --git a/notes/templates/img/note_download.png b/notes/templates/img/note_download.png deleted file mode 100644 index 819cf67..0000000 Binary files a/notes/templates/img/note_download.png and /dev/null differ diff --git a/notes/templates/img/note_flag.png b/notes/templates/img/note_flag.png deleted file mode 100644 index a94dc51..0000000 Binary files a/notes/templates/img/note_flag.png and /dev/null differ diff --git a/notes/templates/img/note_thank.png b/notes/templates/img/note_thank.png deleted file mode 100644 index 1aa2cd2..0000000 Binary files a/notes/templates/img/note_thank.png and /dev/null differ diff --git a/notes/templates/img/search_arrow_left.png b/notes/templates/img/search_arrow_left.png deleted file mode 100644 index e140830..0000000 Binary files a/notes/templates/img/search_arrow_left.png and /dev/null differ diff --git a/notes/templates/img/search_arrow_right.png b/notes/templates/img/search_arrow_right.png deleted file mode 100644 index a31e736..0000000 Binary files a/notes/templates/img/search_arrow_right.png and /dev/null differ diff --git a/notes/templates/lightbox_add_note.html b/notes/templates/lightbox_add_note.html deleted file mode 100644 index e8e9ed5..0000000 --- a/notes/templates/lightbox_add_note.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - diff --git a/notes/templates/lightbox_join_course.html b/notes/templates/lightbox_join_course.html deleted file mode 100644 index 57d46da..0000000 --- a/notes/templates/lightbox_join_course.html +++ /dev/null @@ -1,525 +0,0 @@ - - - - - KarmaNotes Join Course - - - - - - - - - - - - -
- -
-
-
- -
-
- you've earned -
-
- you've uploaded -
-
- you've downloaded -
-
- you've liked -
-
- -
-
- 473 -
-
- 34 -
-
- 67 -
-
- 72 -
-
- -
-
- karma points -
-
- items -
-
- things -
-
- posts -
-
- -
-
-
- -
-
-
- -
-
-
- dashboard_profile_avatar -
-
- René Decartes -
-
-
- -
-
- My School -
-
- Harvard University -
-
- -
-
- My Courses -
-
-
    -
  • Macro Economics
  • -
  • Dance 101
  • -
  • Spanglish
  • -
-
- -
- - -
-
-
- -
- -
-
- latest activity -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- - -
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
- - -
-
-
-
- dashboard_activity_callout_icon_notebook -
-
- Bacon ipsum dolor sit amet pancetta capicola pork belly strip steak tri-tip turkey ribeye shank meatloaf tongue pork shankle venison turducken corned beef. Swine jowl meatball bresaola, tongue jerky turducken ham hock strip steak ground round filet mignon. Corned beef ground round pork chop, turducken -
-
-
-
-
-
- So far, 13 people have completely fallen in love with with these notes. -
-
-
-
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
-
-
- You added Class Economics 101 at Harvard University to your list of courses -
-
-
-
- So far, 13 people have completely fallen in love with with these notes. -
-
-
-
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
-
-
- Andrew Mogliozzi downloaded your notes, Tango for Beginners. -
-
-
-
- That just earned you 5 Karma points. -
-
-
-
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
-
-
- Gabi Schaffzin tought your notes, Tango for Beginners, were the créme de la créme. -
-
-
-
- That just earned you 1 Karma point. -
-
-
-
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
-
- -
- -
-
-
-
- dashboard_activity_callout_icon_notebook -
-
- Bacon ipsum dolor sit amet pancetta capicola pork belly strip steak tri-tip turkey ribeye shank meatloaf tongue pork shankle venison turducken corned beef. Swine jowl meatball bresaola, tongue jerky turducken ham hock strip steak ground round filet mignon. Corned beef ground round pork chop, turducken -
-
-
-
-
-
- So far, 2 people have found these notes mind-blowing. -
-
-
-
- -
- -
-
- -
- -
-
-
- dashboard_more_plusicon -
-
-
- -
- - - - - - - \ No newline at end of file diff --git a/notes/templates/lightbox_signup.html b/notes/templates/lightbox_signup.html deleted file mode 100644 index 8057048..0000000 --- a/notes/templates/lightbox_signup.html +++ /dev/null @@ -1,590 +0,0 @@ - - - - - KarmaNotes Sign Up - - - - - - - - - - - - -
- -
-
-
- -
-
- you've earned -
-
- you've uploaded -
-
- you've downloaded -
-
- you've liked -
-
- -
-
- 473 -
-
- 34 -
-
- 67 -
-
- 72 -
-
- -
-
- karma points -
-
- items -
-
- things -
-
- posts -
-
- -
-
-
- -
-
-
- -
-
-
- dashboard_profile_avatar -
-
- René Decartes -
-
-
- -
-
- My School -
-
- Harvard University -
-
- -
-
- My Courses -
-
-
    -
  • Macro Economics
  • -
  • Dance 101
  • -
  • Spanglish
  • -
-
- -
- - -
-
-
- -
- -
-
- latest activity -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- - -
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
- - -
-
-
-
- dashboard_activity_callout_icon_notebook -
-
- Bacon ipsum dolor sit amet pancetta capicola pork belly strip steak tri-tip turkey ribeye shank meatloaf tongue pork shankle venison turducken corned beef. Swine jowl meatball bresaola, tongue jerky turducken ham hock strip steak ground round filet mignon. Corned beef ground round pork chop, turducken -
-
-
-
-
-
- So far, 13 people have completely fallen in love with with these notes. -
-
-
-
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
-
-
- You added Class Economics 101 at Harvard University to your list of courses -
-
-
-
- So far, 13 people have completely fallen in love with with these notes. -
-
-
-
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
-
-
- Andrew Mogliozzi downloaded your notes, Tango for Beginners. -
-
-
-
- That just earned you 5 Karma points. -
-
-
-
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
-
-
- Gabi Schaffzin tought your notes, Tango for Beginners, were the créme de la créme. -
-
-
-
- That just earned you 1 Karma point. -
-
-
-
- -
- -
-
- -
-
- -
- -
-
-
- 5pm // tues nov 23 2012 -
-
-
- -
-
- dashboard_profile_avatar -
- -
-
- -
- -
-
-
-
- dashboard_activity_callout_icon_notebook -
-
- Bacon ipsum dolor sit amet pancetta capicola pork belly strip steak tri-tip turkey ribeye shank meatloaf tongue pork shankle venison turducken corned beef. Swine jowl meatball bresaola, tongue jerky turducken ham hock strip steak ground round filet mignon. Corned beef ground round pork chop, turducken -
-
-
-
-
-
- So far, 2 people have found these notes mind-blowing. -
-
-
-
- -
- -
-
- -
- -
-
-
- dashboard_more_plusicon -
-
-
- -
- - - - - - - \ No newline at end of file diff --git a/notes/templates/n_dashboard.html b/notes/templates/n_dashboard.html index b14f762..586096b 100644 --- a/notes/templates/n_dashboard.html +++ b/notes/templates/n_dashboard.html @@ -36,7 +36,7 @@ {{ upload_count|default:"0" }}
- {{ user.get_profile.files.count }} + {{ user.get_profile.viewed_notes.count|default:"0" }}
{{ upvote_count }} diff --git a/notes/templates/n_note.html b/notes/templates/n_note.html index 6e458ca..e3a3de3 100644 --- a/notes/templates/n_note.html +++ b/notes/templates/n_note.html @@ -7,10 +7,10 @@ {% block pagescripts %}
- - - {% include 'karma_events/person_log.html' with event=event %}
-
- at {{ event.timestamp }} -