├── __init__.py ├── web ├── __init__.py ├── settings.py ├── manage.py ├── urls.py ├── local_settings.py.example └── global_settings.py ├── server ├── frontend │ ├── __init__.py │ ├── forms.py │ ├── models.py │ ├── templates │ │ ├── login.html │ │ └── password_reset_email.html │ ├── urls.py │ └── tests.py ├── tasks │ ├── __init__.py │ ├── templates │ │ ├── 404.html │ │ ├── 500.html │ │ └── task.html │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ └── task_states.py │ ├── migrations │ │ └── __init__.py │ ├── fixtures │ │ └── Puppy.jpg │ ├── tests │ │ ├── __init__.py │ │ ├── test_commands.py │ │ ├── test_stars.py │ │ └── test_models.py │ ├── admin.py │ ├── urls.py │ └── managers.py ├── utils │ ├── __init__.py │ ├── decorators.py │ ├── fields.py │ ├── middleware.py │ └── helpers.py ├── hub └── task ├── client ├── media │ ├── tank │ │ ├── js │ │ │ ├── views │ │ │ │ ├── user-view.js │ │ │ │ ├── dashboard-detail-hub.js │ │ │ │ ├── account.js │ │ │ │ ├── dashboard-detail.js │ │ │ │ ├── login.js │ │ │ │ ├── forgot-details.js │ │ │ │ ├── signup.js │ │ │ │ ├── archive-form.js │ │ │ │ ├── task-form.js │ │ │ │ ├── change-password.js │ │ │ │ ├── views.js │ │ │ │ ├── hub-form.js │ │ │ │ ├── notification.js │ │ │ │ ├── form.js │ │ │ │ ├── toolbar.js │ │ │ │ └── form-upload.js │ │ │ ├── lang │ │ │ │ ├── custom.js │ │ │ │ └── default.js │ │ │ ├── viz │ │ │ │ ├── forcedirector.backbone.js │ │ │ │ └── forcedirector.js │ │ │ ├── controllers │ │ │ │ ├── dashboard-controller.js │ │ │ │ ├── account-controller.js │ │ │ │ └── controllers.js │ │ │ ├── backbone-stack.js │ │ │ ├── models │ │ │ │ ├── models.js │ │ │ │ └── user.js │ │ │ ├── init.js │ │ │ └── loader.js │ │ ├── build │ │ │ ├── blank-footer.js │ │ │ ├── footer.js │ │ │ ├── blank-header.js │ │ │ ├── header.js │ │ │ ├── pkg │ │ │ │ ├── html5.min.js │ │ │ │ └── tasket.tank.loader.min.js │ │ │ └── config.json │ │ └── images │ │ │ ├── favicon.ico │ │ │ ├── openhand.cur │ │ │ ├── sprites.png │ │ │ ├── closedhand.cur │ │ │ ├── hub-spinner.gif │ │ │ ├── list-arrow.png │ │ │ ├── overlay-90.png │ │ │ ├── hub-selected.png │ │ │ ├── apple-touch-icon.png │ │ │ ├── placeholder-hub.png │ │ │ ├── placeholder-user.png │ │ │ ├── notification_icons.png │ │ │ └── notification_stripes.png │ ├── notepad │ │ ├── build │ │ │ ├── blank-footer.js │ │ │ ├── footer.js │ │ │ ├── blank-header.js │ │ │ ├── header.js │ │ │ ├── pkg │ │ │ │ ├── html5.min.js │ │ │ │ └── tasket.notepad.loader.min.js │ │ │ └── config.json │ │ ├── js │ │ │ ├── init.js │ │ │ ├── lang │ │ │ │ └── default.js │ │ │ ├── views │ │ │ │ ├── hub.js │ │ │ │ ├── authbar.js │ │ │ │ ├── task.js │ │ │ │ └── hub-list.js │ │ │ └── loader.js │ │ ├── images │ │ │ ├── logo.gif │ │ │ ├── ie-tabs.png │ │ │ ├── sprite1.png │ │ │ ├── sprite2.png │ │ │ ├── bg-content.png │ │ │ ├── bg-footer.png │ │ │ ├── bg-header.png │ │ │ ├── ie6-sprite1.png │ │ │ ├── bullet-mainnav.png │ │ │ ├── ie-border-right.png │ │ │ ├── screenshot-lists.png │ │ │ ├── screenshot-tasks.png │ │ │ ├── screenshot-reorder.png │ │ │ ├── screenshot-lists-big.png │ │ │ ├── screenshot-staritems.png │ │ │ ├── screenshot-tasks-big.png │ │ │ ├── screenshot-reorder-big.png │ │ │ └── screenshot-staritems-big.png │ │ └── css │ │ │ ├── ie7.css │ │ │ ├── ie6.css │ │ │ └── ie8.css │ └── lib │ │ └── js │ │ ├── jquery.putcursoratend.js │ │ ├── html5.js │ │ ├── jquery.hashchange.js │ │ ├── cache.js │ │ └── vec2.js └── tank-viz │ ├── css │ ├── img │ │ ├── metalOverlay.png │ │ └── metalTexture.gif │ ├── ui-lightness │ │ └── images │ │ │ ├── ui-icons_222222_256x240.png │ │ │ ├── ui-icons_228ef1_256x240.png │ │ │ ├── ui-icons_ef8c08_256x240.png │ │ │ ├── ui-icons_ffd27a_256x240.png │ │ │ ├── ui-icons_ffffff_256x240.png │ │ │ ├── ui-bg_flat_10_000000_40x100.png │ │ │ ├── ui-bg_glass_100_f6f6f6_1x400.png │ │ │ ├── ui-bg_glass_100_fdf5ce_1x400.png │ │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ │ ├── ui-bg_gloss-wave_35_f6a828_500x100.png │ │ │ ├── ui-bg_highlight-soft_75_ffe45c_1x100.png │ │ │ ├── ui-bg_diagonals-thick_18_b81900_40x40.png │ │ │ ├── ui-bg_diagonals-thick_20_666666_40x40.png │ │ │ └── ui-bg_highlight-soft_100_eeeeee_1x100.png │ ├── simpleApp.css │ └── jquery.jtweetsanywhere-1.1.0.css │ ├── build.txt │ ├── scripts │ ├── app.build.js │ ├── jquery-MIT-LICENSE.txt │ ├── vec2.js │ └── SA_tasket.js │ ├── arc │ ├── data │ │ └── tasket_data.js │ ├── tasket.css │ ├── tasketapp.html │ └── SA_tasket.js │ ├── js │ └── jTweetsAnywhere-1.1.0-1 │ │ └── license.txt │ ├── data │ └── tasket_data.js │ ├── tasket.css │ └── index.html ├── requirements.txt ├── notes.txt ├── .gitignore └── docs └── INSTALL-WebFaction.md /__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/frontend/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/frontend/forms.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/frontend/models.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/tasks/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/utils/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/tasks/templates/404.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/tasks/templates/500.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/tasks/management/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/tasks/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/media/tank/js/views/user-view.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/tasks/management/commands/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/media/notepad/build/blank-footer.js: -------------------------------------------------------------------------------- 1 | }()); 2 | -------------------------------------------------------------------------------- /client/media/notepad/js/init.js: -------------------------------------------------------------------------------- 1 | app.bootstrap(); 2 | -------------------------------------------------------------------------------- /client/media/tank/build/blank-footer.js: -------------------------------------------------------------------------------- 1 | }()); 2 | -------------------------------------------------------------------------------- /client/media/tank/js/views/dashboard-detail-hub.js: -------------------------------------------------------------------------------- 1 | var DashboardDetailHub = View.extend({ 2 | 3 | }); 4 | 5 | -------------------------------------------------------------------------------- /server/tasks/fixtures/Puppy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/server/tasks/fixtures/Puppy.jpg -------------------------------------------------------------------------------- /client/media/tank/build/footer.js: -------------------------------------------------------------------------------- 1 | 2 | Tasket.app = app; 3 | window.Tasket = Tasket; 4 | 5 | }(this, this.document)); 6 | -------------------------------------------------------------------------------- /client/media/notepad/build/footer.js: -------------------------------------------------------------------------------- 1 | 2 | Tasket.app = app; 3 | window.Tasket = Tasket; 4 | 5 | }(this, this.document)); 6 | -------------------------------------------------------------------------------- /client/media/notepad/images/logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/logo.gif -------------------------------------------------------------------------------- /client/media/tank/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/tank/images/favicon.ico -------------------------------------------------------------------------------- /client/media/tank/images/openhand.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/tank/images/openhand.cur -------------------------------------------------------------------------------- /client/media/tank/images/sprites.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/tank/images/sprites.png -------------------------------------------------------------------------------- /client/media/notepad/images/ie-tabs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/ie-tabs.png -------------------------------------------------------------------------------- /client/media/notepad/images/sprite1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/sprite1.png -------------------------------------------------------------------------------- /client/media/notepad/images/sprite2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/sprite2.png -------------------------------------------------------------------------------- /client/media/tank/images/closedhand.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/tank/images/closedhand.cur -------------------------------------------------------------------------------- /client/media/tank/images/hub-spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/tank/images/hub-spinner.gif -------------------------------------------------------------------------------- /client/media/tank/images/list-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/tank/images/list-arrow.png -------------------------------------------------------------------------------- /client/media/tank/images/overlay-90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/tank/images/overlay-90.png -------------------------------------------------------------------------------- /client/tank-viz/css/img/metalOverlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/img/metalOverlay.png -------------------------------------------------------------------------------- /client/tank-viz/css/img/metalTexture.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/img/metalTexture.gif -------------------------------------------------------------------------------- /client/media/notepad/images/bg-content.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/bg-content.png -------------------------------------------------------------------------------- /client/media/notepad/images/bg-footer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/bg-footer.png -------------------------------------------------------------------------------- /client/media/notepad/images/bg-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/bg-header.png -------------------------------------------------------------------------------- /client/media/notepad/images/ie6-sprite1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/ie6-sprite1.png -------------------------------------------------------------------------------- /client/media/tank/images/hub-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/tank/images/hub-selected.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | PIL==1.1.7 2 | django==1.3 3 | django-cbv==0.1.5 4 | sorl-thumbnail==11.01 5 | django-sentry==1.8.5 6 | south==0.7.3 7 | -------------------------------------------------------------------------------- /client/media/tank/images/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/tank/images/apple-touch-icon.png -------------------------------------------------------------------------------- /client/media/tank/images/placeholder-hub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/tank/images/placeholder-hub.png -------------------------------------------------------------------------------- /client/media/tank/images/placeholder-user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/tank/images/placeholder-user.png -------------------------------------------------------------------------------- /client/media/notepad/images/bullet-mainnav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/bullet-mainnav.png -------------------------------------------------------------------------------- /client/media/notepad/images/ie-border-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/ie-border-right.png -------------------------------------------------------------------------------- /client/media/notepad/images/screenshot-lists.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/screenshot-lists.png -------------------------------------------------------------------------------- /client/media/notepad/images/screenshot-tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/screenshot-tasks.png -------------------------------------------------------------------------------- /client/media/tank/images/notification_icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/tank/images/notification_icons.png -------------------------------------------------------------------------------- /client/media/notepad/images/screenshot-reorder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/screenshot-reorder.png -------------------------------------------------------------------------------- /client/media/tank/images/notification_stripes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/tank/images/notification_stripes.png -------------------------------------------------------------------------------- /client/media/notepad/images/screenshot-lists-big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/screenshot-lists-big.png -------------------------------------------------------------------------------- /client/media/notepad/images/screenshot-staritems.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/screenshot-staritems.png -------------------------------------------------------------------------------- /client/media/notepad/images/screenshot-tasks-big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/screenshot-tasks-big.png -------------------------------------------------------------------------------- /server/hub: -------------------------------------------------------------------------------- 1 | { 2 | "id": "5", 3 | "title": "Foo foo foo", 4 | "description": "Lorem ipsum", 5 | "image": "images/placeholder-hub.png" 6 | } 7 | -------------------------------------------------------------------------------- /client/media/notepad/images/screenshot-reorder-big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/screenshot-reorder-big.png -------------------------------------------------------------------------------- /client/media/notepad/images/screenshot-staritems-big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/media/notepad/images/screenshot-staritems-big.png -------------------------------------------------------------------------------- /notes.txt: -------------------------------------------------------------------------------- 1 | Backbone Issue: Model.validate() doesn't seem to run on constructor call. Bug? 2 | Backbone docs: bind, trigger, unbind methods on views, collections and models 3 | -------------------------------------------------------------------------------- /server/tasks/tests/__init__.py: -------------------------------------------------------------------------------- 1 | from test_models import * 2 | from test_views import * 3 | from test_workflow import * 4 | from test_commands import * 5 | from test_stars import * 6 | -------------------------------------------------------------------------------- /client/tank-viz/css/ui-lightness/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/ui-lightness/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /client/tank-viz/css/ui-lightness/images/ui-icons_228ef1_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/ui-lightness/images/ui-icons_228ef1_256x240.png -------------------------------------------------------------------------------- /client/tank-viz/css/ui-lightness/images/ui-icons_ef8c08_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/ui-lightness/images/ui-icons_ef8c08_256x240.png -------------------------------------------------------------------------------- /client/tank-viz/css/ui-lightness/images/ui-icons_ffd27a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/ui-lightness/images/ui-icons_ffd27a_256x240.png -------------------------------------------------------------------------------- /client/tank-viz/css/ui-lightness/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/ui-lightness/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /client/tank-viz/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png -------------------------------------------------------------------------------- /client/tank-viz/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png -------------------------------------------------------------------------------- /client/tank-viz/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png -------------------------------------------------------------------------------- /client/tank-viz/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /client/tank-viz/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png -------------------------------------------------------------------------------- /client/tank-viz/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png -------------------------------------------------------------------------------- /client/tank-viz/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png -------------------------------------------------------------------------------- /client/tank-viz/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png -------------------------------------------------------------------------------- /client/tank-viz/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dharmafly/tasket/HEAD/client/tank-viz/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png -------------------------------------------------------------------------------- /server/frontend/templates/login.html: -------------------------------------------------------------------------------- 1 | {# For AHAH, so no html or body tags needed. #} 2 |
3 | {{ form.non_field_errors }} 4 | 8 | 9 |
-------------------------------------------------------------------------------- /client/media/tank/build/blank-header.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Tasket 3 | * github.com/dharmafly/tasket 4 | * 5 | *//* 6 | An open-source, HTML5, data visualised, micro-volunteering app. 7 | *//* 8 | 9 | by Dharmafly 10 | dharmafly.com 11 | 12 | license 13 | opensource.org/licenses/mit-license.php 14 | 15 | ** 16 | 17 | v0.0.1 18 | 19 | */ 20 | 21 | (function () { 22 | -------------------------------------------------------------------------------- /client/media/notepad/build/blank-header.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Tasket 3 | * github.com/dharmafly/tasket 4 | * 5 | *//* 6 | An open-source, HTML5, data visualised, micro-volunteering app. 7 | *//* 8 | 9 | by Dharmafly 10 | dharmafly.com 11 | 12 | license 13 | opensource.org/licenses/mit-license.php 14 | 15 | ** 16 | 17 | v0.0.1 18 | 19 | */ 20 | 21 | (function () { 22 | -------------------------------------------------------------------------------- /web/settings.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import sys 3 | import os 4 | sys.path.append('../server') 5 | from global_settings import * 6 | 7 | 8 | 9 | # Epio hack – local_settings.py wont exist on epio 10 | try: 11 | from local_settings import * 12 | except ImportError: 13 | pass 14 | 15 | TEMPLATE_DEBUG = True 16 | 17 | if os.environ.get('DJANGO_DEBUG') == "true": 18 | DEBUG = True 19 | -------------------------------------------------------------------------------- /client/media/notepad/js/lang/default.js: -------------------------------------------------------------------------------- 1 | // LANGUAGE 2 | // For a custom installation, don't override the text in this file. Instead use /lang/custom.js and add your own text to the relevant property in that file. 3 | 4 | app.lang = { 5 | NEW_HUB: "New list", 6 | EMPTY_HUB: "New list", 7 | NEW_TASK: "New item", 8 | EMPTY_TASK: "New item" 9 | }; 10 | -------------------------------------------------------------------------------- /client/media/notepad/build/header.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Tasket 3 | * github.com/dharmafly/tasket 4 | * 5 | *//* 6 | An open-source, HTML5, data visualised, micro-volunteering app. 7 | *//* 8 | 9 | by Dharmafly 10 | dharmafly.com 11 | 12 | license 13 | opensource.org/licenses/mit-license.php 14 | 15 | ** 16 | 17 | v0.0.1 18 | 19 | */ 20 | 21 | (function (window, document) { 22 | "use strict"; 23 | -------------------------------------------------------------------------------- /client/media/tank/build/header.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Tasket 3 | * github.com/dharmafly/tasket 4 | * 5 | *//* 6 | An open-source, HTML5, data visualised, micro-volunteering app. 7 | *//* 8 | 9 | by Dharmafly 10 | dharmafly.com 11 | 12 | license 13 | opensource.org/licenses/mit-license.php 14 | 15 | ** 16 | 17 | v0.0.1 18 | 19 | */ 20 | 21 | (function (window, document) { 22 | "use strict"; 23 | -------------------------------------------------------------------------------- /client/media/tank/js/views/account.js: -------------------------------------------------------------------------------- 1 | var Account = SignUp.extend({ 2 | constructor: function AccountForm() { 3 | SignUp.prototype.constructor.apply(this, arguments); 4 | }, 5 | 6 | passwordRequired: false, 7 | 8 | render: function () { 9 | var data = this.model.toJSON(); 10 | 11 | this.elem.html(tim("account", data)).find(".loading").hide(); 12 | return this; 13 | } 14 | }); 15 | -------------------------------------------------------------------------------- /client/media/tank/js/lang/custom.js: -------------------------------------------------------------------------------- 1 | // LANGUAGE 2 | // For a custom installation, don't override the text in this file. Instead use /lang/custom.js and add your own text to the relevant property in that file. 3 | 4 | _.extend(app.lang, { 5 | //LOADING: "Un moment....", 6 | // etc 7 | 8 | HUB: "project", 9 | MY_HUBS: "My Projects", 10 | CANCEL_TASK: "Actually, I won't do it" 11 | }); 12 | -------------------------------------------------------------------------------- /server/task: -------------------------------------------------------------------------------- 1 | { 2 | "id": "6", 3 | "description": "This is a task description, it should contain a few sentences detailing the nature of the task.", 4 | "owner": { 5 | "name": 'Another User', 6 | "url": '#/user/another-user/', 7 | "image": 'images/placeholder-user.png' 8 | }, 9 | "hasUser": true, 10 | "isOwner": false, 11 | "isNotOwner": true, 12 | "showTakeThisButton": false, 13 | "showDoneThisButton": false, 14 | "owner":2, 15 | "hub":3 16 | } 17 | -------------------------------------------------------------------------------- /web/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from django.core.management import execute_manager 3 | try: 4 | import settings # Assumed to be in the same directory. 5 | except ImportError: 6 | import sys 7 | sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) 8 | sys.exit(1) 9 | 10 | if __name__ == "__main__": 11 | execute_manager(settings) 12 | -------------------------------------------------------------------------------- /server/frontend/urls.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from django.conf.urls.defaults import * 3 | from django.conf import settings 4 | 5 | import views 6 | 7 | urlpatterns = patterns('', 8 | # Login 9 | url(r'^login/$',views.LoginView.as_view()), 10 | url(r'^logout/$',views.LogoutView.as_view()), 11 | url(r'^register/$',views.RegisterView.as_view()), 12 | url(r'^forgot-password/$',views.PasswordReset.as_view()), 13 | url(r'^forgot-password/(?P[^/]+)/(?P.*)$',views.PasswordReset.as_view(), name="password_reset"), 14 | url(r'^settings/$',views.settings_view), 15 | ) -------------------------------------------------------------------------------- /server/tasks/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from models import * 4 | 5 | from sorl.thumbnail.admin import AdminImageMixin, AdminInlineImageMixin 6 | 7 | class TaskInline(AdminInlineImageMixin, admin.StackedInline): 8 | model = Task 9 | 10 | 11 | class HubAdmin(AdminImageMixin, admin.ModelAdmin): 12 | inlines = [ 13 | TaskInline, 14 | ] 15 | 16 | class ProfileAdmin(AdminImageMixin, admin.ModelAdmin): 17 | list_display = ('user',) 18 | list_filter = ('admin',) 19 | 20 | 21 | admin.site.register(Task) 22 | admin.site.register(Hub, HubAdmin) 23 | admin.site.register(Profile, ProfileAdmin) 24 | -------------------------------------------------------------------------------- /client/tank-viz/build.txt: -------------------------------------------------------------------------------- 1 | 2 | scripts/require-jquery.js 3 | ---------------- 4 | scripts/require-jquery.js 5 | 6 | scripts/main.js 7 | ---------------- 8 | scripts/kgd/core.js 9 | scripts/kgd/consts.js 10 | scripts/kgd/world/../aux.js 11 | scripts/kgd/world/../client.js 12 | scripts/kgd/world/../maths/v2.js 13 | scripts/kgd/world/Thing.js 14 | scripts/kgd/world/./signals.js 15 | scripts/kgd/world/./vehicle/./sensors.js 16 | scripts/kgd/world/./vehicle/Vehicle.js 17 | scripts/kgd/world/World.js 18 | scripts/kgd/simpleApp/SimpleApp.js 19 | scripts/scripts/tasketter.js 20 | scripts/scripts/vec2.js 21 | scripts/SA_tasket.js 22 | scripts/main.js 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /screenshot.png 2 | .DS_Store 3 | *.pyc 4 | /web/local_settings.py 5 | /web/build/ 6 | /web/pip-log.txt 7 | .Python 8 | /bin/ 9 | /include/ 10 | /lib/ 11 | /man/ 12 | Imaging-* 13 | 14 | # South migrations 15 | server/tasks/migrations/ 16 | 17 | # Backups 18 | web/tasks-backup-* 19 | 20 | # local db 21 | tasket.db 22 | web/tasket 23 | 24 | # npm modules 25 | web/node_modules 26 | 27 | # PIL-generated images 28 | client/media/cache/ 29 | client/media/images/ 30 | 31 | # Unminified built files 32 | client/media/tank/build/pkg/html5.js 33 | client/media/tank/build/pkg/tasket.tank.js 34 | client/media/tank/build/pkg/tasket.tank.loader.js 35 | -------------------------------------------------------------------------------- /client/media/tank/js/views/dashboard-detail.js: -------------------------------------------------------------------------------- 1 | var DashboardDetail = Lightbox.extend({ 2 | events: { 3 | "click .back, .close": "hide" 4 | }, 5 | 6 | tagName: "section", 7 | 8 | className: "detail", 9 | 10 | constructor: function DashboardDetail() { 11 | Lightbox.prototype.constructor.apply(this, arguments); 12 | }, 13 | 14 | title: function (title) { 15 | this.$("h1").text(title); 16 | return this; 17 | }, 18 | 19 | render: function () { 20 | var template = tim("dashboard-detail"); 21 | this.elem.html(template); 22 | return this; 23 | } 24 | }); 25 | 26 | -------------------------------------------------------------------------------- /client/media/tank/js/viz/forcedirector.backbone.js: -------------------------------------------------------------------------------- 1 | // FORCE-DIRECTOR extension for Backbone.js 2 | 3 | // Extend ForceDirector with event bindings 4 | _.extend(ForceDirector.prototype, Backbone.Events); 5 | 6 | // Override noop methods in ForceDirector prototype to allow triggering of events on loop start and end 7 | ForceDirector.prototype.triggerLoopStart = function(){ 8 | return this.trigger("start", this); 9 | }; 10 | 11 | ForceDirector.prototype.triggerLoopEnd = function(){ 12 | return this.trigger("end", this); 13 | }; 14 | 15 | ForceDirector.prototype.triggerLoop = function(){ 16 | return this.trigger("loop", this); 17 | }; 18 | -------------------------------------------------------------------------------- /client/media/tank/js/controllers/dashboard-controller.js: -------------------------------------------------------------------------------- 1 | var DashboardController = Controller.extend({ 2 | routes: { 3 | "/dashboard/user/:id": "showUser", 4 | "/dashboard/tasks/": "showCurrentUserTasks", 5 | "/dashboard/hubs/": "showCurrentUserHubs" 6 | }, 7 | 8 | constructor: function DashboardController() { 9 | Controller.apply(this, arguments); 10 | }, 11 | 12 | showCurrentUserTasks: function () { 13 | var user = app.currentUser; 14 | }, 15 | 16 | showCurrentUserHubs: function () { 17 | var user = app.currentUser; 18 | app.dashboard.detail.title(app.lang.MY_HUBS).show(); 19 | } 20 | }); 21 | -------------------------------------------------------------------------------- /client/tank-viz/scripts/app.build.js: -------------------------------------------------------------------------------- 1 | ({ 2 | appDir: "../", 3 | baseUrl: "scripts/", 4 | dir: "../../webapp-build", 5 | //Comment out the optimize line if you want 6 | //the code minified by UglifyJS 7 | optimize: "none", 8 | 9 | paths: { 10 | "jquery": "require-jquery" 11 | }, 12 | 13 | modules: [ 14 | //Optimize the require-jquery.js file by applying any minification 15 | //that is desired via the optimize: setting above. 16 | { 17 | name: "require-jquery" 18 | }, 19 | 20 | //Optimize the application files. Exclude jQuery since it is 21 | //included already in require-jquery.js 22 | { 23 | name: "main", 24 | exclude: ["jquery"] 25 | } 26 | ] 27 | }) 28 | -------------------------------------------------------------------------------- /server/frontend/templates/password_reset_email.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | Vars: 3 | user - a user object, can access profile fields using user.profile.[fieldname] 4 | email - the user's email address 5 | domain - the domain of the active site (see INSTALL) 6 | site_name - the site name of the active site (see INSTALL) 7 | uid - User ID in base36 8 | token - the token that will form the unique request 9 | protocol - http or https 10 | {% endcomment %} 11 | TASKET 12 | ====== 13 | 14 | Hi {{ user.profile.name }}, 15 | 16 | Here is a link to reset the password for your username, {{ user.profile.username }} on {{ site_name }}: 17 | _(If you did not request this reset link then please ignore this message)._ 18 | 19 | {{ protocol }}://{{ domain }}{% url password_reset uid token %} -------------------------------------------------------------------------------- /client/media/notepad/css/ie7.css: -------------------------------------------------------------------------------- 1 | /* 2 | ---------------------------------------------- 3 | Toodledoo IE7 Styles 4 | Developed by Ollie Bettany / Dharmafly 5 | Created: 13/06/2011 6 | ---------------------------------------------- 7 | */ 8 | 9 | #content { 10 | width: 100%; 11 | float: left; 12 | clear: none; 13 | } 14 | 15 | aside { 16 | border-left: 1px solid #e0e0e0; 17 | } 18 | 19 | #content .item-list > li { 20 | padding-top: 0; 21 | } 22 | 23 | #content .item-list p { 24 | margin-top: -10px; 25 | } 26 | 27 | #content .item-list .button { 28 | top: 0; 29 | } 30 | 31 | .lightbox .content form .actions .note { 32 | left: 0; 33 | } 34 | 35 | .ie .action.close, 36 | .ie .action.delete { 37 | background-position: 2px -118px; 38 | } 39 | 40 | .ie button.link { 41 | margin-top: 1px; 42 | } -------------------------------------------------------------------------------- /client/tank-viz/arc/data/tasket_data.js: -------------------------------------------------------------------------------- 1 | if(typeof tasket_data === 'undefined'){tasket_data = {};} 2 | 3 | // !NOTE! both projects and tasks should have a key to retrieve positional info. 4 | 5 | tasket_data = { 6 | "projects": { 7 | "title": 'A Set of Projects', 8 | "projectA": { 9 | "key": 'projA', 10 | "title": 'A Very Important Project', 11 | "width": 150, 12 | "height":100, 13 | "description": 'This is a very important project, consisting of a variable number of tasks', 14 | "tasks": [ 15 | {"key":"tA", "title":"taskA", "width":100, "height":80}, 16 | {"key":"tB", "title":"taskB", "width":100, "height":50}, 17 | {"key":"tC", "title":"taskC", "width":100, "height":80}, 18 | {"key":"tD", "title":"taskD", "width":100, "height":20}, 19 | {"key":"tE", "title":"taskE", "width":100, "height":20} 20 | ] 21 | } 22 | } 23 | }; 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /client/media/lib/js/jquery.putcursoratend.js: -------------------------------------------------------------------------------- 1 | // Put cursor at end of input element 2 | // http://stackoverflow.com/q/1675345/165716 3 | 4 | jQuery.fn.putCursorAtEnd = function(){ 5 | return this.each(function(){ 6 | var elem = jQuery(this), 7 | val = elem.val(), 8 | len; 9 | 10 | elem.focus(); 11 | 12 | // If this function exists (not old IE) 13 | if (this.setSelectionRange) { 14 | // Double the length because Opera is inconsistent about whether a carriage return is one character or two 15 | len = val.length * 2; 16 | this.setSelectionRange(len, len); 17 | } 18 | else { 19 | // ... otherwise replace the contents with itself (doesn't work in Google Chrome) 20 | elem.val(val); 21 | } 22 | 23 | // Scroll to the bottom, in case we're in a tall textarea (necessary for Firefox and Google Chrome) 24 | this.scrollTop = 999999; 25 | }); 26 | }; -------------------------------------------------------------------------------- /web/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls.defaults import * 2 | from django.conf import settings 3 | 4 | # Uncomment the next two lines to enable the admin: 5 | from django.contrib import admin 6 | admin.autodiscover() 7 | 8 | urlpatterns = patterns('', 9 | # Uncomment the next line to enable the admin: 10 | (r'^admin/', include(admin.site.urls)), 11 | 12 | # Tasks: 13 | (r'', include('tasks.urls')), 14 | 15 | # Frontend 16 | (r'', include('frontend.urls')), 17 | 18 | # sorl.thumbnail 19 | (r'^', include('sorl.thumbnail.urls')), 20 | 21 | # sentry 22 | (r'^sentry/', include('sentry.web.urls')), 23 | 24 | # Uncomment the admin/doc line below to enable admin documentation: 25 | # (r'^admin/doc/', include('django.contrib.admindocs.urls')), 26 | 27 | ) 28 | 29 | 30 | if settings.DEBUG: 31 | urlpatterns += patterns('django.views', 32 | (r'^media/(?P.*)$', 'static.serve', 33 | {'document_root': settings.MEDIA_ROOT}), 34 | 35 | ) 36 | 37 | handler404 = 'frontend.views.handle404' -------------------------------------------------------------------------------- /client/media/tank/js/lang/default.js: -------------------------------------------------------------------------------- 1 | // LANGUAGE 2 | // For a custom installation, don't override the text in this file. Instead use /lang/custom.js and add your own text to the relevant property in that file. 3 | 4 | app.lang = { 5 | LOADING: "Loading...", 6 | DOWNLOAD_ERROR: "There was a problem downloading data from the server.", 7 | INIT_ERROR: "Sorry. There was a problem loading the app. Please refresh and try again.", 8 | HUB_NO_TASKS: "No tasks", 9 | DELETE_HUB_CONFIRM: "Deleting a project will permanently erase it, and all associated tasks. Continue?", 10 | ARCHIVE_HUB_CONFIRM: "Archiving a project will hide it from view. Archived projects can be restored by selecting 'View archived projects' in the sidebar. Continue?", 11 | RESTORE_HUB_CONFIRM: "Restoring a project will make it visible again. Continue?", 12 | DELETE_TASK_CONFIRM: "This will permanently delete this task. Continue?", 13 | HUB: "hub", 14 | MY_HUBS: "My Hubs", 15 | ESTIMATED_TIME: "Estimated Time: " 16 | }; 17 | -------------------------------------------------------------------------------- /client/media/notepad/js/views/hub.js: -------------------------------------------------------------------------------- 1 | var HubView = View.extend({ 2 | tagName: "li", 3 | 4 | constructor: function HubView () { 5 | Backbone.View.prototype.constructor.apply(this, arguments); 6 | }, 7 | 8 | initialize: function (options) { 9 | var view = this; 10 | view.elem = jQuery(view.el); 11 | 12 | view.elem.attr("data-id", view.model.id); 13 | 14 | view.model 15 | .bind("remove", view.remove) 16 | .bind("change", function (hub) { 17 | if (hub.hasChanged("title")) { 18 | view.$(".title").text(hub.get("title")); 19 | } 20 | 21 | view.$(".count").text(hub.countNewTasks()); 22 | }); 23 | }, 24 | 25 | select: function(){ 26 | this.elem.addClass("active"); 27 | }, 28 | 29 | deselect: function(){ 30 | this.elem.removeClass("active"); 31 | }, 32 | 33 | render: function () { 34 | var hub = this.model; 35 | 36 | jQuery(this.el).html(tim("hub", _.extend(this.model.toJSON(), {count: hub.countNewTasks() }) )); 37 | return this; 38 | } 39 | }); 40 | -------------------------------------------------------------------------------- /client/tank-viz/scripts/jquery-MIT-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2009 John Resig, http://jquery.com/ 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /client/tank-viz/js/jTweetsAnywhere-1.1.0-1/license.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2010 Thomas Billenstein, http://thomasbillenstein.com/jTweetsAnywhere 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /client/media/tank/js/views/login.js: -------------------------------------------------------------------------------- 1 | var Login = Form.extend({ 2 | constructor: function LoginForm() { 3 | Form.prototype.constructor.apply(this, arguments); 4 | }, 5 | 6 | submit: function (event) { 7 | var form = this, 8 | credentials; 9 | 10 | if (event) { 11 | event.preventDefault(); 12 | } 13 | 14 | credentials = _.map(this.elem.serializeArray(), function (input) { 15 | return input.value; 16 | }); 17 | 18 | // Login and add callbacks to the returned obejct. 19 | Tasket.login(credentials[0], credentials[1]) 20 | .success(_.bind(this._onSuccess, this)) 21 | .error(function (xhr) { 22 | form.errors({ 23 | username: ["Invalid username and password"] 24 | }); 25 | form.trigger("error", xhr, form); 26 | }); 27 | 28 | return this.trigger("submit", this); 29 | }, 30 | 31 | render: function () { 32 | var html = tim("login"); 33 | this.elem.html(html); 34 | return this; 35 | }, 36 | 37 | _onSuccess: function (data) { 38 | var user = new User(data.user); 39 | this.trigger("success", user, this); 40 | } 41 | }); 42 | -------------------------------------------------------------------------------- /client/tank-viz/css/simpleApp.css: -------------------------------------------------------------------------------- 1 | #main{ 2 | width:880px; 3 | margin:auto; 4 | background:url(img/metalTexture.gif); 5 | position:relative; 6 | } 7 | .stretched{ 8 | position:absolute; 9 | display:block; 10 | width:100%; 11 | height:100%; 12 | } 13 | #left-col{ 14 | width:250px; 15 | float:left; 16 | } 17 | .logo{ 18 | float:left; 19 | } 20 | .logo img{ 21 | border:none; 22 | } 23 | #app_holder{ 24 | padding:10px; 25 | position:relative; 26 | overflow:hidden; 27 | } 28 | #world_canvas{ 29 | width:600px; 30 | float:left; 31 | margin-left:10px; 32 | } 33 | #control_panel{ 34 | float:left; 35 | width:248px; 36 | background:#eee; 37 | margin-top:10px; 38 | padding-bottom:10px; 39 | } 40 | #control_panel p{ 41 | margin: 5px 0; 42 | font-size:12px; 43 | } 44 | #control_panel .slider_box{ 45 | margin:0 5px; 46 | float:left; 47 | padding-bottom:5px; 48 | } 49 | .slider_box .ui-slider{ 50 | width:240px; 51 | } 52 | .ui-slider-horizontal{ 53 | height: 0.5em; 54 | } 55 | #mycanvas{ 56 | background:#000; 57 | color:#eee; 58 | position:relative; 59 | } 60 | .img_button{ 61 | float:left; 62 | margin:1px; 63 | } 64 | .img_button img{ 65 | width:28px; 66 | height:28px; 67 | border: 1px solid transparent; 68 | } 69 | .vspace0, .vspace10{ 70 | clear:both; 71 | height:0px; 72 | font-size:0; 73 | } 74 | .vspace10{ 75 | height:10px; 76 | } 77 | #select-options-canvas{ 78 | width:100%; 79 | text-align:center; 80 | font-size:20px; 81 | } 82 | -------------------------------------------------------------------------------- /server/tasks/tests/test_commands.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | 3 | from django.test import TestCase 4 | from django.conf import settings 5 | 6 | from django.core.management import call_command 7 | 8 | from tasks.models import Task 9 | 10 | class CommandsTests(TestCase): 11 | fixtures = ['test_data.json',] 12 | 13 | CLAIMED_TIME_LIMIT = int(getattr(settings, "CLAIMED_TIME_LIMIT", 24)) 14 | DONE_TIME_LIMIT = int(getattr(settings, "DONE_TIME_LIMIT", 24)) 15 | 16 | 17 | def test_call_task_states(self): 18 | verified_count_before = Task.objects.filter(state=Task.STATE_VERIFIED).count() 19 | claimed_count_before = Task.objects.filter(state=Task.STATE_CLAIMED).count() 20 | 21 | call_command('task_states') 22 | 23 | verified_count_after = Task.objects.filter(state=Task.STATE_VERIFIED).count() 24 | claimed_count_after = Task.objects.filter(state=Task.STATE_CLAIMED).count() 25 | 26 | self.assertEqual(claimed_count_before, 2) 27 | self.assertEqual(claimed_count_after, 0) 28 | 29 | self.assertEqual(verified_count_before, 2) 30 | self.assertEqual(verified_count_after, 3) 31 | 32 | tasks = Task.objects.filter(state=Task.STATE_VERIFIED) 33 | owner,verifiedBy = ([unicode(t.owner) for t in tasks], [unicode(t.verifiedBy) for t in tasks]) 34 | 35 | for o,v in zip(owner, verifiedBy): 36 | self.assertEqual(o,v) 37 | -------------------------------------------------------------------------------- /server/tasks/management/commands/task_states.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | 3 | from django.core.management.base import BaseCommand, CommandError 4 | from django.conf import settings 5 | from django.db.models import F 6 | 7 | from tasks.models import Task 8 | 9 | class Command(BaseCommand): 10 | 11 | CLAIMED_TIME_LIMIT = int(getattr(settings, "CLAIMED_TIME_LIMIT", 72)) 12 | DONE_TIME_LIMIT = int(getattr(settings, "DONE_TIME_LIMIT", 72)) 13 | 14 | def mark_claimed(self): 15 | 16 | time_offset = datetime.now() - timedelta(hours=self.CLAIMED_TIME_LIMIT) 17 | claimed_tasks = Task.objects.filter(state=Task.STATE_CLAIMED) 18 | claimed_tasks = claimed_tasks.filter(claimedTime__lte=time_offset) 19 | 20 | claimed_tasks.update(claimedTime=None, claimedBy=None, state=Task.STATE_NEW) 21 | 22 | def mark_done(self): 23 | time_offset = datetime.now() - timedelta(hours=self.DONE_TIME_LIMIT) 24 | done_tasks = Task.objects.filter(state=Task.STATE_DONE) 25 | done_tasks = done_tasks.filter(doneTime__lte=time_offset) 26 | done_tasks.update(verifiedTime=datetime.now(), verifiedBy=F('owner'), state=Task.STATE_VERIFIED) 27 | 28 | 29 | def handle(self, **options): 30 | if self.CLAIMED_TIME_LIMIT >= 0: 31 | self.mark_claimed() 32 | if self.DONE_TIME_LIMIT >= 0: 33 | self.mark_done() 34 | -------------------------------------------------------------------------------- /server/tasks/templates/task.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | {{ form.errors }} 7 | 8 |
9 | {% csrf_token %} 10 |
11 | 12 | {{ form.title }} 13 |
14 | 15 |
16 | 17 | {{ form.time_estimate }} 18 |
19 | 20 |
21 | 22 | {{ form.summary }} 23 |
24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /client/media/lib/js/html5.js: -------------------------------------------------------------------------------- 1 | // html5shiv MIT @rem remysharp.com/html5-enabling-script 2 | // iepp v1.6.2 MIT @jon_neal iecss.com/print-protector 3 | /*@cc_on(function(m,c){var z="abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video";function n(d){for(var a=-1;++ai";if(g.childNodes.length!==1){var i=z.split("|"),o=i.length,s=RegExp("(^|\\s)("+z+")", 4 | "gi"),t=RegExp("<(/*)("+z+")","gi"),u=RegExp("(^|[^\\n]*?\\s)("+z+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),r=c.createDocumentFragment(),k=c.documentElement;g=k.firstChild;var h=c.createElement("body"),l=c.createElement("style"),f;n(c);n(r);g.insertBefore(l, 5 | g.firstChild);l.media="print";m.attachEvent("onbeforeprint",function(){var d=-1,a=p(c.styleSheets,"all"),e=[],b;for(f=f||c.body;(b=u.exec(a))!=null;)e.push((b[1]+b[2]+b[3]).replace(s,"$1.iepp_$2")+b[4]);for(l.styleSheet.cssText=e.join("\n");++di";if(g.childNodes.length!==1){var i=z.split("|"),o=i.length,s=RegExp("(^|\\s)("+z+")", 4 | "gi"),t=RegExp("<(/*)("+z+")","gi"),u=RegExp("(^|[^\\n]*?\\s)("+z+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),r=c.createDocumentFragment(),k=c.documentElement;g=k.firstChild;var h=c.createElement("body"),l=c.createElement("style"),f;n(c);n(r);g.insertBefore(l, 5 | g.firstChild);l.media="print";m.attachEvent("onbeforeprint",function(){var d=-1,a=p(c.styleSheets,"all"),e=[],b;for(f=f||c.body;(b=u.exec(a))!=null;)e.push((b[1]+b[2]+b[3]).replace(s,"$1.iepp_$2")+b[4]);for(l.styleSheet.cssText=e.join("\n");++di";if(g.childNodes.length!==1){var i=z.split("|"),o=i.length,s=RegExp("(^|\\s)("+z+")", 4 | "gi"),t=RegExp("<(/*)("+z+")","gi"),u=RegExp("(^|[^\\n]*?\\s)("+z+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),r=c.createDocumentFragment(),k=c.documentElement;g=k.firstChild;var h=c.createElement("body"),l=c.createElement("style"),f;n(c);n(r);g.insertBefore(l, 5 | g.firstChild);l.media="print";m.attachEvent("onbeforeprint",function(){var d=-1,a=p(c.styleSheets,"all"),e=[],b;for(f=f||c.body;(b=u.exec(a))!=null;)e.push((b[1]+b[2]+b[3]).replace(s,"$1.iepp_$2")+b[4]);for(l.styleSheet.cssText=e.join("\n");++dWe've emailed you a link to reset your password.

"); 46 | this.trigger("success", null, this); 47 | } 48 | }); 49 | -------------------------------------------------------------------------------- /client/media/notepad/css/ie6.css: -------------------------------------------------------------------------------- 1 | /* 2 | ---------------------------------------------- 3 | Toodledoo IE6 Styles 4 | Developed by Ollie Bettany / Dharmafly 5 | Created: 13/06/2011 6 | ---------------------------------------------- 7 | */ 8 | 9 | header { 10 | height: 110px; 11 | } 12 | 13 | aside nav { 14 | width: 25em; 15 | } 16 | 17 | #mainnav li.first, 18 | footer nav li.first { 19 | background: none; 20 | margin: 0; 21 | padding: 0; 22 | } 23 | 24 | #content .item-list li { 25 | border-bottom: 1px solid #CCCCCC; 26 | line-height: 1.8em; 27 | padding: 10px 0 10px 120px; 28 | position: relative; 29 | } 30 | 31 | #content .item-list p { 32 | margin-top: 0; 33 | } 34 | 35 | #content .item-list .button { 36 | top: -3px; 37 | } 38 | 39 | #content .item-list li .edit-item li { 40 | border: 0; 41 | padding: 0; 42 | position: absolute; 43 | } 44 | 45 | #content .new-item:hover { 46 | cursor: pointer; 47 | } 48 | 49 | aside h1 { 50 | margin-right: 6px; 51 | } 52 | 53 | aside h1 a span { 54 | background-image: url(../images/ie6-sprite1.png); 55 | background-position: right 6px; 56 | } 57 | 58 | .open h1 a span { 59 | background-position: right -91px; 60 | } 61 | 62 | footer nav { 63 | height: 1.5em; 64 | } 65 | 66 | footer a.df:hover span.df-name { 67 | text-decoration: underline; 68 | } 69 | 70 | .lightbox .content form .actions { 71 | width: 23.07em; 72 | } 73 | -------------------------------------------------------------------------------- /client/media/lib/js/jquery.hashchange.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery hashchange event - v1.3 - 7/21/2010 3 | * http://benalman.com/projects/jquery-hashchange-plugin/ 4 | * 5 | * Copyright (c) 2010 "Cowboy" Ben Alman 6 | * Dual licensed under the MIT and GPL licenses. 7 | * http://benalman.com/about/license/ 8 | */ 9 | (function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('