From c6c07e1c414025b33a2fcd626248bb3e113e0a14 Mon Sep 17 00:00:00 2001
From: Peter Butkovic
Date: Wed, 11 Aug 2021 09:10:22 +0200
Subject: [PATCH 1/9] Cloud native refactoring (#1)
* kubernetes-ready version
* keep spring app only
* ignore mvn build targets
* ignore idea dirs
* dir structure refactored
* hsql for unit test, postgres for others
* postgres -> mysql
* gh actions based docker build/push
---
.github/workflows/ci-notejam.yml | 75 +
.gitignore | 6 +
CA_TECH | 84 -
Dockerfile | 4 +
README.rst | 170 +-
cakephp/README.rst | 88 -
cakephp/notejam/.editorconfig | 18 -
cakephp/notejam/.gitattributes | 36 -
cakephp/notejam/.gitignore | 4 -
cakephp/notejam/.htaccess | 5 -
cakephp/notejam/.travis.yml | 18 -
cakephp/notejam/bin/cake | 40 -
cakephp/notejam/bin/cake.bat | 30 -
cakephp/notejam/bin/cake.php | 33 -
cakephp/notejam/composer.json | 41 -
.../Migrations/20150928200943_initial.php | 141 -
cakephp/notejam/config/app.default.php | 326 --
cakephp/notejam/config/app.php | 313 --
cakephp/notejam/config/bootstrap.php | 202 -
cakephp/notejam/config/bootstrap_cli.php | 32 -
cakephp/notejam/config/paths.php | 85 -
cakephp/notejam/config/routes.php | 78 -
cakephp/notejam/config/schema/i18n.sql | 27 -
cakephp/notejam/config/schema/sessions.sql | 17 -
cakephp/notejam/index.php | 16 -
cakephp/notejam/phpunit.xml.dist | 33 -
cakephp/notejam/src/Console/Installer.php | 192 -
.../notejam/src/Controller/AppController.php | 88 -
.../src/Controller/NotesController.php | 138 -
.../notejam/src/Controller/PadsController.php | 121 -
.../src/Controller/UsersController.php | 145 -
.../notejam/src/Form/ForgotPasswordForm.php | 35 -
cakephp/notejam/src/Form/SettingsForm.php | 47 -
cakephp/notejam/src/Model/Entity/Note.php | 41 -
cakephp/notejam/src/Model/Entity/Pad.php | 23 -
cakephp/notejam/src/Model/Entity/User.php | 50 -
.../notejam/src/Model/Table/NotesTable.php | 82 -
cakephp/notejam/src/Model/Table/PadsTable.php | 70 -
.../notejam/src/Model/Table/UsersTable.php | 80 -
cakephp/notejam/src/Shell/ConsoleShell.php | 79 -
.../src/Template/Cell/Pads/display.ctp | 16 -
.../src/Template/Element/Flash/default.ctp | 7 -
.../src/Template/Element/Flash/error.ctp | 3 -
.../src/Template/Element/Flash/success.ctp | 3 -
.../src/Template/Element/notes/form.ctp | 6 -
.../src/Template/Element/pads/form.ctp | 4 -
.../src/Template/Email/html/default.ctp | 22 -
.../src/Template/Email/text/default.ctp | 16 -
.../notejam/src/Template/Error/error400.ctp | 38 -
.../notejam/src/Template/Error/error500.ctp | 37 -
.../Template/Layout/Email/html/default.ctp | 24 -
.../Template/Layout/Email/text/default.ctp | 16 -
cakephp/notejam/src/Template/Layout/ajax.ctp | 16 -
.../notejam/src/Template/Layout/anonymous.ctp | 6 -
.../notejam/src/Template/Layout/default.ctp | 39 -
cakephp/notejam/src/Template/Layout/error.ctp | 55 -
.../src/Template/Layout/rss/default.ctp | 14 -
cakephp/notejam/src/Template/Layout/user.ctp | 8 -
cakephp/notejam/src/Template/Notes/create.ctp | 3 -
cakephp/notejam/src/Template/Notes/delete.ctp | 7 -
cakephp/notejam/src/Template/Notes/edit.ctp | 3 -
cakephp/notejam/src/Template/Notes/index.ctp | 20 -
cakephp/notejam/src/Template/Notes/view.ctp | 9 -
cakephp/notejam/src/Template/Pads/create.ctp | 3 -
cakephp/notejam/src/Template/Pads/delete.ctp | 6 -
cakephp/notejam/src/Template/Pads/edit.ctp | 4 -
cakephp/notejam/src/Template/Pads/view.ctp | 19 -
.../src/Template/Users/forgotpassword.ctp | 6 -
cakephp/notejam/src/Template/Users/index.ctp | 45 -
.../notejam/src/Template/Users/settings.ctp | 8 -
cakephp/notejam/src/Template/Users/signin.ctp | 9 -
cakephp/notejam/src/Template/Users/signup.ctp | 7 -
cakephp/notejam/src/View/AppView.php | 35 -
cakephp/notejam/src/View/Cell/PadsCell.php | 33 -
.../notejam/tests/Fixture/NotesFixture.php | 51 -
cakephp/notejam/tests/Fixture/PadsFixture.php | 42 -
.../notejam/tests/Fixture/UsersFixture.php | 48 -
.../Controller/NotesControllerTest.php | 151 -
.../Controller/PadsControllerTest.php | 151 -
.../Controller/UsersControllerTest.php | 139 -
.../tests/TestCase/NotejamTestCase.php | 44 -
cakephp/notejam/tests/bootstrap.php | 8 -
cakephp/notejam/webroot/.htaccess | 5 -
cakephp/notejam/webroot/css/style.css | 396 --
cakephp/notejam/webroot/favicon.ico | Bin 1782 -> 0 bytes
cakephp/notejam/webroot/img/cake.icon.png | Bin 943 -> 0 bytes
cakephp/notejam/webroot/img/cake.power.gif | Bin 201 -> 0 bytes
cakephp/notejam/webroot/index.php | 37 -
cakephp/notejam/webroot/js/empty | 0
contribute.rst | 152 -
django/README.rst | 83 -
django/notejam/manage.py | 10 -
django/notejam/notejam/__init__.py | 0
django/notejam/notejam/settings.py | 184 -
django/notejam/notejam/tests.py | 36 -
django/notejam/notejam/urls.py | 25 -
django/notejam/notejam/wsgi.py | 28 -
django/notejam/notes/__init__.py | 0
django/notejam/notes/forms.py | 9 -
.../notejam/notes/migrations/0001_initial.py | 84 -
django/notejam/notes/migrations/__init__.py | 0
django/notejam/notes/models.py | 13 -
.../templates/notes/note_confirm_delete.html | 13 -
.../notes/templates/notes/note_create.html | 8 -
.../notes/templates/notes/note_detail.html | 14 -
.../notes/templates/notes/note_edit.html | 8 -
.../notes/templates/notes/note_form.html | 13 -
.../notes/templates/notes/note_list.html | 33 -
django/notejam/notes/templatetags/__init__.py | 0
.../notejam/notes/templatetags/date_tags.py | 17 -
django/notejam/notes/tests.py | 110 -
django/notejam/notes/urls.py | 21 -
django/notejam/notes/views.py | 110 -
django/notejam/pads/__init__.py | 0
django/notejam/pads/forms.py | 9 -
.../notejam/pads/migrations/0001_initial.py | 70 -
django/notejam/pads/migrations/__init__.py | 0
django/notejam/pads/models.py | 10 -
.../templates/pads/pad_confirm_delete.html | 14 -
.../pads/templates/pads/pad_create.html | 9 -
.../notejam/pads/templates/pads/pad_edit.html | 11 -
.../notejam/pads/templates/pads/pad_form.html | 7 -
.../pads/templates/pads/pad_note_list.html | 29 -
django/notejam/pads/templatetags/__init__.py | 0
django/notejam/pads/templatetags/pad_tags.py | 31 -
django/notejam/pads/tests.py | 49 -
django/notejam/pads/urls.py | 16 -
django/notejam/pads/views.py | 79 -
django/notejam/static_files/css/style.css | 395 --
django/notejam/templates/404.html | 0
django/notejam/templates/base.html | 92 -
django/notejam/templates/user.html | 5 -
django/notejam/users/__init__.py | 0
django/notejam/users/auth_backends.py | 18 -
django/notejam/users/forms.py | 56 -
django/notejam/users/models.py | 3 -
.../users/templates/forgot_password.html | 15 -
django/notejam/users/templates/settings.html | 20 -
django/notejam/users/templates/signin.html | 19 -
django/notejam/users/templates/signup.html | 21 -
django/notejam/users/tests.py | 83 -
django/notejam/users/views.py | 106 -
django/requirements.txt | 2 -
express/README.rst | 83 -
express/notejam/app.js | 110 -
express/notejam/bin/www | 9 -
express/notejam/db.js | 105 -
express/notejam/helpers.js | 22 -
express/notejam/models.js | 49 -
express/notejam/package.json | 34 -
express/notejam/public/stylesheets/style.css | 397 --
express/notejam/routes/notes.js | 108 -
express/notejam/routes/pads.js | 93 -
express/notejam/routes/users.js | 230 -
express/notejam/settings.js | 17 -
express/notejam/tests/config.js | 25 -
express/notejam/tests/notes.js | 141 -
express/notejam/tests/pads.js | 138 -
express/notejam/tests/users.js | 106 -
express/notejam/views/error.jade | 6 -
express/notejam/views/layout.jade | 44 -
express/notejam/views/main.jade | 18 -
express/notejam/views/mixins.jade | 13 -
express/notejam/views/notes/create.jade | 19 -
express/notejam/views/notes/delete.jade | 12 -
express/notejam/views/notes/edit.jade | 20 -
express/notejam/views/notes/list.jade | 33 -
express/notejam/views/notes/view.jade | 12 -
express/notejam/views/pads/create.jade | 11 -
express/notejam/views/pads/delete.jade | 11 -
express/notejam/views/pads/edit.jade | 14 -
express/notejam/views/pads/list.jade | 27 -
express/notejam/views/user.jade | 6 -
.../notejam/views/users/forgot-password.jade | 11 -
express/notejam/views/users/settings.jade | 18 -
express/notejam/views/users/signin.jade | 18 -
express/notejam/views/users/signup.jade | 22 -
flask/README.rst | 89 -
flask/db.py | 4 -
flask/notejam/__init__.py | 19 -
flask/notejam/config.py | 24 -
flask/notejam/forms.py | 84 -
flask/notejam/models.py | 66 -
flask/notejam/static/css/style.css | 350 --
flask/notejam/static/css/tables.css | 45 -
flask/notejam/templates/_helpers.html | 11 -
flask/notejam/templates/base.html | 95 -
flask/notejam/templates/notes/create.html | 10 -
flask/notejam/templates/notes/delete.html | 13 -
flask/notejam/templates/notes/edit.html | 11 -
flask/notejam/templates/notes/form.html | 10 -
flask/notejam/templates/notes/list.html | 34 -
flask/notejam/templates/notes/view.html | 14 -
flask/notejam/templates/pads/create.html | 11 -
flask/notejam/templates/pads/delete.html | 17 -
flask/notejam/templates/pads/edit.html | 13 -
flask/notejam/templates/pads/form.html | 9 -
flask/notejam/templates/pads/note_list.html | 26 -
flask/notejam/templates/user.html | 4 -
.../templates/users/forgot_password.html | 14 -
flask/notejam/templates/users/settings.html | 16 -
flask/notejam/templates/users/signin.html | 16 -
flask/notejam/templates/users/signup.html | 16 -
flask/notejam/views.py | 264 --
flask/notejam/wsgi.py | 7 -
flask/requirements.txt | 15 -
flask/runserver.py | 7 -
flask/tests.py | 336 --
html/account-settings.html | 59 -
html/alerts-and-errors.html | 69 -
html/create-pad.html | 72 -
html/create.html | 80 -
html/css/style.css | 400 --
html/delete.html | 70 -
html/edit.html | 78 -
html/empty-list.html | 61 -
html/forgot-password.html | 55 -
html/index.html | 121 -
html/pad-notes.html | 117 -
html/screenshots/1.png | Bin 62464 -> 0 bytes
html/screenshots/1p.png | Bin 21596 -> 0 bytes
html/screenshots/2.png | Bin 96890 -> 0 bytes
html/screenshots/2p.png | Bin 29797 -> 0 bytes
html/screenshots/3.png | Bin 87165 -> 0 bytes
html/screenshots/3p.png | Bin 29489 -> 0 bytes
html/screenshots/4.png | Bin 100665 -> 0 bytes
html/screenshots/5.png | Bin 71944 -> 0 bytes
html/screenshots/6.png | Bin 71209 -> 0 bytes
html/signin.html | 65 -
html/signup.html | 59 -
html/view.html | 78 -
index.html | 0
laravel/README.rst | 90 -
laravel/notejam/.gitattributes | 1 -
laravel/notejam/.gitignore | 8 -
laravel/notejam/app/commands/.gitkeep | 0
laravel/notejam/app/config/app.php | 193 -
laravel/notejam/app/config/auth.php | 71 -
laravel/notejam/app/config/cache.php | 89 -
laravel/notejam/app/config/compile.php | 18 -
laravel/notejam/app/config/database.php | 130 -
laravel/notejam/app/config/local/app.php | 18 -
laravel/notejam/app/config/mail.php | 124 -
laravel/notejam/app/config/packages/.gitkeep | 0
laravel/notejam/app/config/queue.php | 85 -
laravel/notejam/app/config/remote.php | 59 -
laravel/notejam/app/config/session.php | 140 -
laravel/notejam/app/config/testing/cache.php | 20 -
.../notejam/app/config/testing/database.php | 14 -
.../notejam/app/config/testing/session.php | 21 -
laravel/notejam/app/config/view.php | 31 -
laravel/notejam/app/config/workbench.php | 31 -
laravel/notejam/app/controllers/.gitkeep | 0
.../app/controllers/BaseController.php | 28 -
.../app/controllers/NoteController.php | 114 -
.../notejam/app/controllers/PadController.php | 87 -
.../app/controllers/UserController.php | 150 -
.../notejam/app/database/migrations/.gitkeep | 0
.../2014_05_14_215427_create_users_table.php | 34 -
.../2014_05_16_225623_create_pads_table.php | 34 -
.../2014_05_18_180146_create_notes_table.php | 36 -
.../notejam/app/database/production.sqlite | 0
laravel/notejam/app/database/seeds/.gitkeep | 0
.../app/database/seeds/DatabaseSeeder.php | 17 -
laravel/notejam/app/filters.php | 80 -
laravel/notejam/app/lang/en/pagination.php | 20 -
laravel/notejam/app/lang/en/reminders.php | 24 -
laravel/notejam/app/lang/en/validation.php | 104 -
laravel/notejam/app/models/Note.php | 41 -
laravel/notejam/app/models/Pad.php | 26 -
laravel/notejam/app/models/User.php | 85 -
laravel/notejam/app/routes.php | 91 -
laravel/notejam/app/start/artisan.php | 13 -
laravel/notejam/app/start/global.php | 89 -
laravel/notejam/app/start/local.php | 3 -
laravel/notejam/app/storage/.gitignore | 1 -
laravel/notejam/app/storage/cache/.gitignore | 2 -
laravel/notejam/app/storage/logs/.gitignore | 2 -
laravel/notejam/app/storage/meta/.gitignore | 2 -
.../notejam/app/storage/sessions/.gitignore | 2 -
laravel/notejam/app/storage/views/.gitignore | 2 -
laravel/notejam/app/tests/NoteTest.php | 179 -
laravel/notejam/app/tests/PadTest.php | 138 -
laravel/notejam/app/tests/TestCase.php | 36 -
laravel/notejam/app/tests/UserTest.php | 97 -
.../app/views/emails/auth/reminder.blade.php | 13 -
.../app/views/emails/password.blade.php | 4 -
laravel/notejam/app/views/layout.blade.php | 71 -
.../notejam/app/views/note/create.blade.php | 24 -
.../notejam/app/views/note/delete.blade.php | 16 -
laravel/notejam/app/views/note/edit.blade.php | 26 -
.../notejam/app/views/note/index.blade.php | 33 -
laravel/notejam/app/views/note/view.blade.php | 21 -
.../notejam/app/views/pad/create.blade.php | 18 -
.../notejam/app/views/pad/delete.blade.php | 15 -
laravel/notejam/app/views/pad/edit.blade.php | 17 -
laravel/notejam/app/views/pad/view.blade.php | 26 -
.../app/views/partials/error.blade.php | 5 -
laravel/notejam/app/views/user.blade.php | 24 -
.../app/views/user/forgot-password.blade.php | 18 -
.../notejam/app/views/user/settings.blade.php | 22 -
.../notejam/app/views/user/signin.blade.php | 21 -
.../notejam/app/views/user/signup.blade.php | 21 -
laravel/notejam/artisan | 74 -
laravel/notejam/bootstrap/autoload.php | 75 -
laravel/notejam/bootstrap/paths.php | 57 -
laravel/notejam/bootstrap/start.php | 73 -
laravel/notejam/composer.json | 39 -
laravel/notejam/phpunit.xml | 18 -
laravel/notejam/public/.htaccess | 15 -
laravel/notejam/public/css/style.css | 395 --
laravel/notejam/public/favicon.ico | 0
laravel/notejam/public/index.php | 49 -
laravel/notejam/public/packages/.gitkeep | 0
laravel/notejam/public/robots.txt | 2 -
laravel/notejam/server.php | 19 -
nette/doctrine/README.rst | 98 -
nette/doctrine/notejam/.gitignore | 2 -
.../app/Components/ConfirmationControl.php | 71 -
.../Components/ForgottenPasswordControl.php | 136 -
.../notejam/app/Components/NoteControl.php | 172 -
.../notejam/app/Components/PadsControl.php | 129 -
.../Components/PadsList/PadsListControl.php | 60 -
.../app/Components/PadsList/default.latte | 14 -
.../app/Components/SettingsControl.php | 116 -
.../notejam/app/Components/SignInControl.php | 100 -
.../notejam/app/Components/SignUpControl.php | 125 -
.../notejam/app/Presenters/BasePresenter.php | 68 -
.../app/Presenters/Error4xxPresenter.php | 27 -
.../notejam/app/Presenters/ErrorPresenter.php | 58 -
.../notejam/app/Presenters/NotePresenter.php | 252 --
.../notejam/app/Presenters/PadPresenter.php | 223 -
.../notejam/app/Presenters/UserPresenter.php | 145 -
.../app/Presenters/templates/@layout.latte | 70 -
.../app/Presenters/templates/@user.latte | 5 -
.../app/Presenters/templates/Error/403.latte | 7 -
.../app/Presenters/templates/Error/404.latte | 8 -
.../app/Presenters/templates/Error/405.latte | 6 -
.../app/Presenters/templates/Error/410.latte | 6 -
.../app/Presenters/templates/Error/4xx.latte | 4 -
.../app/Presenters/templates/Error/500.phtml | 20 -
.../Presenters/templates/Note/create.latte | 8 -
.../Presenters/templates/Note/default.latte | 36 -
.../Presenters/templates/Note/delete.latte | 9 -
.../Presenters/templates/Note/detail.latte | 10 -
.../app/Presenters/templates/Note/edit.latte | 8 -
.../app/Presenters/templates/Pad/create.latte | 5 -
.../app/Presenters/templates/Pad/delete.latte | 9 -
.../app/Presenters/templates/Pad/detail.latte | 37 -
.../app/Presenters/templates/Pad/edit.latte | 6 -
.../templates/User/forgottenPassword.latte | 10 -
.../Presenters/templates/User/settings.latte | 10 -
.../Presenters/templates/User/signIn.latte | 21 -
.../Presenters/templates/User/signUp.latte | 20 -
nette/doctrine/notejam/app/bootstrap.php | 21 -
.../app/config/config.local.example.neon | 2 -
nette/doctrine/notejam/app/config/config.neon | 42 -
.../doctrine/notejam/app/config/services.neon | 21 -
nette/doctrine/notejam/codeception.yml | 23 -
nette/doctrine/notejam/composer.json | 39 -
nette/doctrine/notejam/composer.lock | 3754 -----------------
nette/doctrine/notejam/log/.gitignore | 2 -
.../src/Notejam/Http/RouterFactory.php | 40 -
.../notejam/src/Notejam/Notes/Note.php | 168 -
.../src/Notejam/Notes/NoteRepository.php | 34 -
.../doctrine/notejam/src/Notejam/Pads/Pad.php | 105 -
.../src/Notejam/Pads/PadRepository.php | 16 -
.../src/Notejam/Templating/RuntimeFilters.php | 31 -
.../notejam/src/Notejam/UI/FormFactory.php | 25 -
.../notejam/src/Notejam/UI/FormRenderer.php | 29 -
.../src/Notejam/Users/Authenticator.php | 49 -
.../notejam/src/Notejam/Users/User.php | 162 -
.../src/Notejam/Users/UserRepository.php | 16 -
.../notejam/src/Notejam/exceptions.php | 22 -
nette/doctrine/notejam/temp/.gitignore | 2 -
nette/doctrine/notejam/tests/_bootstrap.php | 2 -
nette/doctrine/notejam/tests/_data/dump.sql | 46 -
.../doctrine/notejam/tests/_output/.gitignore | 2 -
.../tests/_support/AcceptanceTester.php | 37 -
.../tests/_support/FunctionalTester.php | 26 -
.../tests/_support/Helper/Acceptance.php | 10 -
.../tests/_support/Helper/Functional.php | 10 -
.../notejam/tests/_support/Helper/Unit.php | 10 -
.../notejam/tests/_support/UnitTester.php | 26 -
.../tests/_support/_generated/.gitignore | 2 -
.../notejam/tests/acceptance.suite.yml | 13 -
.../tests/acceptance/CreateNoteCept.php | 10 -
.../tests/acceptance/CreateNoteFailCept.php | 9 -
.../tests/acceptance/CreatePadCept.php | 8 -
.../tests/acceptance/CreatePadFailCept.php | 9 -
.../tests/acceptance/DeleteNoteCept.php | 7 -
.../acceptance/DeleteOtherOwnersNoteCept.php | 6 -
.../acceptance/DeleteOtherOwnersPadCept.php | 6 -
.../tests/acceptance/DeletePadCept.php | 7 -
.../notejam/tests/acceptance/EditNoteCept.php | 12 -
.../tests/acceptance/EditNoteFailCept.php | 11 -
.../acceptance/EditOtherOwnersNoteCept.php | 6 -
.../acceptance/EditOtherOwnersPadCept.php | 6 -
.../notejam/tests/acceptance/EditPadCept.php | 8 -
.../tests/acceptance/EditPadFailCept.php | 9 -
.../acceptance/ForgottenPasswordCept.php | 7 -
.../ForgottenPasswordInvalidEmailCept.php | 7 -
...ForgottenPasswordUnregisteredEmailCept.php | 7 -
.../notejam/tests/acceptance/HomepageCept.php | 8 -
.../tests/acceptance/NoteDetailCept.php | 7 -
.../acceptance/OtherOwnersNoteDetailCept.php | 7 -
.../acceptance/OtherOwnersPadDetailCept.php | 6 -
.../tests/acceptance/PadDetailCept.php | 7 -
.../tests/acceptance/SetNewPasswordCept.php | 10 -
.../acceptance/SetNewPasswordFailCept.php | 11 -
...tNewPasswordInvalidCurrentPasswordCept.php | 10 -
.../acceptance/SetNewPasswordMismatchCept.php | 10 -
.../notejam/tests/acceptance/SignInCept.php | 5 -
.../tests/acceptance/SignInFailCept.php | 10 -
.../acceptance/SignInInvalidEmailCept.php | 5 -
.../acceptance/SignInInvalidPasswordCept.php | 5 -
.../acceptance/SignUpAlreadyExistsCept.php | 10 -
.../notejam/tests/acceptance/SignUpCept.php | 13 -
.../tests/acceptance/SignUpFailCept.php | 11 -
.../acceptance/SignUpInvalidEmailCept.php | 10 -
.../acceptance/SignUpPasswordMismatchCept.php | 10 -
.../notejam/tests/acceptance/_bootstrap.php | 2 -
.../notejam/tests/functional.suite.yml | 11 -
.../notejam/tests/functional/_bootstrap.php | 2 -
nette/doctrine/notejam/tests/unit.suite.yml | 9 -
.../notejam/tests/unit/_bootstrap.php | 2 -
nette/doctrine/notejam/www/.htaccess | 27 -
nette/doctrine/notejam/www/.maintenance.php | 26 -
nette/doctrine/notejam/www/css/style.css | 396 --
nette/doctrine/notejam/www/favicon.ico | Bin 2550 -> 0 bytes
nette/doctrine/notejam/www/index.php | 8 -
nette/doctrine/notejam/www/robots.txt | 0
nette/native_db/notejam/.gitignore | 7 -
nette/native_db/notejam/app/bootstrap.php | 21 -
.../app/components/Notes/INotesFactory.php | 18 -
.../notejam/app/components/Notes/Notes.latte | 24 -
.../notejam/app/components/Notes/Notes.php | 42 -
.../app/components/Pads/IPadsFactory.php | 15 -
.../notejam/app/components/Pads/Pads.latte | 11 -
.../notejam/app/components/Pads/Pads.php | 35 -
.../components/UserBar/IUserBarFactory.php | 14 -
.../app/components/UserBar/UserBar.latte | 5 -
.../app/components/UserBar/UserBar.php | 35 -
.../notejam/app/config/config.example.neon | 3 -
.../native_db/notejam/app/config/config.neon | 45 -
.../Account/AccountSettingsFormFactory.php | 69 -
.../app/forms/Note/DeleteNoteFormFactory.php | 45 -
.../app/forms/Note/EditNoteFormFactory.php | 65 -
.../app/forms/Note/NewNoteFormFactory.php | 68 -
.../app/forms/Pad/DeletePadFormFactory.php | 46 -
.../app/forms/Pad/EditPadFormFactory.php | 49 -
.../app/forms/Pad/NewPadFormFactory.php | 54 -
.../Sign/ForgottenPasswordFormFactory.php | 84 -
.../app/forms/Sign/SignInFormFactory.php | 60 -
.../app/forms/Sign/SignUpFormFactory.php | 65 -
.../notejam/app/helpers/OrderHelper.php | 25 -
.../notejam/app/model/NoteManager.php | 121 -
.../notejam/app/model/PadManager.php | 100 -
.../notejam/app/model/UserManager.php | 123 -
.../app/presenters/AccountPresenter.php | 35 -
.../notejam/app/presenters/BasePresenter.php | 47 -
.../app/presenters/Error4xxPresenter.php | 21 -
.../notejam/app/presenters/ErrorPresenter.php | 42 -
.../app/presenters/HomepagePresenter.php | 51 -
.../notejam/app/presenters/NotePresenter.php | 183 -
.../notejam/app/presenters/PadPresenter.php | 189 -
.../app/presenters/SecuredBasePresenter.php | 20 -
.../notejam/app/presenters/SignPresenter.php | 116 -
.../app/presenters/templates/@layout.latte | 74 -
.../templates/Account/settings.latte | 13 -
.../app/presenters/templates/Error/403.latte | 7 -
.../app/presenters/templates/Error/404.latte | 8 -
.../app/presenters/templates/Error/405.latte | 6 -
.../app/presenters/templates/Error/410.latte | 6 -
.../app/presenters/templates/Error/4xx.latte | 4 -
.../app/presenters/templates/Error/500.phtml | 20 -
.../templates/Homepage/default.latte | 6 -
.../presenters/templates/Note/default.latte | 9 -
.../presenters/templates/Note/delete.latte | 9 -
.../app/presenters/templates/Note/edit.latte | 13 -
.../app/presenters/templates/Note/new.latte | 13 -
.../presenters/templates/Pad/default.latte | 8 -
.../app/presenters/templates/Pad/delete.latte | 9 -
.../app/presenters/templates/Pad/edit.latte | 11 -
.../app/presenters/templates/Pad/new.latte | 9 -
.../presenters/templates/Sign/forgotten.latte | 9 -
.../app/presenters/templates/Sign/in.latte | 13 -
.../app/presenters/templates/Sign/up.latte | 15 -
.../notejam/app/router/RouterFactory.php | 40 -
nette/native_db/notejam/bin/create-db.php | 29 -
nette/native_db/notejam/codeception.yml | 23 -
nette/native_db/notejam/composer.json | 39 -
nette/native_db/notejam/composer.lock | 2697 ------------
nette/native_db/notejam/tests/_bootstrap.php | 2 -
nette/native_db/notejam/tests/_data/dump.sql | 38 -
.../notejam/tests/_output/.gitignore | 2 -
.../tests/_support/AcceptanceTester.php | 36 -
.../tests/_support/FunctionalTester.php | 26 -
.../tests/_support/Helper/Acceptance.php | 10 -
.../tests/_support/Helper/Functional.php | 10 -
.../notejam/tests/_support/Helper/Unit.php | 10 -
.../notejam/tests/_support/UnitTester.php | 26 -
.../tests/_support/_generated/.gitignore | 2 -
.../notejam/tests/acceptance.suite.yml | 13 -
.../tests/acceptance/CreateNoteCept.php | 10 -
.../tests/acceptance/CreateNoteFailCept.php | 9 -
.../tests/acceptance/CreatePadCept.php | 8 -
.../tests/acceptance/CreatePadFailCept.php | 9 -
.../tests/acceptance/DeleteNoteCept.php | 7 -
.../acceptance/DeleteOtherOwnersNoteCept.php | 6 -
.../acceptance/DeleteOtherOwnersPadCept.php | 6 -
.../tests/acceptance/DeletePadCept.php | 7 -
.../notejam/tests/acceptance/EditNoteCept.php | 12 -
.../tests/acceptance/EditNoteFailCept.php | 11 -
.../acceptance/EditOtherOwnersNoteCept.php | 6 -
.../acceptance/EditOtherOwnersPadCept.php | 6 -
.../notejam/tests/acceptance/EditPadCept.php | 8 -
.../tests/acceptance/EditPadFailCept.php | 9 -
.../acceptance/ForgottenPasswordCept.php | 7 -
.../ForgottenPasswordInvalidEmailCept.php | 7 -
...ForgottenPasswordUnregisteredEmailCept.php | 7 -
.../notejam/tests/acceptance/HomepageCept.php | 8 -
.../tests/acceptance/NoteDetailCept.php | 7 -
.../acceptance/OtherOwnersNoteDetailCept.php | 7 -
.../acceptance/OtherOwnersPadDetailCept.php | 6 -
.../tests/acceptance/PadDetailCept.php | 7 -
.../tests/acceptance/SetNewPasswordCept.php | 10 -
.../acceptance/SetNewPasswordFailCept.php | 11 -
...tNewPasswordInvalidCurrentPasswordCept.php | 10 -
.../acceptance/SetNewPasswordMismatchCept.php | 10 -
.../notejam/tests/acceptance/SignInCept.php | 5 -
.../tests/acceptance/SignInFailCept.php | 10 -
.../acceptance/SignInInvalidEmailCept.php | 5 -
.../acceptance/SignInInvalidPasswordCept.php | 5 -
.../acceptance/SignUpAlreadyExistsCept.php | 10 -
.../notejam/tests/acceptance/SignUpCept.php | 13 -
.../tests/acceptance/SignUpFailCept.php | 11 -
.../acceptance/SignUpInvalidEmailCept.php | 10 -
.../acceptance/SignUpPasswordMismatchCept.php | 10 -
.../notejam/tests/acceptance/_bootstrap.php | 2 -
.../notejam/tests/functional.suite.yml | 11 -
.../notejam/tests/functional/_bootstrap.php | 2 -
nette/native_db/notejam/tests/unit.suite.yml | 9 -
.../notejam/tests/unit/_bootstrap.php | 2 -
nette/native_db/notejam/www/.maintenance.php | 26 -
nette/native_db/notejam/www/css/style.css | 395 --
nette/native_db/notejam/www/favicon.ico | Bin 2550 -> 0 bytes
.../native_db/notejam/www/images/spinner.gif | Bin 737 -> 0 bytes
nette/native_db/notejam/www/index.php | 13 -
nette/native_db/notejam/www/js/main.js | 2 -
nette/native_db/notejam/www/robots.txt | 0
nette/native_db/readme.rst | 99 -
padrino/README.rst | 73 -
padrino/notejam/.components | 10 -
padrino/notejam/.gitignore | 9 -
padrino/notejam/Gemfile | 43 -
padrino/notejam/Gemfile.lock | 144 -
padrino/notejam/Rakefile | 6 -
padrino/notejam/admin/app.rb | 43 -
padrino/notejam/admin/controllers/accounts.rb | 90 -
padrino/notejam/admin/controllers/base.rb | 5 -
padrino/notejam/admin/controllers/sessions.rb | 25 -
.../notejam/admin/views/accounts/_form.erb | 57 -
padrino/notejam/admin/views/accounts/edit.erb | 10 -
.../notejam/admin/views/accounts/index.erb | 74 -
padrino/notejam/admin/views/accounts/new.erb | 9 -
padrino/notejam/admin/views/base/index.erb | 15 -
padrino/notejam/admin/views/errors/403.erb | 3 -
padrino/notejam/admin/views/errors/404.erb | 3 -
padrino/notejam/admin/views/errors/500.erb | 3 -
.../admin/views/layouts/application.erb | 64 -
padrino/notejam/admin/views/layouts/error.erb | 23 -
padrino/notejam/admin/views/sessions/new.erb | 44 -
padrino/notejam/app/app.rb | 84 -
padrino/notejam/app/controllers/note.rb | 72 -
padrino/notejam/app/controllers/pad.rb | 56 -
padrino/notejam/app/controllers/user.rb | 79 -
padrino/notejam/app/helpers.rb | 47 -
padrino/notejam/app/helpers/user_helper.rb | 10 -
padrino/notejam/app/mailers.rb | 44 -
padrino/notejam/app/mailers/mailer.rb | 11 -
.../notejam/app/views/layouts/layout.html.erb | 87 -
.../notejam/app/views/layouts/user.html.erb | 63 -
.../mailers/mailer/new_password_email.erb | 5 -
.../notejam/app/views/note/create.html.erb | 18 -
.../notejam/app/views/note/delete.html.erb | 9 -
padrino/notejam/app/views/note/edit.html.erb | 19 -
padrino/notejam/app/views/note/list.html.erb | 27 -
padrino/notejam/app/views/note/view.html.erb | 11 -
padrino/notejam/app/views/pad/create.html.erb | 10 -
padrino/notejam/app/views/pad/delete.html.erb | 8 -
padrino/notejam/app/views/pad/edit.html.erb | 12 -
padrino/notejam/app/views/pad/view.html.erb | 19 -
.../app/views/user/forgot-password.html.erb | 10 -
.../notejam/app/views/user/settings.html.erb | 17 -
.../notejam/app/views/user/signin.html.erb | 14 -
.../notejam/app/views/user/signup.html.erb | 17 -
padrino/notejam/config.ru | 9 -
padrino/notejam/config/apps.rb | 39 -
padrino/notejam/config/boot.rb | 47 -
padrino/notejam/config/database.rb | 40 -
.../notejam/db/migrate/001_create_users.rb | 14 -
padrino/notejam/db/seeds.rb | 28 -
padrino/notejam/models/note.rb | 21 -
padrino/notejam/models/pad.rb | 16 -
padrino/notejam/models/user.rb | 56 -
.../notejam/public/admin/images/favicon.ico | Bin 3784 -> 0 bytes
.../public/admin/images/font/FontAwesome.otf | Bin 61896 -> 0 bytes
.../admin/images/font/fontawesome-webfont.eot | Bin 37405 -> 0 bytes
.../admin/images/font/fontawesome-webfont.svg | 399 --
.../admin/images/font/fontawesome-webfont.ttf | Bin 79076 -> 0 bytes
.../images/font/fontawesome-webfont.woff | Bin 43572 -> 0 bytes
padrino/notejam/public/admin/images/logo.png | Bin 29343 -> 0 bytes
.../public/admin/javascripts/application.js | 118 -
.../admin/javascripts/bootstrap/affix.js | 126 -
.../admin/javascripts/bootstrap/alert.js | 98 -
.../javascripts/bootstrap/bootstrap.min.js | 6 -
.../admin/javascripts/bootstrap/button.js | 109 -
.../admin/javascripts/bootstrap/carousel.js | 217 -
.../admin/javascripts/bootstrap/collapse.js | 179 -
.../admin/javascripts/bootstrap/dropdown.js | 154 -
.../admin/javascripts/bootstrap/modal.js | 246 --
.../admin/javascripts/bootstrap/popover.js | 117 -
.../admin/javascripts/bootstrap/scrollspy.js | 158 -
.../public/admin/javascripts/bootstrap/tab.js | 135 -
.../admin/javascripts/bootstrap/tooltip.js | 386 --
.../admin/javascripts/bootstrap/transition.js | 56 -
.../admin/javascripts/jquery-1.9.0.min.js | 4 -
padrino/notejam/public/favicon.ico | Bin 3784 -> 0 bytes
padrino/notejam/public/stylesheets/style.css | 395 --
.../app/controllers/note_controller_spec.rb | 174 -
.../app/controllers/pad_controller_spec.rb | 140 -
.../app/controllers/user_controller_spec.rb | 79 -
padrino/notejam/spec/spec.rake | 20 -
padrino/notejam/spec/spec_helper.rb | 42 -
spring/pom.xml => pom.xml | 10 +
pyramid/CHANGES.txt | 4 -
pyramid/MANIFEST.in | 2 -
pyramid/README.rst | 81 -
pyramid/README.txt | 14 -
pyramid/development.ini | 75 -
pyramid/notejam/__init__.py | 56 -
pyramid/notejam/forms.py | 91 -
pyramid/notejam/models.py | 106 -
pyramid/notejam/scripts/__init__.py | 1 -
pyramid/notejam/scripts/initializedb.py | 32 -
pyramid/notejam/static/css/base.css | 269 --
pyramid/notejam/static/css/layout.css | 58 -
pyramid/notejam/static/css/skeleton.css | 242 --
pyramid/notejam/static/css/style.css | 350 --
pyramid/notejam/static/css/tables.css | 45 -
pyramid/notejam/static/favicon.ico | Bin 1406 -> 0 bytes
pyramid/notejam/static/footerbg.png | Bin 333 -> 0 bytes
pyramid/notejam/static/headerbg.png | Bin 203 -> 0 bytes
pyramid/notejam/static/ie6.css | 8 -
pyramid/notejam/static/middlebg.png | Bin 2797 -> 0 bytes
pyramid/notejam/static/pylons.css | 372 --
pyramid/notejam/static/pyramid-small.png | Bin 7044 -> 0 bytes
pyramid/notejam/static/pyramid.png | Bin 33055 -> 0 bytes
pyramid/notejam/static/transparent.gif | Bin 49 -> 0 bytes
pyramid/notejam/templates/app_layout.pt | 14 -
pyramid/notejam/templates/base.pt | 69 -
pyramid/notejam/templates/notes/create.pt | 17 -
pyramid/notejam/templates/notes/delete.pt | 22 -
pyramid/notejam/templates/notes/edit.pt | 18 -
pyramid/notejam/templates/notes/list.pt | 31 -
pyramid/notejam/templates/notes/view.pt | 23 -
pyramid/notejam/templates/pads/create.pt | 17 -
pyramid/notejam/templates/pads/delete.pt | 23 -
pyramid/notejam/templates/pads/edit.pt | 18 -
pyramid/notejam/templates/pads/note_list.pt | 30 -
pyramid/notejam/templates/snippets.pt | 37 -
pyramid/notejam/templates/user_layout.pt | 16 -
.../templates/users/forgot_password.pt | 23 -
pyramid/notejam/templates/users/settings.pt | 30 -
pyramid/notejam/templates/users/signin.pt | 27 -
pyramid/notejam/templates/users/signup.pt | 29 -
pyramid/notejam/tests.py | 333 --
pyramid/notejam/views.py | 289 --
pyramid/production.ini | 62 -
pyramid/setup.cfg | 27 -
pyramid/setup.py | 49 -
rubyonrails/README.rst | 83 -
rubyonrails/notejam/.gitignore | 16 -
rubyonrails/notejam/Gemfile | 45 -
rubyonrails/notejam/Gemfile.lock | 150 -
rubyonrails/notejam/README.rdoc | 28 -
rubyonrails/notejam/Rakefile | 6 -
rubyonrails/notejam/app/assets/images/.keep | 0
.../app/assets/javascripts/application.js | 16 -
.../app/assets/javascripts/note.js.coffee | 3 -
.../app/assets/javascripts/pad.js.coffee | 3 -
.../app/assets/javascripts/user.js.coffee | 3 -
.../app/assets/stylesheets/application.css | 13 -
.../notejam/app/assets/stylesheets/base.css | 269 --
.../notejam/app/assets/stylesheets/layout.css | 58 -
.../app/assets/stylesheets/note.css.scss | 3 -
.../app/assets/stylesheets/pad.css.scss | 3 -
.../app/assets/stylesheets/skeleton.css | 242 --
.../notejam/app/assets/stylesheets/style.css | 350 --
.../notejam/app/assets/stylesheets/tables.css | 45 -
.../app/assets/stylesheets/user.css.scss | 3 -
.../app/controllers/application_controller.rb | 35 -
.../app/controllers/notes_controller.rb | 51 -
.../app/controllers/pads_controller.rb | 40 -
.../app/controllers/users_controller.rb | 73 -
.../notejam/app/helpers/application_helper.rb | 11 -
.../notejam/app/helpers/note_helper.rb | 15 -
rubyonrails/notejam/app/helpers/pad_helper.rb | 2 -
.../notejam/app/helpers/user_helper.rb | 2 -
rubyonrails/notejam/app/mailers/.keep | 0
.../notejam/app/mailers/user_mailer.rb | 9 -
rubyonrails/notejam/app/models/.keep | 0
rubyonrails/notejam/app/models/note.rb | 6 -
rubyonrails/notejam/app/models/pad.rb | 5 -
rubyonrails/notejam/app/models/user.rb | 9 -
.../app/views/layouts/application.html.erb | 84 -
.../notejam/app/views/layouts/users.html.erb | 3 -
.../notejam/app/views/notes/create.html.erb | 16 -
.../notejam/app/views/notes/delete.html.erb | 7 -
.../notejam/app/views/notes/edit.html.erb | 16 -
.../notejam/app/views/notes/index.html.erb | 26 -
.../notejam/app/views/notes/show.html.erb | 10 -
.../notejam/app/views/pads/create.html.erb | 9 -
.../notejam/app/views/pads/delete.html.erb | 7 -
.../notejam/app/views/pads/edit.html.erb | 9 -
.../notejam/app/views/pads/show.html.erb | 19 -
.../user_mailer/send_new_password.text.erb | 4 -
.../app/views/users/forgot_password.html.erb | 9 -
.../notejam/app/views/users/settings.html.erb | 16 -
.../notejam/app/views/users/signin.html.erb | 13 -
.../notejam/app/views/users/signup.html.erb | 17 -
rubyonrails/notejam/bin/bundle | 3 -
rubyonrails/notejam/bin/rails | 4 -
rubyonrails/notejam/bin/rake | 4 -
rubyonrails/notejam/config.ru | 4 -
rubyonrails/notejam/config/application.rb | 26 -
rubyonrails/notejam/config/boot.rb | 3 -
rubyonrails/notejam/config/database.yml | 25 -
rubyonrails/notejam/config/environment.rb | 5 -
.../config/environments/development.rb | 41 -
.../notejam/config/environments/production.rb | 79 -
.../notejam/config/environments/test.rb | 42 -
.../notejam/config/initializers/assets.rb | 11 -
.../initializers/backtrace_silencers.rb | 7 -
.../config/initializers/cookies_serializer.rb | 3 -
.../initializers/filter_parameter_logging.rb | 4 -
.../config/initializers/inflections.rb | 16 -
.../notejam/config/initializers/mime_types.rb | 4 -
.../config/initializers/secret_token.rb | 12 -
.../config/initializers/session_store.rb | 3 -
.../config/initializers/wrap_parameters.rb | 14 -
rubyonrails/notejam/config/locales/en.yml | 23 -
rubyonrails/notejam/config/routes.rb | 94 -
rubyonrails/notejam/config/secrets.yml | 22 -
.../db/migrate/20140409143934_create_users.rb | 10 -
.../db/migrate/20140414192524_create_pads.rb | 10 -
.../db/migrate/20140418215526_create_notes.rb | 12 -
rubyonrails/notejam/db/schema.rb | 44 -
rubyonrails/notejam/db/seeds.rb | 7 -
rubyonrails/notejam/log/.keep | 0
rubyonrails/notejam/public/404.html | 58 -
rubyonrails/notejam/public/422.html | 58 -
rubyonrails/notejam/public/500.html | 57 -
rubyonrails/notejam/public/favicon.ico | 0
rubyonrails/notejam/public/robots.txt | 5 -
rubyonrails/notejam/test/controllers/.keep | 0
.../test/controllers/notes_controller_test.rb | 90 -
.../test/controllers/pads_controller_test.rb | 74 -
.../test/controllers/users_controller_test.rb | 61 -
rubyonrails/notejam/test/fixtures/.keep | 0
rubyonrails/notejam/test/fixtures/notes.yml | 4 -
rubyonrails/notejam/test/fixtures/pads.yml | 3 -
rubyonrails/notejam/test/fixtures/users.yml | 7 -
rubyonrails/notejam/test/helpers/.keep | 0
.../notejam/test/helpers/note_helper_test.rb | 4 -
.../notejam/test/helpers/pad_helper_test.rb | 4 -
.../notejam/test/helpers/user_helper_test.rb | 4 -
rubyonrails/notejam/test/integration/.keep | 0
rubyonrails/notejam/test/mailers/.keep | 0
.../notejam/test/mailers/user_mailer_test.rb | 7 -
rubyonrails/notejam/test/models/.keep | 0
rubyonrails/notejam/test/models/note_test.rb | 7 -
rubyonrails/notejam/test/models/pad_test.rb | 7 -
rubyonrails/notejam/test/models/user_test.rb | 7 -
rubyonrails/notejam/test/test_helper.rb | 18 -
.../notejam/vendor/assets/javascripts/.keep | 0
.../notejam/vendor/assets/stylesheets/.keep | 0
screenshots.rst | 46 -
spring/.gitignore | 3 -
spring/README.rst | 103 -
.../resources/application-test.properties | 1 -
.../java/net/notejam/spring/Application.java | 0
.../java/net/notejam/spring/URITemplates.java | 0
.../spring/error/ForcedErrorController.java | 0
.../error/ResourceNotFoundException.java | 0
.../error/UnsupportedLocaleException.java | 0
.../notejam/spring/error/package-info.java | 0
.../converter/StringToPeriodConverter.java | 0
.../spring/helper/converter/package-info.java | 0
.../spring/helper/reflection/Annotated.java | 0
.../helper/reflection/ReflectionUtils.java | 0
.../helper/reflection/package-info.java | 0
.../java/net/notejam/spring/note/Note.java | 0
.../notejam/spring/note/NoteRepository.java | 0
.../net/notejam/spring/note/NoteService.java | 0
.../note/controller/AllNotesController.java | 0
.../note/controller/CreateNoteController.java | 0
.../note/controller/DeleteNoteController.java | 0
.../note/controller/EditNoteController.java | 0
.../note/controller/ViewNoteController.java | 0
.../spring/note/controller/package-info.java | 0
.../net/notejam/spring/note/package-info.java | 0
.../java/net/notejam/spring/package-info.java | 0
.../main/java/net/notejam/spring/pad/Pad.java | 0
.../net/notejam/spring/pad/PadRepository.java | 0
.../net/notejam/spring/pad/PadService.java | 0
.../pad/controller/CreatePadController.java | 0
.../pad/controller/DeletePadController.java | 0
.../pad/controller/EditPadController.java | 0
.../spring/pad/controller/PadsAdvice.java | 0
.../controller/ViewPadNotesController.java | 0
.../spring/pad/controller/package-info.java | 0
.../net/notejam/spring/pad/package-info.java | 0
.../spring/security/LoginController.java | 0
.../security/SecurityConfiguration.java | 0
.../spring/security/SecurityService.java | 0
.../security/UserDetailsServiceImpl.java | 0
.../notejam/spring/security/owner/Owned.java | 0
.../spring/security/owner/PermitOwner.java | 0
.../security/owner/PermitOwnerAspect.java | 0
.../spring/security/owner/package-info.java | 0
.../notejam/spring/security/package-info.java | 0
.../java/net/notejam/spring/user/User.java | 0
.../notejam/spring/user/UserRepository.java | 0
.../net/notejam/spring/user/UserService.java | 0
.../notejam/spring/user/account/Account.java | 0
.../user/account/AccountController.java | 0
.../account/constraints/CurrentPassword.java | 0
.../constraints/CurrentPasswordValidator.java | 0
.../account/constraints/package-info.java | 0
.../spring/user/account/package-info.java | 0
.../spring/user/constraints/Password.java | 0
.../spring/user/constraints/package-info.java | 0
.../spring/user/forgot/ForgotPassword.java | 0
.../user/forgot/ForgotPasswordController.java | 0
.../user/forgot/InvalidTokenException.java | 0
.../user/forgot/PasswordRecoveryService.java | 0
.../forgot/RecoverPasswordController.java | 0
.../spring/user/forgot/RecoveryToken.java | 0
.../user/forgot/RecoveryTokenRepository.java | 0
.../spring/user/forgot/package-info.java | 0
.../net/notejam/spring/user/package-info.java | 0
.../notejam/spring/user/signup/Signup.java | 0
.../spring/user/signup/SignupController.java | 0
.../user/signup/constraints/UniqueEmail.java | 0
.../constraints/UniqueEmailValidator.java | 0
.../user/signup/constraints/package-info.java | 0
.../spring/user/signup/package-info.java | 0
.../spring/view/ViewConfiguration.java | 0
.../dialect/NaturalLanguageDateProcessor.java | 0
.../view/dialect/NoteTextProcessor.java | 0
.../spring/view/dialect/NotejamDialect.java | 0
.../spring/view/dialect/ProcessorUtil.java | 0
.../spring/view/dialect/package-info.java | 0
.../net/notejam/spring/view/package-info.java | 0
.../main/resources/application.properties | 13 +-
.../main/resources/messages_de.properties | 0
.../main/resources/messages_en.properties | 0
.../main/resources/static/css/style.css | 0
.../main/resources/templates/error.html | 0
.../main/resources/templates/layout.html | 0
.../main/resources/templates/note/create.html | 0
.../main/resources/templates/note/delete.html | 0
.../main/resources/templates/note/edit.html | 0
.../main/resources/templates/note/view.html | 0
.../main/resources/templates/notes.html | 0
.../main/resources/templates/pad/create.html | 0
.../main/resources/templates/pad/delete.html | 0
.../main/resources/templates/pad/edit.html | 0
.../resources/templates/user/account.html | 0
.../templates/user/forgot-password.html | 0
.../main/resources/templates/user/login.html | 0
.../templates/user/reveal-password.html | 0
.../main/resources/templates/user/signup.html | 0
.../StringToPeriodConverterTest.java | 0
.../spring/note/CreateNoteControllerTest.java | 0
.../spring/note/DeleteNoteControllerTest.java | 0
.../spring/note/EditNoteControllerTest.java | 0
.../notejam/spring/note/NoteServiceTest.java | 0
.../spring/note/ViewNoteControllerTest.java | 0
.../spring/pad/CreatePadControllerTest.java | 0
.../spring/pad/DeletePadControllerTest.java | 0
.../spring/pad/EditPadControllerTest.java | 0
.../spring/pad/ViewPadControllerTest.java | 0
.../spring/security/LoginControllerTest.java | 0
.../spring/security/SecurityServiceTest.java | 0
.../security/owner/PermitOwnerAspectTest.java | 0
.../owner/PermitOwnerIntegrationTest.java | 0
.../notejam/spring/test/IntegrationTest.java | 0
.../notejam/spring/test/MockMvcProvider.java | 0
.../java/net/notejam/spring/test/UriUtil.java | 0
.../spring/user/SignedUpUserProvider.java | 0
.../notejam/spring/user/UserServiceTest.java | 0
.../user/signup/SignupControllerTest.java | 0
.../resources/application-test.properties | 3 +
symfony/README.rst | 90 -
symfony/notejam/.gitignore | 11 -
symfony/notejam/.travis.yml | 10 -
symfony/notejam/LICENSE | 19 -
symfony/notejam/app/.htaccess | 1 -
symfony/notejam/app/AppCache.php | 9 -
symfony/notejam/app/AppKernel.php | 43 -
.../Resources/translations/messages.fr.xlf | 11 -
.../app/Resources/views/base.html.twig | 75 -
.../app/Resources/views/fields.html.twig | 13 -
.../app/Resources/views/user.html.twig | 5 -
symfony/notejam/app/SymfonyRequirements.php | 764 ----
symfony/notejam/app/autoload.php | 13 -
symfony/notejam/app/cache/.gitkeep | 0
symfony/notejam/app/check.php | 142 -
symfony/notejam/app/config/config.yml | 72 -
symfony/notejam/app/config/config_dev.yml | 31 -
symfony/notejam/app/config/config_prod.yml | 23 -
symfony/notejam/app/config/config_test.yml | 33 -
symfony/notejam/app/config/parameters.yml | 14 -
.../notejam/app/config/parameters.yml.dist | 15 -
symfony/notejam/app/config/routing.yml | 7 -
symfony/notejam/app/config/routing_dev.yml | 14 -
symfony/notejam/app/config/security.yml | 44 -
symfony/notejam/app/config/services.yml | 15 -
symfony/notejam/app/console | 27 -
symfony/notejam/app/logs/.gitkeep | 0
symfony/notejam/app/phpunit.xml.dist | 42 -
symfony/notejam/composer.json | 57 -
symfony/notejam/composer.lock | 2725 ------------
symfony/notejam/src/.htaccess | 1 -
symfony/notejam/src/AppBundle/AppBundle.php | 13 -
.../AppBundle/Controller/NoteController.php | 176 -
.../AppBundle/Controller/PadController.php | 175 -
.../AppBundle/Controller/UserController.php | 211 -
symfony/notejam/src/AppBundle/Entity/Note.php | 194 -
symfony/notejam/src/AppBundle/Entity/Pad.php | 119 -
symfony/notejam/src/AppBundle/Entity/User.php | 238 --
.../Form/Type/ChangePasswordType.php | 43 -
.../src/AppBundle/Form/Type/NoteType.php | 57 -
.../src/AppBundle/Form/Type/PadType.php | 40 -
.../src/AppBundle/Form/Type/UserType.php | 54 -
.../AppBundle/Repository/NoteRepository.php | 14 -
.../AppBundle/Repository/PadRepository.php | 14 -
.../Resources/views/Note/create.html.twig | 23 -
.../Resources/views/Note/delete.html.twig | 13 -
.../Resources/views/Note/edit.html.twig | 24 -
.../Resources/views/Note/list.html.twig | 32 -
.../Resources/views/Note/view.html.twig | 13 -
.../Resources/views/Pad/create.html.twig | 14 -
.../Resources/views/Pad/delete.html.twig | 12 -
.../Resources/views/Pad/edit.html.twig | 15 -
.../Resources/views/Pad/list.html.twig | 16 -
.../Resources/views/Pad/notes.html.twig | 35 -
.../views/User/forgot-password.html.twig | 15 -
.../Resources/views/User/index.html.twig | 4 -
.../Resources/views/User/settings.html.twig | 22 -
.../Resources/views/User/signin.html.twig | 22 -
.../Resources/views/User/signup.html.twig | 23 -
.../Tests/Controller/NoteControllerTest.php | 40 -
.../Tests/Controller/PadControllerTest.php | 183 -
symfony/notejam/web/.htaccess | 52 -
symfony/notejam/web/app.php | 25 -
symfony/notejam/web/app_dev.php | 30 -
symfony/notejam/web/apple-touch-icon.png | Bin 10784 -> 0 bytes
symfony/notejam/web/config.php | 124 -
symfony/notejam/web/css/style.css | 396 --
symfony/notejam/web/favicon.ico | Bin 1150 -> 0 bytes
symfony/notejam/web/robots.txt | 4 -
.../fixtures.us-east-2.tfvars | 123 -
.../terraform-aws-ecs-codepipeline/main.tf | 110 -
.../terraform-aws-ecs-codepipeline/outputs.tf | 150 -
.../variables.tf | 237 --
.../versions.tf | 11 -
.../fixtures.us-east-2.tfvars | 96 -
.../main.tf | 99 -
.../outputs.tf | 105 -
.../variables.tf | 204 -
.../versions.tf | 8 -
yii/README.rst | 91 -
yii/notejam/.gitignore | 27 -
yii/notejam/assets/AppAsset.php | 19 -
yii/notejam/codeception.yml | 19 -
yii/notejam/composer.json | 53 -
yii/notejam/composer.lock | 2640 ------------
yii/notejam/config/db.php | 9 -
yii/notejam/config/params.php | 6 -
yii/notejam/config/web.php | 81 -
yii/notejam/controllers/BaseController.php | 26 -
yii/notejam/controllers/NoteController.php | 145 -
yii/notejam/controllers/PadController.php | 115 -
yii/notejam/controllers/UserController.php | 126 -
yii/notejam/mail/layouts/html.php | 22 -
yii/notejam/mail/password.php | 5 -
.../m140804_111205_create_tables.php | 38 -
yii/notejam/models/ChangePassword.php | 57 -
yii/notejam/models/ForgotPassword.php | 74 -
yii/notejam/models/LoginForm.php | 75 -
yii/notejam/models/Note.php | 97 -
yii/notejam/models/Pad.php | 53 -
yii/notejam/models/SigninForm.php | 76 -
yii/notejam/models/SignupForm.php | 53 -
yii/notejam/models/User.php | 127 -
yii/notejam/requirements.php | 102 -
yii/notejam/runtime/.gitignore | 2 -
yii/notejam/tests/.gitignore | 4 -
yii/notejam/tests/README.md | 33 -
yii/notejam/tests/_bootstrap.php | 23 -
yii/notejam/tests/_config.php | 14 -
yii/notejam/tests/_console_bootstrap.php | 12 -
yii/notejam/tests/_data/dump.sql | 31 -
yii/notejam/tests/_log/.gitignore | 2 -
yii/notejam/tests/_pages/CreateNotePage.php | 19 -
yii/notejam/tests/_pages/CreatePadPage.php | 17 -
yii/notejam/tests/_pages/DeleteNotePage.php | 22 -
yii/notejam/tests/_pages/DeletePadPage.php | 21 -
yii/notejam/tests/_pages/EditNotePage.php | 24 -
yii/notejam/tests/_pages/EditPadPage.php | 21 -
yii/notejam/tests/_pages/SignedInPage.php | 31 -
yii/notejam/tests/_pages/SigninPage.php | 24 -
yii/notejam/tests/_pages/SignupPage.php | 25 -
yii/notejam/tests/_pages/ViewNotePage.php | 10 -
yii/notejam/tests/_pages/ViewPadPage.php | 9 -
yii/notejam/tests/acceptance.suite.yml | 26 -
yii/notejam/tests/acceptance/_bootstrap.php | 3 -
yii/notejam/tests/acceptance/_config.php | 13 -
yii/notejam/tests/acceptance/_console.php | 13 -
yii/notejam/tests/acceptance/yii | 17 -
yii/notejam/tests/acceptance/yii.bat | 20 -
yii/notejam/tests/functional.suite.yml | 28 -
.../tests/functional/CreateNoteCept.php | 29 -
.../tests/functional/CreatePadCept.php | 19 -
.../tests/functional/DeleteNoteCept.php | 17 -
.../tests/functional/DeletePadCept.php | 16 -
yii/notejam/tests/functional/EditNoteCept.php | 28 -
yii/notejam/tests/functional/EditPadCept.php | 25 -
yii/notejam/tests/functional/SigninCept.php | 23 -
yii/notejam/tests/functional/SignupCept.php | 37 -
yii/notejam/tests/functional/ViewNoteCept.php | 16 -
yii/notejam/tests/functional/ViewPadCept.php | 16 -
yii/notejam/tests/functional/_bootstrap.php | 3 -
yii/notejam/tests/functional/_config.php | 17 -
yii/notejam/tests/functional/_console.php | 13 -
yii/notejam/tests/functional/yii | 17 -
yii/notejam/tests/functional/yii.bat | 20 -
yii/notejam/tests/unit.suite.yml | 6 -
yii/notejam/tests/unit/_bootstrap.php | 3 -
yii/notejam/tests/unit/_config.php | 13 -
yii/notejam/tests/unit/_console.php | 13 -
yii/notejam/tests/unit/fixtures/.gitkeep | 0
yii/notejam/tests/unit/fixtures/data/.gitkeep | 0
.../tests/unit/templates/fixtures/.gitkeep | 0
yii/notejam/tests/unit/yii | 17 -
yii/notejam/tests/unit/yii.bat | 20 -
yii/notejam/views/layouts/app.php | 37 -
yii/notejam/views/layouts/base.php | 68 -
yii/notejam/views/layouts/user.php | 16 -
yii/notejam/views/note/create.php | 5 -
yii/notejam/views/note/delete.php | 16 -
yii/notejam/views/note/edit.php | 5 -
yii/notejam/views/note/error.php | 22 -
yii/notejam/views/note/form.php | 29 -
yii/notejam/views/note/list.php | 30 -
yii/notejam/views/note/view.php | 14 -
yii/notejam/views/pad/create.php | 5 -
yii/notejam/views/pad/delete.php | 15 -
yii/notejam/views/pad/edit.php | 5 -
yii/notejam/views/pad/form.php | 23 -
yii/notejam/views/pad/view.php | 25 -
yii/notejam/views/partials/errors.php | 9 -
yii/notejam/views/user/forgot-password.php | 21 -
yii/notejam/views/user/settings.php | 28 -
yii/notejam/views/user/signin.php | 27 -
yii/notejam/views/user/signup.php | 28 -
yii/notejam/web/assets/.gitignore | 2 -
yii/notejam/web/css/site.css | 91 -
yii/notejam/web/css/style.css | 397 --
yii/notejam/web/favicon.ico | Bin 318 -> 0 bytes
yii/notejam/web/index-test.php | 16 -
yii/notejam/web/index.php | 12 -
yii/notejam/web/robots.txt | 2 -
yii/notejam/yii | 24 -
yii/notejam/yii.bat | 20 -
1089 files changed, 175 insertions(+), 54446 deletions(-)
create mode 100644 .github/workflows/ci-notejam.yml
delete mode 100644 CA_TECH
create mode 100644 Dockerfile
delete mode 100644 cakephp/README.rst
delete mode 100644 cakephp/notejam/.editorconfig
delete mode 100644 cakephp/notejam/.gitattributes
delete mode 100644 cakephp/notejam/.gitignore
delete mode 100644 cakephp/notejam/.htaccess
delete mode 100644 cakephp/notejam/.travis.yml
delete mode 100755 cakephp/notejam/bin/cake
delete mode 100644 cakephp/notejam/bin/cake.bat
delete mode 100644 cakephp/notejam/bin/cake.php
delete mode 100644 cakephp/notejam/composer.json
delete mode 100644 cakephp/notejam/config/Migrations/20150928200943_initial.php
delete mode 100644 cakephp/notejam/config/app.default.php
delete mode 100644 cakephp/notejam/config/app.php
delete mode 100644 cakephp/notejam/config/bootstrap.php
delete mode 100644 cakephp/notejam/config/bootstrap_cli.php
delete mode 100644 cakephp/notejam/config/paths.php
delete mode 100644 cakephp/notejam/config/routes.php
delete mode 100644 cakephp/notejam/config/schema/i18n.sql
delete mode 100644 cakephp/notejam/config/schema/sessions.sql
delete mode 100644 cakephp/notejam/index.php
delete mode 100644 cakephp/notejam/phpunit.xml.dist
delete mode 100644 cakephp/notejam/src/Console/Installer.php
delete mode 100644 cakephp/notejam/src/Controller/AppController.php
delete mode 100644 cakephp/notejam/src/Controller/NotesController.php
delete mode 100644 cakephp/notejam/src/Controller/PadsController.php
delete mode 100644 cakephp/notejam/src/Controller/UsersController.php
delete mode 100644 cakephp/notejam/src/Form/ForgotPasswordForm.php
delete mode 100644 cakephp/notejam/src/Form/SettingsForm.php
delete mode 100644 cakephp/notejam/src/Model/Entity/Note.php
delete mode 100644 cakephp/notejam/src/Model/Entity/Pad.php
delete mode 100644 cakephp/notejam/src/Model/Entity/User.php
delete mode 100644 cakephp/notejam/src/Model/Table/NotesTable.php
delete mode 100644 cakephp/notejam/src/Model/Table/PadsTable.php
delete mode 100644 cakephp/notejam/src/Model/Table/UsersTable.php
delete mode 100644 cakephp/notejam/src/Shell/ConsoleShell.php
delete mode 100644 cakephp/notejam/src/Template/Cell/Pads/display.ctp
delete mode 100644 cakephp/notejam/src/Template/Element/Flash/default.ctp
delete mode 100644 cakephp/notejam/src/Template/Element/Flash/error.ctp
delete mode 100644 cakephp/notejam/src/Template/Element/Flash/success.ctp
delete mode 100644 cakephp/notejam/src/Template/Element/notes/form.ctp
delete mode 100644 cakephp/notejam/src/Template/Element/pads/form.ctp
delete mode 100644 cakephp/notejam/src/Template/Email/html/default.ctp
delete mode 100644 cakephp/notejam/src/Template/Email/text/default.ctp
delete mode 100644 cakephp/notejam/src/Template/Error/error400.ctp
delete mode 100644 cakephp/notejam/src/Template/Error/error500.ctp
delete mode 100644 cakephp/notejam/src/Template/Layout/Email/html/default.ctp
delete mode 100644 cakephp/notejam/src/Template/Layout/Email/text/default.ctp
delete mode 100644 cakephp/notejam/src/Template/Layout/ajax.ctp
delete mode 100644 cakephp/notejam/src/Template/Layout/anonymous.ctp
delete mode 100644 cakephp/notejam/src/Template/Layout/default.ctp
delete mode 100644 cakephp/notejam/src/Template/Layout/error.ctp
delete mode 100644 cakephp/notejam/src/Template/Layout/rss/default.ctp
delete mode 100644 cakephp/notejam/src/Template/Layout/user.ctp
delete mode 100644 cakephp/notejam/src/Template/Notes/create.ctp
delete mode 100644 cakephp/notejam/src/Template/Notes/delete.ctp
delete mode 100644 cakephp/notejam/src/Template/Notes/edit.ctp
delete mode 100644 cakephp/notejam/src/Template/Notes/index.ctp
delete mode 100644 cakephp/notejam/src/Template/Notes/view.ctp
delete mode 100644 cakephp/notejam/src/Template/Pads/create.ctp
delete mode 100644 cakephp/notejam/src/Template/Pads/delete.ctp
delete mode 100644 cakephp/notejam/src/Template/Pads/edit.ctp
delete mode 100644 cakephp/notejam/src/Template/Pads/view.ctp
delete mode 100644 cakephp/notejam/src/Template/Users/forgotpassword.ctp
delete mode 100644 cakephp/notejam/src/Template/Users/index.ctp
delete mode 100644 cakephp/notejam/src/Template/Users/settings.ctp
delete mode 100644 cakephp/notejam/src/Template/Users/signin.ctp
delete mode 100644 cakephp/notejam/src/Template/Users/signup.ctp
delete mode 100644 cakephp/notejam/src/View/AppView.php
delete mode 100644 cakephp/notejam/src/View/Cell/PadsCell.php
delete mode 100644 cakephp/notejam/tests/Fixture/NotesFixture.php
delete mode 100644 cakephp/notejam/tests/Fixture/PadsFixture.php
delete mode 100644 cakephp/notejam/tests/Fixture/UsersFixture.php
delete mode 100644 cakephp/notejam/tests/TestCase/Controller/NotesControllerTest.php
delete mode 100644 cakephp/notejam/tests/TestCase/Controller/PadsControllerTest.php
delete mode 100644 cakephp/notejam/tests/TestCase/Controller/UsersControllerTest.php
delete mode 100644 cakephp/notejam/tests/TestCase/NotejamTestCase.php
delete mode 100644 cakephp/notejam/tests/bootstrap.php
delete mode 100644 cakephp/notejam/webroot/.htaccess
delete mode 100644 cakephp/notejam/webroot/css/style.css
delete mode 100644 cakephp/notejam/webroot/favicon.ico
delete mode 100644 cakephp/notejam/webroot/img/cake.icon.png
delete mode 100644 cakephp/notejam/webroot/img/cake.power.gif
delete mode 100644 cakephp/notejam/webroot/index.php
delete mode 100644 cakephp/notejam/webroot/js/empty
delete mode 100644 contribute.rst
delete mode 100644 django/README.rst
delete mode 100755 django/notejam/manage.py
delete mode 100644 django/notejam/notejam/__init__.py
delete mode 100644 django/notejam/notejam/settings.py
delete mode 100644 django/notejam/notejam/tests.py
delete mode 100644 django/notejam/notejam/urls.py
delete mode 100644 django/notejam/notejam/wsgi.py
delete mode 100644 django/notejam/notes/__init__.py
delete mode 100644 django/notejam/notes/forms.py
delete mode 100644 django/notejam/notes/migrations/0001_initial.py
delete mode 100644 django/notejam/notes/migrations/__init__.py
delete mode 100644 django/notejam/notes/models.py
delete mode 100644 django/notejam/notes/templates/notes/note_confirm_delete.html
delete mode 100644 django/notejam/notes/templates/notes/note_create.html
delete mode 100644 django/notejam/notes/templates/notes/note_detail.html
delete mode 100644 django/notejam/notes/templates/notes/note_edit.html
delete mode 100644 django/notejam/notes/templates/notes/note_form.html
delete mode 100644 django/notejam/notes/templates/notes/note_list.html
delete mode 100644 django/notejam/notes/templatetags/__init__.py
delete mode 100644 django/notejam/notes/templatetags/date_tags.py
delete mode 100644 django/notejam/notes/tests.py
delete mode 100644 django/notejam/notes/urls.py
delete mode 100644 django/notejam/notes/views.py
delete mode 100644 django/notejam/pads/__init__.py
delete mode 100644 django/notejam/pads/forms.py
delete mode 100644 django/notejam/pads/migrations/0001_initial.py
delete mode 100644 django/notejam/pads/migrations/__init__.py
delete mode 100644 django/notejam/pads/models.py
delete mode 100644 django/notejam/pads/templates/pads/pad_confirm_delete.html
delete mode 100644 django/notejam/pads/templates/pads/pad_create.html
delete mode 100644 django/notejam/pads/templates/pads/pad_edit.html
delete mode 100644 django/notejam/pads/templates/pads/pad_form.html
delete mode 100644 django/notejam/pads/templates/pads/pad_note_list.html
delete mode 100644 django/notejam/pads/templatetags/__init__.py
delete mode 100644 django/notejam/pads/templatetags/pad_tags.py
delete mode 100644 django/notejam/pads/tests.py
delete mode 100644 django/notejam/pads/urls.py
delete mode 100644 django/notejam/pads/views.py
delete mode 100644 django/notejam/static_files/css/style.css
delete mode 100644 django/notejam/templates/404.html
delete mode 100644 django/notejam/templates/base.html
delete mode 100644 django/notejam/templates/user.html
delete mode 100644 django/notejam/users/__init__.py
delete mode 100644 django/notejam/users/auth_backends.py
delete mode 100644 django/notejam/users/forms.py
delete mode 100644 django/notejam/users/models.py
delete mode 100644 django/notejam/users/templates/forgot_password.html
delete mode 100644 django/notejam/users/templates/settings.html
delete mode 100644 django/notejam/users/templates/signin.html
delete mode 100644 django/notejam/users/templates/signup.html
delete mode 100644 django/notejam/users/tests.py
delete mode 100644 django/notejam/users/views.py
delete mode 100644 django/requirements.txt
delete mode 100644 express/README.rst
delete mode 100644 express/notejam/app.js
delete mode 100755 express/notejam/bin/www
delete mode 100644 express/notejam/db.js
delete mode 100644 express/notejam/helpers.js
delete mode 100644 express/notejam/models.js
delete mode 100644 express/notejam/package.json
delete mode 100644 express/notejam/public/stylesheets/style.css
delete mode 100644 express/notejam/routes/notes.js
delete mode 100644 express/notejam/routes/pads.js
delete mode 100644 express/notejam/routes/users.js
delete mode 100644 express/notejam/settings.js
delete mode 100644 express/notejam/tests/config.js
delete mode 100644 express/notejam/tests/notes.js
delete mode 100644 express/notejam/tests/pads.js
delete mode 100644 express/notejam/tests/users.js
delete mode 100644 express/notejam/views/error.jade
delete mode 100644 express/notejam/views/layout.jade
delete mode 100644 express/notejam/views/main.jade
delete mode 100644 express/notejam/views/mixins.jade
delete mode 100644 express/notejam/views/notes/create.jade
delete mode 100644 express/notejam/views/notes/delete.jade
delete mode 100644 express/notejam/views/notes/edit.jade
delete mode 100644 express/notejam/views/notes/list.jade
delete mode 100644 express/notejam/views/notes/view.jade
delete mode 100644 express/notejam/views/pads/create.jade
delete mode 100644 express/notejam/views/pads/delete.jade
delete mode 100644 express/notejam/views/pads/edit.jade
delete mode 100644 express/notejam/views/pads/list.jade
delete mode 100644 express/notejam/views/user.jade
delete mode 100644 express/notejam/views/users/forgot-password.jade
delete mode 100644 express/notejam/views/users/settings.jade
delete mode 100644 express/notejam/views/users/signin.jade
delete mode 100644 express/notejam/views/users/signup.jade
delete mode 100644 flask/README.rst
delete mode 100644 flask/db.py
delete mode 100644 flask/notejam/__init__.py
delete mode 100644 flask/notejam/config.py
delete mode 100644 flask/notejam/forms.py
delete mode 100755 flask/notejam/models.py
delete mode 100644 flask/notejam/static/css/style.css
delete mode 100644 flask/notejam/static/css/tables.css
delete mode 100644 flask/notejam/templates/_helpers.html
delete mode 100644 flask/notejam/templates/base.html
delete mode 100644 flask/notejam/templates/notes/create.html
delete mode 100644 flask/notejam/templates/notes/delete.html
delete mode 100644 flask/notejam/templates/notes/edit.html
delete mode 100644 flask/notejam/templates/notes/form.html
delete mode 100644 flask/notejam/templates/notes/list.html
delete mode 100644 flask/notejam/templates/notes/view.html
delete mode 100644 flask/notejam/templates/pads/create.html
delete mode 100644 flask/notejam/templates/pads/delete.html
delete mode 100644 flask/notejam/templates/pads/edit.html
delete mode 100644 flask/notejam/templates/pads/form.html
delete mode 100644 flask/notejam/templates/pads/note_list.html
delete mode 100644 flask/notejam/templates/user.html
delete mode 100644 flask/notejam/templates/users/forgot_password.html
delete mode 100644 flask/notejam/templates/users/settings.html
delete mode 100644 flask/notejam/templates/users/signin.html
delete mode 100644 flask/notejam/templates/users/signup.html
delete mode 100644 flask/notejam/views.py
delete mode 100644 flask/notejam/wsgi.py
delete mode 100644 flask/requirements.txt
delete mode 100755 flask/runserver.py
delete mode 100644 flask/tests.py
delete mode 100644 html/account-settings.html
delete mode 100644 html/alerts-and-errors.html
delete mode 100644 html/create-pad.html
delete mode 100644 html/create.html
delete mode 100644 html/css/style.css
delete mode 100644 html/delete.html
delete mode 100644 html/edit.html
delete mode 100644 html/empty-list.html
delete mode 100644 html/forgot-password.html
delete mode 100644 html/index.html
delete mode 100644 html/pad-notes.html
delete mode 100644 html/screenshots/1.png
delete mode 100644 html/screenshots/1p.png
delete mode 100644 html/screenshots/2.png
delete mode 100644 html/screenshots/2p.png
delete mode 100644 html/screenshots/3.png
delete mode 100644 html/screenshots/3p.png
delete mode 100644 html/screenshots/4.png
delete mode 100644 html/screenshots/5.png
delete mode 100644 html/screenshots/6.png
delete mode 100644 html/signin.html
delete mode 100644 html/signup.html
delete mode 100644 html/view.html
delete mode 100644 index.html
delete mode 100644 laravel/README.rst
delete mode 100644 laravel/notejam/.gitattributes
delete mode 100644 laravel/notejam/.gitignore
delete mode 100644 laravel/notejam/app/commands/.gitkeep
delete mode 100644 laravel/notejam/app/config/app.php
delete mode 100644 laravel/notejam/app/config/auth.php
delete mode 100644 laravel/notejam/app/config/cache.php
delete mode 100644 laravel/notejam/app/config/compile.php
delete mode 100644 laravel/notejam/app/config/database.php
delete mode 100644 laravel/notejam/app/config/local/app.php
delete mode 100644 laravel/notejam/app/config/mail.php
delete mode 100644 laravel/notejam/app/config/packages/.gitkeep
delete mode 100644 laravel/notejam/app/config/queue.php
delete mode 100644 laravel/notejam/app/config/remote.php
delete mode 100644 laravel/notejam/app/config/session.php
delete mode 100644 laravel/notejam/app/config/testing/cache.php
delete mode 100644 laravel/notejam/app/config/testing/database.php
delete mode 100644 laravel/notejam/app/config/testing/session.php
delete mode 100644 laravel/notejam/app/config/view.php
delete mode 100644 laravel/notejam/app/config/workbench.php
delete mode 100644 laravel/notejam/app/controllers/.gitkeep
delete mode 100644 laravel/notejam/app/controllers/BaseController.php
delete mode 100644 laravel/notejam/app/controllers/NoteController.php
delete mode 100644 laravel/notejam/app/controllers/PadController.php
delete mode 100644 laravel/notejam/app/controllers/UserController.php
delete mode 100644 laravel/notejam/app/database/migrations/.gitkeep
delete mode 100644 laravel/notejam/app/database/migrations/2014_05_14_215427_create_users_table.php
delete mode 100644 laravel/notejam/app/database/migrations/2014_05_16_225623_create_pads_table.php
delete mode 100644 laravel/notejam/app/database/migrations/2014_05_18_180146_create_notes_table.php
delete mode 100644 laravel/notejam/app/database/production.sqlite
delete mode 100644 laravel/notejam/app/database/seeds/.gitkeep
delete mode 100644 laravel/notejam/app/database/seeds/DatabaseSeeder.php
delete mode 100644 laravel/notejam/app/filters.php
delete mode 100644 laravel/notejam/app/lang/en/pagination.php
delete mode 100644 laravel/notejam/app/lang/en/reminders.php
delete mode 100644 laravel/notejam/app/lang/en/validation.php
delete mode 100644 laravel/notejam/app/models/Note.php
delete mode 100644 laravel/notejam/app/models/Pad.php
delete mode 100644 laravel/notejam/app/models/User.php
delete mode 100644 laravel/notejam/app/routes.php
delete mode 100644 laravel/notejam/app/start/artisan.php
delete mode 100644 laravel/notejam/app/start/global.php
delete mode 100644 laravel/notejam/app/start/local.php
delete mode 100644 laravel/notejam/app/storage/.gitignore
delete mode 100644 laravel/notejam/app/storage/cache/.gitignore
delete mode 100644 laravel/notejam/app/storage/logs/.gitignore
delete mode 100644 laravel/notejam/app/storage/meta/.gitignore
delete mode 100644 laravel/notejam/app/storage/sessions/.gitignore
delete mode 100644 laravel/notejam/app/storage/views/.gitignore
delete mode 100644 laravel/notejam/app/tests/NoteTest.php
delete mode 100644 laravel/notejam/app/tests/PadTest.php
delete mode 100644 laravel/notejam/app/tests/TestCase.php
delete mode 100644 laravel/notejam/app/tests/UserTest.php
delete mode 100644 laravel/notejam/app/views/emails/auth/reminder.blade.php
delete mode 100644 laravel/notejam/app/views/emails/password.blade.php
delete mode 100644 laravel/notejam/app/views/layout.blade.php
delete mode 100644 laravel/notejam/app/views/note/create.blade.php
delete mode 100644 laravel/notejam/app/views/note/delete.blade.php
delete mode 100644 laravel/notejam/app/views/note/edit.blade.php
delete mode 100644 laravel/notejam/app/views/note/index.blade.php
delete mode 100644 laravel/notejam/app/views/note/view.blade.php
delete mode 100644 laravel/notejam/app/views/pad/create.blade.php
delete mode 100644 laravel/notejam/app/views/pad/delete.blade.php
delete mode 100644 laravel/notejam/app/views/pad/edit.blade.php
delete mode 100644 laravel/notejam/app/views/pad/view.blade.php
delete mode 100644 laravel/notejam/app/views/partials/error.blade.php
delete mode 100644 laravel/notejam/app/views/user.blade.php
delete mode 100644 laravel/notejam/app/views/user/forgot-password.blade.php
delete mode 100644 laravel/notejam/app/views/user/settings.blade.php
delete mode 100644 laravel/notejam/app/views/user/signin.blade.php
delete mode 100644 laravel/notejam/app/views/user/signup.blade.php
delete mode 100755 laravel/notejam/artisan
delete mode 100644 laravel/notejam/bootstrap/autoload.php
delete mode 100644 laravel/notejam/bootstrap/paths.php
delete mode 100644 laravel/notejam/bootstrap/start.php
delete mode 100644 laravel/notejam/composer.json
delete mode 100644 laravel/notejam/phpunit.xml
delete mode 100644 laravel/notejam/public/.htaccess
delete mode 100644 laravel/notejam/public/css/style.css
delete mode 100644 laravel/notejam/public/favicon.ico
delete mode 100644 laravel/notejam/public/index.php
delete mode 100644 laravel/notejam/public/packages/.gitkeep
delete mode 100644 laravel/notejam/public/robots.txt
delete mode 100644 laravel/notejam/server.php
delete mode 100644 nette/doctrine/README.rst
delete mode 100644 nette/doctrine/notejam/.gitignore
delete mode 100644 nette/doctrine/notejam/app/Components/ConfirmationControl.php
delete mode 100644 nette/doctrine/notejam/app/Components/ForgottenPasswordControl.php
delete mode 100644 nette/doctrine/notejam/app/Components/NoteControl.php
delete mode 100644 nette/doctrine/notejam/app/Components/PadsControl.php
delete mode 100644 nette/doctrine/notejam/app/Components/PadsList/PadsListControl.php
delete mode 100644 nette/doctrine/notejam/app/Components/PadsList/default.latte
delete mode 100644 nette/doctrine/notejam/app/Components/SettingsControl.php
delete mode 100644 nette/doctrine/notejam/app/Components/SignInControl.php
delete mode 100644 nette/doctrine/notejam/app/Components/SignUpControl.php
delete mode 100644 nette/doctrine/notejam/app/Presenters/BasePresenter.php
delete mode 100644 nette/doctrine/notejam/app/Presenters/Error4xxPresenter.php
delete mode 100644 nette/doctrine/notejam/app/Presenters/ErrorPresenter.php
delete mode 100644 nette/doctrine/notejam/app/Presenters/NotePresenter.php
delete mode 100644 nette/doctrine/notejam/app/Presenters/PadPresenter.php
delete mode 100644 nette/doctrine/notejam/app/Presenters/UserPresenter.php
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/@layout.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/@user.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Error/403.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Error/404.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Error/405.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Error/410.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Error/4xx.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Error/500.phtml
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Note/create.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Note/default.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Note/delete.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Note/detail.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Note/edit.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Pad/create.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Pad/delete.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Pad/detail.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/Pad/edit.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/User/forgottenPassword.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/User/settings.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/User/signIn.latte
delete mode 100644 nette/doctrine/notejam/app/Presenters/templates/User/signUp.latte
delete mode 100644 nette/doctrine/notejam/app/bootstrap.php
delete mode 100644 nette/doctrine/notejam/app/config/config.local.example.neon
delete mode 100644 nette/doctrine/notejam/app/config/config.neon
delete mode 100644 nette/doctrine/notejam/app/config/services.neon
delete mode 100644 nette/doctrine/notejam/codeception.yml
delete mode 100644 nette/doctrine/notejam/composer.json
delete mode 100644 nette/doctrine/notejam/composer.lock
delete mode 100644 nette/doctrine/notejam/log/.gitignore
delete mode 100644 nette/doctrine/notejam/src/Notejam/Http/RouterFactory.php
delete mode 100644 nette/doctrine/notejam/src/Notejam/Notes/Note.php
delete mode 100644 nette/doctrine/notejam/src/Notejam/Notes/NoteRepository.php
delete mode 100644 nette/doctrine/notejam/src/Notejam/Pads/Pad.php
delete mode 100644 nette/doctrine/notejam/src/Notejam/Pads/PadRepository.php
delete mode 100644 nette/doctrine/notejam/src/Notejam/Templating/RuntimeFilters.php
delete mode 100644 nette/doctrine/notejam/src/Notejam/UI/FormFactory.php
delete mode 100644 nette/doctrine/notejam/src/Notejam/UI/FormRenderer.php
delete mode 100644 nette/doctrine/notejam/src/Notejam/Users/Authenticator.php
delete mode 100644 nette/doctrine/notejam/src/Notejam/Users/User.php
delete mode 100644 nette/doctrine/notejam/src/Notejam/Users/UserRepository.php
delete mode 100644 nette/doctrine/notejam/src/Notejam/exceptions.php
delete mode 100644 nette/doctrine/notejam/temp/.gitignore
delete mode 100644 nette/doctrine/notejam/tests/_bootstrap.php
delete mode 100644 nette/doctrine/notejam/tests/_data/dump.sql
delete mode 100644 nette/doctrine/notejam/tests/_output/.gitignore
delete mode 100644 nette/doctrine/notejam/tests/_support/AcceptanceTester.php
delete mode 100644 nette/doctrine/notejam/tests/_support/FunctionalTester.php
delete mode 100644 nette/doctrine/notejam/tests/_support/Helper/Acceptance.php
delete mode 100644 nette/doctrine/notejam/tests/_support/Helper/Functional.php
delete mode 100644 nette/doctrine/notejam/tests/_support/Helper/Unit.php
delete mode 100644 nette/doctrine/notejam/tests/_support/UnitTester.php
delete mode 100644 nette/doctrine/notejam/tests/_support/_generated/.gitignore
delete mode 100644 nette/doctrine/notejam/tests/acceptance.suite.yml
delete mode 100644 nette/doctrine/notejam/tests/acceptance/CreateNoteCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/CreateNoteFailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/CreatePadCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/CreatePadFailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/DeleteNoteCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/DeleteOtherOwnersNoteCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/DeleteOtherOwnersPadCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/DeletePadCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/EditNoteCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/EditNoteFailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/EditOtherOwnersNoteCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/EditOtherOwnersPadCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/EditPadCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/EditPadFailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/ForgottenPasswordCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/ForgottenPasswordInvalidEmailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/ForgottenPasswordUnregisteredEmailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/HomepageCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/NoteDetailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/OtherOwnersNoteDetailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/OtherOwnersPadDetailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/PadDetailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/SetNewPasswordCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/SetNewPasswordFailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/SetNewPasswordInvalidCurrentPasswordCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/SetNewPasswordMismatchCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignInCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignInFailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignInInvalidEmailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignInInvalidPasswordCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignUpAlreadyExistsCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignUpCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignUpFailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignUpInvalidEmailCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/SignUpPasswordMismatchCept.php
delete mode 100644 nette/doctrine/notejam/tests/acceptance/_bootstrap.php
delete mode 100644 nette/doctrine/notejam/tests/functional.suite.yml
delete mode 100644 nette/doctrine/notejam/tests/functional/_bootstrap.php
delete mode 100644 nette/doctrine/notejam/tests/unit.suite.yml
delete mode 100644 nette/doctrine/notejam/tests/unit/_bootstrap.php
delete mode 100644 nette/doctrine/notejam/www/.htaccess
delete mode 100644 nette/doctrine/notejam/www/.maintenance.php
delete mode 100644 nette/doctrine/notejam/www/css/style.css
delete mode 100644 nette/doctrine/notejam/www/favicon.ico
delete mode 100644 nette/doctrine/notejam/www/index.php
delete mode 100644 nette/doctrine/notejam/www/robots.txt
delete mode 100644 nette/native_db/notejam/.gitignore
delete mode 100644 nette/native_db/notejam/app/bootstrap.php
delete mode 100644 nette/native_db/notejam/app/components/Notes/INotesFactory.php
delete mode 100644 nette/native_db/notejam/app/components/Notes/Notes.latte
delete mode 100644 nette/native_db/notejam/app/components/Notes/Notes.php
delete mode 100644 nette/native_db/notejam/app/components/Pads/IPadsFactory.php
delete mode 100644 nette/native_db/notejam/app/components/Pads/Pads.latte
delete mode 100644 nette/native_db/notejam/app/components/Pads/Pads.php
delete mode 100644 nette/native_db/notejam/app/components/UserBar/IUserBarFactory.php
delete mode 100644 nette/native_db/notejam/app/components/UserBar/UserBar.latte
delete mode 100644 nette/native_db/notejam/app/components/UserBar/UserBar.php
delete mode 100644 nette/native_db/notejam/app/config/config.example.neon
delete mode 100644 nette/native_db/notejam/app/config/config.neon
delete mode 100644 nette/native_db/notejam/app/forms/Account/AccountSettingsFormFactory.php
delete mode 100644 nette/native_db/notejam/app/forms/Note/DeleteNoteFormFactory.php
delete mode 100644 nette/native_db/notejam/app/forms/Note/EditNoteFormFactory.php
delete mode 100644 nette/native_db/notejam/app/forms/Note/NewNoteFormFactory.php
delete mode 100644 nette/native_db/notejam/app/forms/Pad/DeletePadFormFactory.php
delete mode 100644 nette/native_db/notejam/app/forms/Pad/EditPadFormFactory.php
delete mode 100644 nette/native_db/notejam/app/forms/Pad/NewPadFormFactory.php
delete mode 100644 nette/native_db/notejam/app/forms/Sign/ForgottenPasswordFormFactory.php
delete mode 100644 nette/native_db/notejam/app/forms/Sign/SignInFormFactory.php
delete mode 100644 nette/native_db/notejam/app/forms/Sign/SignUpFormFactory.php
delete mode 100644 nette/native_db/notejam/app/helpers/OrderHelper.php
delete mode 100644 nette/native_db/notejam/app/model/NoteManager.php
delete mode 100644 nette/native_db/notejam/app/model/PadManager.php
delete mode 100644 nette/native_db/notejam/app/model/UserManager.php
delete mode 100644 nette/native_db/notejam/app/presenters/AccountPresenter.php
delete mode 100644 nette/native_db/notejam/app/presenters/BasePresenter.php
delete mode 100644 nette/native_db/notejam/app/presenters/Error4xxPresenter.php
delete mode 100644 nette/native_db/notejam/app/presenters/ErrorPresenter.php
delete mode 100644 nette/native_db/notejam/app/presenters/HomepagePresenter.php
delete mode 100644 nette/native_db/notejam/app/presenters/NotePresenter.php
delete mode 100644 nette/native_db/notejam/app/presenters/PadPresenter.php
delete mode 100644 nette/native_db/notejam/app/presenters/SecuredBasePresenter.php
delete mode 100644 nette/native_db/notejam/app/presenters/SignPresenter.php
delete mode 100644 nette/native_db/notejam/app/presenters/templates/@layout.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Account/settings.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Error/403.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Error/404.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Error/405.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Error/410.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Error/4xx.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Error/500.phtml
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Homepage/default.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Note/default.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Note/delete.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Note/edit.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Note/new.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Pad/default.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Pad/delete.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Pad/edit.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Pad/new.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Sign/forgotten.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Sign/in.latte
delete mode 100644 nette/native_db/notejam/app/presenters/templates/Sign/up.latte
delete mode 100644 nette/native_db/notejam/app/router/RouterFactory.php
delete mode 100644 nette/native_db/notejam/bin/create-db.php
delete mode 100644 nette/native_db/notejam/codeception.yml
delete mode 100644 nette/native_db/notejam/composer.json
delete mode 100644 nette/native_db/notejam/composer.lock
delete mode 100644 nette/native_db/notejam/tests/_bootstrap.php
delete mode 100644 nette/native_db/notejam/tests/_data/dump.sql
delete mode 100644 nette/native_db/notejam/tests/_output/.gitignore
delete mode 100644 nette/native_db/notejam/tests/_support/AcceptanceTester.php
delete mode 100644 nette/native_db/notejam/tests/_support/FunctionalTester.php
delete mode 100644 nette/native_db/notejam/tests/_support/Helper/Acceptance.php
delete mode 100644 nette/native_db/notejam/tests/_support/Helper/Functional.php
delete mode 100644 nette/native_db/notejam/tests/_support/Helper/Unit.php
delete mode 100644 nette/native_db/notejam/tests/_support/UnitTester.php
delete mode 100644 nette/native_db/notejam/tests/_support/_generated/.gitignore
delete mode 100644 nette/native_db/notejam/tests/acceptance.suite.yml
delete mode 100644 nette/native_db/notejam/tests/acceptance/CreateNoteCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/CreateNoteFailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/CreatePadCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/CreatePadFailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/DeleteNoteCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/DeleteOtherOwnersNoteCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/DeleteOtherOwnersPadCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/DeletePadCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/EditNoteCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/EditNoteFailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/EditOtherOwnersNoteCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/EditOtherOwnersPadCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/EditPadCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/EditPadFailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/ForgottenPasswordCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/ForgottenPasswordInvalidEmailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/ForgottenPasswordUnregisteredEmailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/HomepageCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/NoteDetailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/OtherOwnersNoteDetailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/OtherOwnersPadDetailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/PadDetailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/SetNewPasswordCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/SetNewPasswordFailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/SetNewPasswordInvalidCurrentPasswordCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/SetNewPasswordMismatchCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/SignInCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/SignInFailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/SignInInvalidEmailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/SignInInvalidPasswordCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/SignUpAlreadyExistsCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/SignUpCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/SignUpFailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/SignUpInvalidEmailCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/SignUpPasswordMismatchCept.php
delete mode 100644 nette/native_db/notejam/tests/acceptance/_bootstrap.php
delete mode 100644 nette/native_db/notejam/tests/functional.suite.yml
delete mode 100644 nette/native_db/notejam/tests/functional/_bootstrap.php
delete mode 100644 nette/native_db/notejam/tests/unit.suite.yml
delete mode 100644 nette/native_db/notejam/tests/unit/_bootstrap.php
delete mode 100644 nette/native_db/notejam/www/.maintenance.php
delete mode 100644 nette/native_db/notejam/www/css/style.css
delete mode 100644 nette/native_db/notejam/www/favicon.ico
delete mode 100644 nette/native_db/notejam/www/images/spinner.gif
delete mode 100644 nette/native_db/notejam/www/index.php
delete mode 100644 nette/native_db/notejam/www/js/main.js
delete mode 100644 nette/native_db/notejam/www/robots.txt
delete mode 100644 nette/native_db/readme.rst
delete mode 100644 padrino/README.rst
delete mode 100644 padrino/notejam/.components
delete mode 100644 padrino/notejam/.gitignore
delete mode 100644 padrino/notejam/Gemfile
delete mode 100644 padrino/notejam/Gemfile.lock
delete mode 100644 padrino/notejam/Rakefile
delete mode 100644 padrino/notejam/admin/app.rb
delete mode 100644 padrino/notejam/admin/controllers/accounts.rb
delete mode 100644 padrino/notejam/admin/controllers/base.rb
delete mode 100644 padrino/notejam/admin/controllers/sessions.rb
delete mode 100644 padrino/notejam/admin/views/accounts/_form.erb
delete mode 100644 padrino/notejam/admin/views/accounts/edit.erb
delete mode 100644 padrino/notejam/admin/views/accounts/index.erb
delete mode 100644 padrino/notejam/admin/views/accounts/new.erb
delete mode 100644 padrino/notejam/admin/views/base/index.erb
delete mode 100644 padrino/notejam/admin/views/errors/403.erb
delete mode 100644 padrino/notejam/admin/views/errors/404.erb
delete mode 100644 padrino/notejam/admin/views/errors/500.erb
delete mode 100644 padrino/notejam/admin/views/layouts/application.erb
delete mode 100644 padrino/notejam/admin/views/layouts/error.erb
delete mode 100644 padrino/notejam/admin/views/sessions/new.erb
delete mode 100644 padrino/notejam/app/app.rb
delete mode 100644 padrino/notejam/app/controllers/note.rb
delete mode 100644 padrino/notejam/app/controllers/pad.rb
delete mode 100644 padrino/notejam/app/controllers/user.rb
delete mode 100644 padrino/notejam/app/helpers.rb
delete mode 100644 padrino/notejam/app/helpers/user_helper.rb
delete mode 100644 padrino/notejam/app/mailers.rb
delete mode 100644 padrino/notejam/app/mailers/mailer.rb
delete mode 100644 padrino/notejam/app/views/layouts/layout.html.erb
delete mode 100644 padrino/notejam/app/views/layouts/user.html.erb
delete mode 100644 padrino/notejam/app/views/mailers/mailer/new_password_email.erb
delete mode 100644 padrino/notejam/app/views/note/create.html.erb
delete mode 100644 padrino/notejam/app/views/note/delete.html.erb
delete mode 100644 padrino/notejam/app/views/note/edit.html.erb
delete mode 100644 padrino/notejam/app/views/note/list.html.erb
delete mode 100644 padrino/notejam/app/views/note/view.html.erb
delete mode 100644 padrino/notejam/app/views/pad/create.html.erb
delete mode 100644 padrino/notejam/app/views/pad/delete.html.erb
delete mode 100644 padrino/notejam/app/views/pad/edit.html.erb
delete mode 100644 padrino/notejam/app/views/pad/view.html.erb
delete mode 100644 padrino/notejam/app/views/user/forgot-password.html.erb
delete mode 100644 padrino/notejam/app/views/user/settings.html.erb
delete mode 100644 padrino/notejam/app/views/user/signin.html.erb
delete mode 100644 padrino/notejam/app/views/user/signup.html.erb
delete mode 100644 padrino/notejam/config.ru
delete mode 100644 padrino/notejam/config/apps.rb
delete mode 100644 padrino/notejam/config/boot.rb
delete mode 100644 padrino/notejam/config/database.rb
delete mode 100644 padrino/notejam/db/migrate/001_create_users.rb
delete mode 100644 padrino/notejam/db/seeds.rb
delete mode 100644 padrino/notejam/models/note.rb
delete mode 100644 padrino/notejam/models/pad.rb
delete mode 100644 padrino/notejam/models/user.rb
delete mode 100644 padrino/notejam/public/admin/images/favicon.ico
delete mode 100644 padrino/notejam/public/admin/images/font/FontAwesome.otf
delete mode 100644 padrino/notejam/public/admin/images/font/fontawesome-webfont.eot
delete mode 100644 padrino/notejam/public/admin/images/font/fontawesome-webfont.svg
delete mode 100644 padrino/notejam/public/admin/images/font/fontawesome-webfont.ttf
delete mode 100644 padrino/notejam/public/admin/images/font/fontawesome-webfont.woff
delete mode 100644 padrino/notejam/public/admin/images/logo.png
delete mode 100644 padrino/notejam/public/admin/javascripts/application.js
delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/affix.js
delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/alert.js
delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/bootstrap.min.js
delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/button.js
delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/carousel.js
delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/collapse.js
delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/dropdown.js
delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/modal.js
delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/popover.js
delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/scrollspy.js
delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/tab.js
delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/tooltip.js
delete mode 100644 padrino/notejam/public/admin/javascripts/bootstrap/transition.js
delete mode 100644 padrino/notejam/public/admin/javascripts/jquery-1.9.0.min.js
delete mode 100644 padrino/notejam/public/favicon.ico
delete mode 100644 padrino/notejam/public/stylesheets/style.css
delete mode 100644 padrino/notejam/spec/app/controllers/note_controller_spec.rb
delete mode 100644 padrino/notejam/spec/app/controllers/pad_controller_spec.rb
delete mode 100644 padrino/notejam/spec/app/controllers/user_controller_spec.rb
delete mode 100644 padrino/notejam/spec/spec.rake
delete mode 100644 padrino/notejam/spec/spec_helper.rb
rename spring/pom.xml => pom.xml (92%)
delete mode 100644 pyramid/CHANGES.txt
delete mode 100644 pyramid/MANIFEST.in
delete mode 100644 pyramid/README.rst
delete mode 100644 pyramid/README.txt
delete mode 100644 pyramid/development.ini
delete mode 100644 pyramid/notejam/__init__.py
delete mode 100644 pyramid/notejam/forms.py
delete mode 100644 pyramid/notejam/models.py
delete mode 100644 pyramid/notejam/scripts/__init__.py
delete mode 100644 pyramid/notejam/scripts/initializedb.py
delete mode 100644 pyramid/notejam/static/css/base.css
delete mode 100644 pyramid/notejam/static/css/layout.css
delete mode 100644 pyramid/notejam/static/css/skeleton.css
delete mode 100644 pyramid/notejam/static/css/style.css
delete mode 100644 pyramid/notejam/static/css/tables.css
delete mode 100644 pyramid/notejam/static/favicon.ico
delete mode 100644 pyramid/notejam/static/footerbg.png
delete mode 100644 pyramid/notejam/static/headerbg.png
delete mode 100644 pyramid/notejam/static/ie6.css
delete mode 100644 pyramid/notejam/static/middlebg.png
delete mode 100644 pyramid/notejam/static/pylons.css
delete mode 100644 pyramid/notejam/static/pyramid-small.png
delete mode 100644 pyramid/notejam/static/pyramid.png
delete mode 100644 pyramid/notejam/static/transparent.gif
delete mode 100644 pyramid/notejam/templates/app_layout.pt
delete mode 100644 pyramid/notejam/templates/base.pt
delete mode 100644 pyramid/notejam/templates/notes/create.pt
delete mode 100644 pyramid/notejam/templates/notes/delete.pt
delete mode 100644 pyramid/notejam/templates/notes/edit.pt
delete mode 100644 pyramid/notejam/templates/notes/list.pt
delete mode 100644 pyramid/notejam/templates/notes/view.pt
delete mode 100644 pyramid/notejam/templates/pads/create.pt
delete mode 100644 pyramid/notejam/templates/pads/delete.pt
delete mode 100644 pyramid/notejam/templates/pads/edit.pt
delete mode 100644 pyramid/notejam/templates/pads/note_list.pt
delete mode 100644 pyramid/notejam/templates/snippets.pt
delete mode 100644 pyramid/notejam/templates/user_layout.pt
delete mode 100644 pyramid/notejam/templates/users/forgot_password.pt
delete mode 100644 pyramid/notejam/templates/users/settings.pt
delete mode 100644 pyramid/notejam/templates/users/signin.pt
delete mode 100644 pyramid/notejam/templates/users/signup.pt
delete mode 100644 pyramid/notejam/tests.py
delete mode 100644 pyramid/notejam/views.py
delete mode 100644 pyramid/production.ini
delete mode 100644 pyramid/setup.cfg
delete mode 100644 pyramid/setup.py
delete mode 100644 rubyonrails/README.rst
delete mode 100644 rubyonrails/notejam/.gitignore
delete mode 100644 rubyonrails/notejam/Gemfile
delete mode 100644 rubyonrails/notejam/Gemfile.lock
delete mode 100644 rubyonrails/notejam/README.rdoc
delete mode 100644 rubyonrails/notejam/Rakefile
delete mode 100644 rubyonrails/notejam/app/assets/images/.keep
delete mode 100644 rubyonrails/notejam/app/assets/javascripts/application.js
delete mode 100644 rubyonrails/notejam/app/assets/javascripts/note.js.coffee
delete mode 100644 rubyonrails/notejam/app/assets/javascripts/pad.js.coffee
delete mode 100644 rubyonrails/notejam/app/assets/javascripts/user.js.coffee
delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/application.css
delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/base.css
delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/layout.css
delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/note.css.scss
delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/pad.css.scss
delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/skeleton.css
delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/style.css
delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/tables.css
delete mode 100644 rubyonrails/notejam/app/assets/stylesheets/user.css.scss
delete mode 100644 rubyonrails/notejam/app/controllers/application_controller.rb
delete mode 100644 rubyonrails/notejam/app/controllers/notes_controller.rb
delete mode 100644 rubyonrails/notejam/app/controllers/pads_controller.rb
delete mode 100644 rubyonrails/notejam/app/controllers/users_controller.rb
delete mode 100644 rubyonrails/notejam/app/helpers/application_helper.rb
delete mode 100644 rubyonrails/notejam/app/helpers/note_helper.rb
delete mode 100644 rubyonrails/notejam/app/helpers/pad_helper.rb
delete mode 100644 rubyonrails/notejam/app/helpers/user_helper.rb
delete mode 100644 rubyonrails/notejam/app/mailers/.keep
delete mode 100644 rubyonrails/notejam/app/mailers/user_mailer.rb
delete mode 100644 rubyonrails/notejam/app/models/.keep
delete mode 100644 rubyonrails/notejam/app/models/note.rb
delete mode 100644 rubyonrails/notejam/app/models/pad.rb
delete mode 100644 rubyonrails/notejam/app/models/user.rb
delete mode 100644 rubyonrails/notejam/app/views/layouts/application.html.erb
delete mode 100644 rubyonrails/notejam/app/views/layouts/users.html.erb
delete mode 100644 rubyonrails/notejam/app/views/notes/create.html.erb
delete mode 100644 rubyonrails/notejam/app/views/notes/delete.html.erb
delete mode 100644 rubyonrails/notejam/app/views/notes/edit.html.erb
delete mode 100644 rubyonrails/notejam/app/views/notes/index.html.erb
delete mode 100644 rubyonrails/notejam/app/views/notes/show.html.erb
delete mode 100644 rubyonrails/notejam/app/views/pads/create.html.erb
delete mode 100644 rubyonrails/notejam/app/views/pads/delete.html.erb
delete mode 100644 rubyonrails/notejam/app/views/pads/edit.html.erb
delete mode 100644 rubyonrails/notejam/app/views/pads/show.html.erb
delete mode 100644 rubyonrails/notejam/app/views/user_mailer/send_new_password.text.erb
delete mode 100644 rubyonrails/notejam/app/views/users/forgot_password.html.erb
delete mode 100644 rubyonrails/notejam/app/views/users/settings.html.erb
delete mode 100644 rubyonrails/notejam/app/views/users/signin.html.erb
delete mode 100644 rubyonrails/notejam/app/views/users/signup.html.erb
delete mode 100755 rubyonrails/notejam/bin/bundle
delete mode 100755 rubyonrails/notejam/bin/rails
delete mode 100755 rubyonrails/notejam/bin/rake
delete mode 100644 rubyonrails/notejam/config.ru
delete mode 100644 rubyonrails/notejam/config/application.rb
delete mode 100644 rubyonrails/notejam/config/boot.rb
delete mode 100644 rubyonrails/notejam/config/database.yml
delete mode 100644 rubyonrails/notejam/config/environment.rb
delete mode 100644 rubyonrails/notejam/config/environments/development.rb
delete mode 100644 rubyonrails/notejam/config/environments/production.rb
delete mode 100644 rubyonrails/notejam/config/environments/test.rb
delete mode 100644 rubyonrails/notejam/config/initializers/assets.rb
delete mode 100644 rubyonrails/notejam/config/initializers/backtrace_silencers.rb
delete mode 100644 rubyonrails/notejam/config/initializers/cookies_serializer.rb
delete mode 100644 rubyonrails/notejam/config/initializers/filter_parameter_logging.rb
delete mode 100644 rubyonrails/notejam/config/initializers/inflections.rb
delete mode 100644 rubyonrails/notejam/config/initializers/mime_types.rb
delete mode 100644 rubyonrails/notejam/config/initializers/secret_token.rb
delete mode 100644 rubyonrails/notejam/config/initializers/session_store.rb
delete mode 100644 rubyonrails/notejam/config/initializers/wrap_parameters.rb
delete mode 100644 rubyonrails/notejam/config/locales/en.yml
delete mode 100644 rubyonrails/notejam/config/routes.rb
delete mode 100644 rubyonrails/notejam/config/secrets.yml
delete mode 100644 rubyonrails/notejam/db/migrate/20140409143934_create_users.rb
delete mode 100644 rubyonrails/notejam/db/migrate/20140414192524_create_pads.rb
delete mode 100644 rubyonrails/notejam/db/migrate/20140418215526_create_notes.rb
delete mode 100644 rubyonrails/notejam/db/schema.rb
delete mode 100644 rubyonrails/notejam/db/seeds.rb
delete mode 100644 rubyonrails/notejam/log/.keep
delete mode 100644 rubyonrails/notejam/public/404.html
delete mode 100644 rubyonrails/notejam/public/422.html
delete mode 100644 rubyonrails/notejam/public/500.html
delete mode 100644 rubyonrails/notejam/public/favicon.ico
delete mode 100644 rubyonrails/notejam/public/robots.txt
delete mode 100644 rubyonrails/notejam/test/controllers/.keep
delete mode 100644 rubyonrails/notejam/test/controllers/notes_controller_test.rb
delete mode 100644 rubyonrails/notejam/test/controllers/pads_controller_test.rb
delete mode 100644 rubyonrails/notejam/test/controllers/users_controller_test.rb
delete mode 100644 rubyonrails/notejam/test/fixtures/.keep
delete mode 100644 rubyonrails/notejam/test/fixtures/notes.yml
delete mode 100644 rubyonrails/notejam/test/fixtures/pads.yml
delete mode 100644 rubyonrails/notejam/test/fixtures/users.yml
delete mode 100644 rubyonrails/notejam/test/helpers/.keep
delete mode 100644 rubyonrails/notejam/test/helpers/note_helper_test.rb
delete mode 100644 rubyonrails/notejam/test/helpers/pad_helper_test.rb
delete mode 100644 rubyonrails/notejam/test/helpers/user_helper_test.rb
delete mode 100644 rubyonrails/notejam/test/integration/.keep
delete mode 100644 rubyonrails/notejam/test/mailers/.keep
delete mode 100644 rubyonrails/notejam/test/mailers/user_mailer_test.rb
delete mode 100644 rubyonrails/notejam/test/models/.keep
delete mode 100644 rubyonrails/notejam/test/models/note_test.rb
delete mode 100644 rubyonrails/notejam/test/models/pad_test.rb
delete mode 100644 rubyonrails/notejam/test/models/user_test.rb
delete mode 100644 rubyonrails/notejam/test/test_helper.rb
delete mode 100644 rubyonrails/notejam/vendor/assets/javascripts/.keep
delete mode 100644 rubyonrails/notejam/vendor/assets/stylesheets/.keep
delete mode 100644 screenshots.rst
delete mode 100644 spring/.gitignore
delete mode 100644 spring/README.rst
delete mode 100644 spring/src/test/resources/application-test.properties
rename {spring/src => src}/main/java/net/notejam/spring/Application.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/URITemplates.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/error/ForcedErrorController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/error/ResourceNotFoundException.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/error/UnsupportedLocaleException.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/error/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/helper/converter/StringToPeriodConverter.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/helper/converter/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/helper/reflection/Annotated.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/helper/reflection/ReflectionUtils.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/helper/reflection/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/note/Note.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/note/NoteRepository.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/note/NoteService.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/note/controller/AllNotesController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/note/controller/CreateNoteController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/note/controller/DeleteNoteController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/note/controller/EditNoteController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/note/controller/ViewNoteController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/note/controller/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/note/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/pad/Pad.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/pad/PadRepository.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/pad/PadService.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/pad/controller/CreatePadController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/pad/controller/DeletePadController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/pad/controller/EditPadController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/pad/controller/PadsAdvice.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/pad/controller/ViewPadNotesController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/pad/controller/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/pad/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/security/LoginController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/security/SecurityConfiguration.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/security/SecurityService.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/security/UserDetailsServiceImpl.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/security/owner/Owned.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/security/owner/PermitOwner.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/security/owner/PermitOwnerAspect.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/security/owner/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/security/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/User.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/UserRepository.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/UserService.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/account/Account.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/account/AccountController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/account/constraints/CurrentPassword.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/account/constraints/CurrentPasswordValidator.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/account/constraints/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/account/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/constraints/Password.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/constraints/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/ForgotPassword.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/ForgotPasswordController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/InvalidTokenException.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/PasswordRecoveryService.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/RecoverPasswordController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/RecoveryToken.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/RecoveryTokenRepository.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/forgot/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/signup/Signup.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/signup/SignupController.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/signup/constraints/UniqueEmail.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/signup/constraints/UniqueEmailValidator.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/signup/constraints/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/user/signup/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/view/ViewConfiguration.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/view/dialect/NaturalLanguageDateProcessor.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/view/dialect/NoteTextProcessor.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/view/dialect/NotejamDialect.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/view/dialect/ProcessorUtil.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/view/dialect/package-info.java (100%)
rename {spring/src => src}/main/java/net/notejam/spring/view/package-info.java (100%)
rename {spring/src => src}/main/resources/application.properties (54%)
rename {spring/src => src}/main/resources/messages_de.properties (100%)
rename {spring/src => src}/main/resources/messages_en.properties (100%)
rename {spring/src => src}/main/resources/static/css/style.css (100%)
rename {spring/src => src}/main/resources/templates/error.html (100%)
rename {spring/src => src}/main/resources/templates/layout.html (100%)
rename {spring/src => src}/main/resources/templates/note/create.html (100%)
rename {spring/src => src}/main/resources/templates/note/delete.html (100%)
rename {spring/src => src}/main/resources/templates/note/edit.html (100%)
rename {spring/src => src}/main/resources/templates/note/view.html (100%)
rename {spring/src => src}/main/resources/templates/notes.html (100%)
rename {spring/src => src}/main/resources/templates/pad/create.html (100%)
rename {spring/src => src}/main/resources/templates/pad/delete.html (100%)
rename {spring/src => src}/main/resources/templates/pad/edit.html (100%)
rename {spring/src => src}/main/resources/templates/user/account.html (100%)
rename {spring/src => src}/main/resources/templates/user/forgot-password.html (100%)
rename {spring/src => src}/main/resources/templates/user/login.html (100%)
rename {spring/src => src}/main/resources/templates/user/reveal-password.html (100%)
rename {spring/src => src}/main/resources/templates/user/signup.html (100%)
rename {spring/src => src}/test/java/net/notejam/spring/helper/converter/StringToPeriodConverterTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/note/CreateNoteControllerTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/note/DeleteNoteControllerTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/note/EditNoteControllerTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/note/NoteServiceTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/note/ViewNoteControllerTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/pad/CreatePadControllerTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/pad/DeletePadControllerTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/pad/EditPadControllerTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/pad/ViewPadControllerTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/security/LoginControllerTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/security/SecurityServiceTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/security/owner/PermitOwnerAspectTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/security/owner/PermitOwnerIntegrationTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/test/IntegrationTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/test/MockMvcProvider.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/test/UriUtil.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/user/SignedUpUserProvider.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/user/UserServiceTest.java (100%)
rename {spring/src => src}/test/java/net/notejam/spring/user/signup/SignupControllerTest.java (100%)
create mode 100644 src/test/resources/application-test.properties
delete mode 100644 symfony/README.rst
delete mode 100644 symfony/notejam/.gitignore
delete mode 100644 symfony/notejam/.travis.yml
delete mode 100644 symfony/notejam/LICENSE
delete mode 100644 symfony/notejam/app/.htaccess
delete mode 100644 symfony/notejam/app/AppCache.php
delete mode 100644 symfony/notejam/app/AppKernel.php
delete mode 100644 symfony/notejam/app/Resources/translations/messages.fr.xlf
delete mode 100644 symfony/notejam/app/Resources/views/base.html.twig
delete mode 100644 symfony/notejam/app/Resources/views/fields.html.twig
delete mode 100644 symfony/notejam/app/Resources/views/user.html.twig
delete mode 100644 symfony/notejam/app/SymfonyRequirements.php
delete mode 100644 symfony/notejam/app/autoload.php
delete mode 100644 symfony/notejam/app/cache/.gitkeep
delete mode 100644 symfony/notejam/app/check.php
delete mode 100644 symfony/notejam/app/config/config.yml
delete mode 100644 symfony/notejam/app/config/config_dev.yml
delete mode 100644 symfony/notejam/app/config/config_prod.yml
delete mode 100644 symfony/notejam/app/config/config_test.yml
delete mode 100644 symfony/notejam/app/config/parameters.yml
delete mode 100644 symfony/notejam/app/config/parameters.yml.dist
delete mode 100644 symfony/notejam/app/config/routing.yml
delete mode 100644 symfony/notejam/app/config/routing_dev.yml
delete mode 100644 symfony/notejam/app/config/security.yml
delete mode 100644 symfony/notejam/app/config/services.yml
delete mode 100755 symfony/notejam/app/console
delete mode 100644 symfony/notejam/app/logs/.gitkeep
delete mode 100644 symfony/notejam/app/phpunit.xml.dist
delete mode 100644 symfony/notejam/composer.json
delete mode 100644 symfony/notejam/composer.lock
delete mode 100644 symfony/notejam/src/.htaccess
delete mode 100644 symfony/notejam/src/AppBundle/AppBundle.php
delete mode 100644 symfony/notejam/src/AppBundle/Controller/NoteController.php
delete mode 100644 symfony/notejam/src/AppBundle/Controller/PadController.php
delete mode 100644 symfony/notejam/src/AppBundle/Controller/UserController.php
delete mode 100644 symfony/notejam/src/AppBundle/Entity/Note.php
delete mode 100644 symfony/notejam/src/AppBundle/Entity/Pad.php
delete mode 100644 symfony/notejam/src/AppBundle/Entity/User.php
delete mode 100644 symfony/notejam/src/AppBundle/Form/Type/ChangePasswordType.php
delete mode 100644 symfony/notejam/src/AppBundle/Form/Type/NoteType.php
delete mode 100644 symfony/notejam/src/AppBundle/Form/Type/PadType.php
delete mode 100644 symfony/notejam/src/AppBundle/Form/Type/UserType.php
delete mode 100644 symfony/notejam/src/AppBundle/Repository/NoteRepository.php
delete mode 100644 symfony/notejam/src/AppBundle/Repository/PadRepository.php
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Note/create.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Note/delete.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Note/edit.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Note/list.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Note/view.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Pad/create.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Pad/delete.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Pad/edit.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Pad/list.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/Pad/notes.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/User/forgot-password.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/User/index.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/User/settings.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/User/signin.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Resources/views/User/signup.html.twig
delete mode 100644 symfony/notejam/src/AppBundle/Tests/Controller/NoteControllerTest.php
delete mode 100644 symfony/notejam/src/AppBundle/Tests/Controller/PadControllerTest.php
delete mode 100644 symfony/notejam/web/.htaccess
delete mode 100644 symfony/notejam/web/app.php
delete mode 100644 symfony/notejam/web/app_dev.php
delete mode 100644 symfony/notejam/web/apple-touch-icon.png
delete mode 100644 symfony/notejam/web/config.php
delete mode 100644 symfony/notejam/web/css/style.css
delete mode 100644 symfony/notejam/web/favicon.ico
delete mode 100644 symfony/notejam/web/robots.txt
delete mode 100644 terraform/modules/terraform-aws-ecs-codepipeline/fixtures.us-east-2.tfvars
delete mode 100644 terraform/modules/terraform-aws-ecs-codepipeline/main.tf
delete mode 100644 terraform/modules/terraform-aws-ecs-codepipeline/outputs.tf
delete mode 100644 terraform/modules/terraform-aws-ecs-codepipeline/variables.tf
delete mode 100644 terraform/modules/terraform-aws-ecs-codepipeline/versions.tf
delete mode 100644 terraform/modules/terraform-aws-elastic-beanstalk-environment/fixtures.us-east-2.tfvars
delete mode 100644 terraform/modules/terraform-aws-elastic-beanstalk-environment/main.tf
delete mode 100644 terraform/modules/terraform-aws-elastic-beanstalk-environment/outputs.tf
delete mode 100644 terraform/modules/terraform-aws-elastic-beanstalk-environment/variables.tf
delete mode 100644 terraform/modules/terraform-aws-elastic-beanstalk-environment/versions.tf
delete mode 100644 yii/README.rst
delete mode 100644 yii/notejam/.gitignore
delete mode 100644 yii/notejam/assets/AppAsset.php
delete mode 100644 yii/notejam/codeception.yml
delete mode 100644 yii/notejam/composer.json
delete mode 100644 yii/notejam/composer.lock
delete mode 100644 yii/notejam/config/db.php
delete mode 100644 yii/notejam/config/params.php
delete mode 100644 yii/notejam/config/web.php
delete mode 100644 yii/notejam/controllers/BaseController.php
delete mode 100644 yii/notejam/controllers/NoteController.php
delete mode 100644 yii/notejam/controllers/PadController.php
delete mode 100644 yii/notejam/controllers/UserController.php
delete mode 100644 yii/notejam/mail/layouts/html.php
delete mode 100644 yii/notejam/mail/password.php
delete mode 100644 yii/notejam/migrations/m140804_111205_create_tables.php
delete mode 100644 yii/notejam/models/ChangePassword.php
delete mode 100644 yii/notejam/models/ForgotPassword.php
delete mode 100644 yii/notejam/models/LoginForm.php
delete mode 100644 yii/notejam/models/Note.php
delete mode 100644 yii/notejam/models/Pad.php
delete mode 100644 yii/notejam/models/SigninForm.php
delete mode 100644 yii/notejam/models/SignupForm.php
delete mode 100644 yii/notejam/models/User.php
delete mode 100644 yii/notejam/requirements.php
delete mode 100644 yii/notejam/runtime/.gitignore
delete mode 100644 yii/notejam/tests/.gitignore
delete mode 100644 yii/notejam/tests/README.md
delete mode 100644 yii/notejam/tests/_bootstrap.php
delete mode 100644 yii/notejam/tests/_config.php
delete mode 100644 yii/notejam/tests/_console_bootstrap.php
delete mode 100644 yii/notejam/tests/_data/dump.sql
delete mode 100644 yii/notejam/tests/_log/.gitignore
delete mode 100644 yii/notejam/tests/_pages/CreateNotePage.php
delete mode 100644 yii/notejam/tests/_pages/CreatePadPage.php
delete mode 100644 yii/notejam/tests/_pages/DeleteNotePage.php
delete mode 100644 yii/notejam/tests/_pages/DeletePadPage.php
delete mode 100644 yii/notejam/tests/_pages/EditNotePage.php
delete mode 100644 yii/notejam/tests/_pages/EditPadPage.php
delete mode 100644 yii/notejam/tests/_pages/SignedInPage.php
delete mode 100644 yii/notejam/tests/_pages/SigninPage.php
delete mode 100644 yii/notejam/tests/_pages/SignupPage.php
delete mode 100644 yii/notejam/tests/_pages/ViewNotePage.php
delete mode 100644 yii/notejam/tests/_pages/ViewPadPage.php
delete mode 100644 yii/notejam/tests/acceptance.suite.yml
delete mode 100644 yii/notejam/tests/acceptance/_bootstrap.php
delete mode 100644 yii/notejam/tests/acceptance/_config.php
delete mode 100644 yii/notejam/tests/acceptance/_console.php
delete mode 100644 yii/notejam/tests/acceptance/yii
delete mode 100644 yii/notejam/tests/acceptance/yii.bat
delete mode 100644 yii/notejam/tests/functional.suite.yml
delete mode 100644 yii/notejam/tests/functional/CreateNoteCept.php
delete mode 100644 yii/notejam/tests/functional/CreatePadCept.php
delete mode 100644 yii/notejam/tests/functional/DeleteNoteCept.php
delete mode 100644 yii/notejam/tests/functional/DeletePadCept.php
delete mode 100644 yii/notejam/tests/functional/EditNoteCept.php
delete mode 100644 yii/notejam/tests/functional/EditPadCept.php
delete mode 100644 yii/notejam/tests/functional/SigninCept.php
delete mode 100644 yii/notejam/tests/functional/SignupCept.php
delete mode 100644 yii/notejam/tests/functional/ViewNoteCept.php
delete mode 100644 yii/notejam/tests/functional/ViewPadCept.php
delete mode 100644 yii/notejam/tests/functional/_bootstrap.php
delete mode 100644 yii/notejam/tests/functional/_config.php
delete mode 100644 yii/notejam/tests/functional/_console.php
delete mode 100755 yii/notejam/tests/functional/yii
delete mode 100644 yii/notejam/tests/functional/yii.bat
delete mode 100644 yii/notejam/tests/unit.suite.yml
delete mode 100644 yii/notejam/tests/unit/_bootstrap.php
delete mode 100644 yii/notejam/tests/unit/_config.php
delete mode 100644 yii/notejam/tests/unit/_console.php
delete mode 100644 yii/notejam/tests/unit/fixtures/.gitkeep
delete mode 100644 yii/notejam/tests/unit/fixtures/data/.gitkeep
delete mode 100644 yii/notejam/tests/unit/templates/fixtures/.gitkeep
delete mode 100644 yii/notejam/tests/unit/yii
delete mode 100644 yii/notejam/tests/unit/yii.bat
delete mode 100644 yii/notejam/views/layouts/app.php
delete mode 100644 yii/notejam/views/layouts/base.php
delete mode 100644 yii/notejam/views/layouts/user.php
delete mode 100644 yii/notejam/views/note/create.php
delete mode 100644 yii/notejam/views/note/delete.php
delete mode 100644 yii/notejam/views/note/edit.php
delete mode 100644 yii/notejam/views/note/error.php
delete mode 100644 yii/notejam/views/note/form.php
delete mode 100644 yii/notejam/views/note/list.php
delete mode 100644 yii/notejam/views/note/view.php
delete mode 100644 yii/notejam/views/pad/create.php
delete mode 100644 yii/notejam/views/pad/delete.php
delete mode 100644 yii/notejam/views/pad/edit.php
delete mode 100644 yii/notejam/views/pad/form.php
delete mode 100644 yii/notejam/views/pad/view.php
delete mode 100644 yii/notejam/views/partials/errors.php
delete mode 100644 yii/notejam/views/user/forgot-password.php
delete mode 100644 yii/notejam/views/user/settings.php
delete mode 100644 yii/notejam/views/user/signin.php
delete mode 100644 yii/notejam/views/user/signup.php
delete mode 100644 yii/notejam/web/assets/.gitignore
delete mode 100644 yii/notejam/web/css/site.css
delete mode 100644 yii/notejam/web/css/style.css
delete mode 100644 yii/notejam/web/favicon.ico
delete mode 100644 yii/notejam/web/index-test.php
delete mode 100644 yii/notejam/web/index.php
delete mode 100644 yii/notejam/web/robots.txt
delete mode 100755 yii/notejam/yii
delete mode 100644 yii/notejam/yii.bat
diff --git a/.github/workflows/ci-notejam.yml b/.github/workflows/ci-notejam.yml
new file mode 100644
index 000000000..d9e335e1d
--- /dev/null
+++ b/.github/workflows/ci-notejam.yml
@@ -0,0 +1,75 @@
+name: ms-cloud-config CI
+
+# Triggers the workflow on push or pull request events
+on: [push, pull_request]
+
+#on:
+# push:
+# branches:
+# - master
+# pull_request:
+# branches:
+# - master
+
+defaults:
+ run:
+ working-directory: .
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up JDK 11
+ uses: actions/setup-java@v2
+ with:
+ java-version: '11'
+ distribution: 'adopt'
+ - name: Cache Maven packages
+ uses: actions/cache@v2
+ with:
+ path: ~/.m2
+ key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
+ restore-keys: ${{ runner.os }}-m2
+ - name: Build with Maven
+ run: mvn --batch-mode --update-snapshots install
+ - name: 'Tar files'
+ run: tar -cvf app.tar target/*.jar
+ - uses: actions/upload-artifact@v2
+ with:
+ name: app
+ path: app.tar
+
+ docker:
+ name: docker ms-cloud-config
+ runs-on: ubuntu-latest
+ needs: build
+ if: github.ref == 'refs/heads/master'
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2.3.4
+ # share artifact across jobs
+ - uses: actions/download-artifact@v2
+ with:
+ name: app
+ - name: 'Untar files'
+ run: mkdir -p target && tar -xvf app.tar target
+ # build + push docker img
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v1.1.0
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1.3.0
+ - name: Login to DockerHub
+ uses: docker/login-action@v1.9.0
+ with:
+ username: ${{ secrets.ECR_USERNAME }}
+ password: ${{ secrets.ECR_TOKEN }}
+ - name: Build and push
+ uses: docker/build-push-action@v2.4.0
+ with:
+ context: .
+ push: true
+# tags: 441604169807.dkr.ecr.eu-west-1.amazonaws.com/notejam:${{ github.sha }},441604169807.dkr.ecr.eu-west-1.amazonaws.com/notejam:latest
+ tags: 441604169807.dkr.ecr.eu-west-1.amazonaws.com/notejam:latest
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index aba103733..bccac361c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -59,3 +59,9 @@ bower_components
.bak
+# maven
+target/
+
+#idea
+.idea/
+*.iml
\ No newline at end of file
diff --git a/CA_TECH b/CA_TECH
deleted file mode 100644
index 3ef2665c8..000000000
--- a/CA_TECH
+++ /dev/null
@@ -1,84 +0,0 @@
-#!groovy
-
-node('slave_CA_notejam') {
- /*stage('Clean Environment') {
- cleanWs()
- }
-
- stage('Code Check Out') {
- withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', accessKeyVariable: 'AWS_ACCESS_KEY_ID', credentialsId: 'jenkins-service-account', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
- sh label: '', script: '''git config --global credential.helper \'!aws --profile assume_mobile codecommit credential-helper $@\''''
- */// checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'jenkins-service-codecommit', url: 'https://git-codecommit.eu-central-1.amazonaws.com/v1/repos/ma_android-platform']]])
- /* }
- }*/
-
- /*stage('SonarQube Code Analysis') {
- echo 'Analysing code...'
- withSonarQubeEnv('SonarQube') {
- sh returnStdout: true, script: '''
- gradle wrapper
- ./gradlew sonarqube -x compileDebugAndroidTestKotlin -x compileDebugUnitTestKotlin -Dsonar.host.url=${SONAR_HOST_URL} -Dsonar.projectKey=${JOB_BASE_NAME} -Dsonar.projectName=$JOB_BASE_NAME -Dsonar.projectVersion=1.0-SNAPSHOT
- '''
- sleep 10;
- }
- }*/
-
- stage('SonarQube Code Analysis') {
- echo 'Analysing code...'
- withSonarQubeEnv('SonarQube') {
- sh returnStdout: true, script: '''
- gradle wrapper
- ./gradlew sonarqube -Dsonar.host.url=${SONAR_HOST_URL} -Dsonar.projectKey=${JOB_BASE_NAME} -Dsonar.projectName=$JOB_BASE_NAME -Dsonar.projectVersion=1.0-SNAPSHOT
- '''
- sleep 10;
- }
- }
-
- stage("SonarQube Quality-Gate Validation") {
- echo 'Quality Gate Verification...'
- timeout(time: 1, unit: 'MINUTES') {
- def qg = waitForQualityGate()
- if (qg.status != 'OK') {
- error "Pipeline aborted due to quality gate failure: ${qg.status}"
- }
- }
- }
-
- stage('Build') {
- echo 'Building ..'
- sh returnStdout: true, script: '''
- ./gradlew clean assembleDebug
- '''
- }
-
- stage('Push .APK to Nexus') {
- withEnv([
- 'NEXUS_CREDS=nexus-service-account',
- 'NEXUS_URL=artifacts.le.tnt.bank.ikano',
- 'NEXUS_REPO=maven-snapshots',
- 'NEXUS_PROTOCOL=https',
- 'NEXUS_VERSION=nexus3'
- ]) {
- filesByGlob = findFiles(glob: "app/build/outputs/apk/debug/*.apk");
- artifactPath = filesByGlob[0].path;
- artifactExists = fileExists artifactPath
- if(artifactExists) {
- nexusArtifactUploader(
- nexusVersion: NEXUS_VERSION,
- protocol: NEXUS_PROTOCOL,
- nexusUrl: NEXUS_URL,
- groupId: 'com.ikano.ipay.mobile',
- version: '1.0-SNAPSHOT',
- repository: NEXUS_REPO,
- credentialsId: NEXUS_CREDS,
- artifacts: [
- [artifactId: 'ma_android-platform',
- type: 'apk',
- file: artifactPath,
- classifier: '']
- ]
- )
- }
- }
- }
-}
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 000000000..4f1f5af6e
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,4 @@
+FROM openjdk:8-jdk-alpine
+ARG JAR_FILE=target/*.jar
+COPY ${JAR_FILE} app.jar
+ENTRYPOINT ["java","-jar","/app.jar"]
\ No newline at end of file
diff --git a/README.rst b/README.rst
index 07f28807c..2e3b57aa3 100644
--- a/README.rst
+++ b/README.rst
@@ -1,143 +1,103 @@
-*******
-Notejam
-*******
+***************
+Notejam: Spring
+***************
-**The easy way to learn web frameworks**
+Notejam application implemented using `Spring `_ framework.
-Do you know framework X and want to try framework Y?
-The easy way to start with a new framework is to compare it with frameworks you already know.
-The goal of the project is to help developers easily learn new frameworks by examples.
+Spring version: 4.2.3
-Notejam is a unified sample web application (more than just "Hello World") implemented using different server-side frameworks.
-Currently python, php, ruby and javascript frameworks are supported.
+The full stack is:
+- `Spring Boot `_ (Spring configuration)
+- `Thymeleaf `_ (View)
+- `Spring Security `_ (Security framework)
+- `Spring`_ (DI and MVC framework)
+- `Spring Data `_ (Persistence abstraction)
+- `JPA `_ (Persistence API)
+- `Hibernate `_ (JPA implementation)
-====================
-Supported frameworks
-====================
+The application is maintained by `@malkusch `_.
-**Python**
+==========================
+Installation and launching
+==========================
+-----
+Clone
+-----
-* `Django `_
-* `Flask `_
-* `Pyramid `_
+Clone the repo:
-**PHP**
+.. code-block:: bash
-* `Laravel `_
-* `Yii `_
-* `CakePHP `_
-* `Nette `_ / `Nette + Doctrine `_
-* `Symfony `_
+ $ git clone https://github.com/komarserjio/notejam YOUR_PROJECT_DIR/
-**Ruby**
+-------
+Install
+-------
-* `Padrino `_
-* `Ruby on Rails `_
+Install a `JDK `_ and `Maven `_.
-**Java**
+-------------
+Configuration
+-------------
-* `Spring `_
+The application has a password recovery process which involves sending an email.
+If you want to enable that, you have to create a local application.properties file
+and set there the property spring.mail.host to your SMTP server (e.g. spring.mail.host = smtp.example.net).
-**Javascript (node.js)**
+.. code-block:: bash
-* `Express `_
+ $ cd YOUR_PROJECT_DIR/spring/
+ $ vi application.properties
+See `MailProperties `_
+for more mail properties.
-In progress
------------
+------
+Launch
+------
-**Scala**
+Compile and launch the application:
-* Play
+.. code-block:: bash
-**Clojure**
+ $ cd YOUR_PROJECT_DIR/spring/
+ $ mvn spring-boot:run
-* Compojure
+Go to http://localhost:8080/ in your browser.
-... and more frameworks are coming soon.
+~~~~~~~~~~~~
+Localization
+~~~~~~~~~~~~
-====================
-Application overview
-====================
+This application comes with support for the languages German and English. The locale is
+determined by the Accept-Language request header. If the header is not present the
+content will be served with the default locale of the JVM. The application will not
+start if the default locale is non of the supported languages.
-Notejam is a web application which offers user to sign up/in/out and create/view/edit/delete notes.
-Notes are grouped in pads.
+---------
+Run tests
+---------
-**Screenshots**
+Run functional and unit tests:
-.. image:: https://github.com/komarserjio/notejam/blob/master/html/screenshots/1p.png
- :alt: Sign in
- :width: 400
- :align: center
- :target: https://github.com/komarserjio/notejam/tree/master/screenshots.rst
+.. code-block:: bash
-.. image:: https://github.com/komarserjio/notejam/blob/master/html/screenshots/2p.png
- :alt: All notes
- :width: 400
- :align: center
- :target: https://github.com/komarserjio/notejam/tree/master/screenshots.rst
-
-.. image:: https://github.com/komarserjio/notejam/blob/master/html/screenshots/3p.png
- :alt: New note
- :width: 400
- :align: center
- :target: https://github.com/komarserjio/notejam/tree/master/screenshots.rst
-
-See `more screenshots `_
-for look and feel.
-
-See `detailed overview `_.
-
-Typical application covers following topics:
-
-* Request/Response handling
-* Routing
-* Templates
-* Configuration
-* Authentication
-* Forms
-* Error handling
-* Database/ORM
-* Mailing
-* Functional/unit testing
-
-=============
-How to launch
-=============
-
-All implementations are SQLite based and quickly launchable by built-in web servers.
-Each implementation has instruction describing easy steps to install environment, launch and run tests.
+ $ cd YOUR_PROJECT_DIR/spring/
+ $ mvn test
============
Contribution
============
-Contribution is more than welcome!
-Contribute improvements to existing applications to help them follow best practices
-or provide new implementation for unsupported framework.
+Do you have Java/Spring experience? Help the application to follow Java and Spring best practices.
+Please send your pull requests in the ``master`` branch.
+Always prepend your commits with framework name:
-**Do you want to improve one of the existing implementations?**
+.. code-block:: bash
-Each implementation has its own README with contribution details.
-
-**Do you want to add new framework?**
+ Spring: Implement sign in functionality
Read `contribution guide `_ for details.
-
-========
-Contacts
-========
-
-* Twitter: `@komarserjio `_
-* Email: komarserjio gmail.com
-
-=======
-License
-=======
-
-MIT © Serhii Komar.
-
-See `license `_.
diff --git a/cakephp/README.rst b/cakephp/README.rst
deleted file mode 100644
index 606fd5e89..000000000
--- a/cakephp/README.rst
+++ /dev/null
@@ -1,88 +0,0 @@
-****************
-Notejam: CakePHP
-****************
-
-Notejam application implemented using `CakePHP `_ framework.
-
-CakePHP version: 3.1
-
-PHP version required: 5.5+
-
-==========================
-Installation and launching
-==========================
-
------
-Clone
------
-
-Clone the repo:
-
-.. code-block:: bash
-
- $ git clone git@github.com:komarserjio/notejam.git YOUR_PROJECT_DIR/
-
--------
-Install
--------
-
-Install `composer `_
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/cakephp/notejam
- $ curl -s https://getcomposer.org/installer | php
-
-Install dependencies
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/cakephp/notejam
- $ php composer.phar install
-
-Create database schema
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/cakephp/notejam
- $ ./bin/cake migrations migrate
-
-
-------
-Launch
-------
-
-Start built-in php web server:
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/cakephp/notejam
- $ ./bin/cake server
-
-Go to http://localhost:8765 in your browser.
-
----------
-Run tests
----------
-
-Run functional tests:
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/cakephp/notejam/
- $ ./vendor/bin/phpunit
-
-
-============
-Contribution
-============
-Do you have CakePHP experience? Help the app to follow PHP and CakePHP best practices.
-
-Please send your pull requests in the ``master`` branch.
-Always prepend your commits with framework name:
-
-.. code-block:: bash
-
- CakePHP: Implemented sign in functionality
-
-Read `contribution guide `_ for details.
diff --git a/cakephp/notejam/.editorconfig b/cakephp/notejam/.editorconfig
deleted file mode 100644
index 706190175..000000000
--- a/cakephp/notejam/.editorconfig
+++ /dev/null
@@ -1,18 +0,0 @@
-; This file is for unifying the coding style for different editors and IDEs.
-; More information at http://editorconfig.org
-
-root = true
-
-[*]
-indent_style = space
-indent_size = 4
-end_of_line = lf
-insert_final_newline = true
-trim_trailing_whitespace = true
-
-[*.bat]
-end_of_line = crlf
-
-[*.yml]
-indent_style = space
-indent_size = 2
diff --git a/cakephp/notejam/.gitattributes b/cakephp/notejam/.gitattributes
deleted file mode 100644
index 926a808fc..000000000
--- a/cakephp/notejam/.gitattributes
+++ /dev/null
@@ -1,36 +0,0 @@
-# Define the line ending behavior of the different file extensions
-# Set default behaviour, in case users don't have core.autocrlf set.
-* text=auto
-* text eol=lf
-
-# Explicitly declare text files we want to always be normalized and converted
-# to native line endings on checkout.
-*.php text
-*.default text
-*.ctp text
-*.sql text
-*.md text
-*.po text
-*.js text
-*.css text
-*.ini text
-*.properties text
-*.txt text
-*.xml text
-*.yml text
-.htaccess text
-
-# Declare files that will always have CRLF line endings on checkout.
-*.bat eol=crlf
-
-# Declare files that will always have LF line endings on checkout.
-*.pem eol=lf
-
-# Denote all files that are truly binary and should not be modified.
-*.png binary
-*.jpg binary
-*.gif binary
-*.ico binary
-*.mo binary
-*.pdf binary
-*.phar binary
diff --git a/cakephp/notejam/.gitignore b/cakephp/notejam/.gitignore
deleted file mode 100644
index 46bc8c5c9..000000000
--- a/cakephp/notejam/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/vendor/*
-/tmp/*
-/logs/*
-composer.lock
diff --git a/cakephp/notejam/.htaccess b/cakephp/notejam/.htaccess
deleted file mode 100644
index fc3aac4b2..000000000
--- a/cakephp/notejam/.htaccess
+++ /dev/null
@@ -1,5 +0,0 @@
-
- RewriteEngine on
- RewriteRule ^$ webroot/ [L]
- RewriteRule (.*) webroot/$1 [L]
-
\ No newline at end of file
diff --git a/cakephp/notejam/.travis.yml b/cakephp/notejam/.travis.yml
deleted file mode 100644
index b9b337904..000000000
--- a/cakephp/notejam/.travis.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-language: php
-
-sudo: false
-
-php:
- - 5.4
- - 5.5
- - 5.6
-
-before_script:
- - sh -c "composer require 'cakephp/cakephp-codesniffer:dev-master'"
- - phpenv rehash
-
-script:
- - sh -c "vendor/bin/phpcs -p --extensions=php --standard=vendor/cakephp/cakephp-codesniffer/CakePHP ./src ./tests ./config ./webroot"
-
-notifications:
- email: false
diff --git a/cakephp/notejam/bin/cake b/cakephp/notejam/bin/cake
deleted file mode 100755
index ffdacace9..000000000
--- a/cakephp/notejam/bin/cake
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/env bash
-################################################################################
-#
-# Bake is a shell script for running CakePHP bake script
-#
-# CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
-# Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
-#
-# Licensed under The MIT License
-# For full copyright and license information, please see the LICENSE.txt
-# Redistributions of files must retain the above copyright notice.
-#
-# @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
-# @link http://cakephp.org CakePHP(tm) Project
-# @since 1.2.0
-# @license http://www.opensource.org/licenses/mit-license.php MIT License
-#
-################################################################################
-
-# Canonicalize by following every symlink of the given name recursively
-canonicalize() {
- NAME="$1"
- if [ -f "$NAME" ]
- then
- DIR=$(dirname -- "$NAME")
- NAME=$(cd -P "$DIR" > /dev/null && pwd -P)/$(basename -- "$NAME")
- fi
- while [ -h "$NAME" ]; do
- DIR=$(dirname -- "$NAME")
- SYM=$(readlink "$NAME")
- NAME=$(cd "$DIR" > /dev/null && cd $(dirname -- "$SYM") > /dev/null && pwd)/$(basename -- "$SYM")
- done
- echo "$NAME"
-}
-
-CONSOLE=$(dirname -- "$(canonicalize "$0")")
-APP=$(dirname "$CONSOLE")
-
-exec php "$CONSOLE"/cake.php "$@"
-exit
diff --git a/cakephp/notejam/bin/cake.bat b/cakephp/notejam/bin/cake.bat
deleted file mode 100644
index dd1d9a821..000000000
--- a/cakephp/notejam/bin/cake.bat
+++ /dev/null
@@ -1,30 +0,0 @@
-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
-::
-:: Bake is a shell script for running CakePHP bake script
-::
-:: CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
-:: Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
-::
-:: Licensed under The MIT License
-:: Redistributions of files must retain the above copyright notice.
-::
-:: @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
-:: @link http://cakephp.org CakePHP(tm) Project
-:: @since 2.0.0
-:: @license http://www.opensource.org/licenses/mit-license.php MIT License
-::
-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
-
-:: In order for this script to work as intended, the cake\console\ folder must be in your PATH
-
-@echo.
-@echo off
-
-SET app=%0
-SET lib=%~dp0
-
-php "%lib%cake.php" %*
-
-echo.
-
-exit /B %ERRORLEVEL%
diff --git a/cakephp/notejam/bin/cake.php b/cakephp/notejam/bin/cake.php
deleted file mode 100644
index 4c7d7cef8..000000000
--- a/cakephp/notejam/bin/cake.php
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/php -q
-require->php)) {
- $minVersion = preg_replace('/([^0-9\.])/', '', $composer->require->php);
- }
-}
-if (version_compare(phpversion(), $minVersion, '<')) {
- fwrite(STDERR, sprintf("Minimum PHP version: %s. You are using: %s.\n", $minVersion, phpversion()));
- exit(-1);
-}
-
-include dirname(__DIR__) . '/config/bootstrap.php';
-
-exit(Cake\Console\ShellDispatcher::run($argv));
diff --git a/cakephp/notejam/composer.json b/cakephp/notejam/composer.json
deleted file mode 100644
index 6f1107153..000000000
--- a/cakephp/notejam/composer.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "name": "cakephp/app",
- "description": "Notejam app",
- "homepage": "https://github.com/komarserjio/notejam",
- "type": "project",
- "license": "MIT",
- "require": {
- "php": ">=5.6.0",
- "cakephp/cakephp": "^3.5",
- "mobiledetect/mobiledetectlib": "2.*",
- "cakephp/migrations": "~1.0",
- "cakephp/plugin-installer": "*"
- },
- "require-dev": {
- "psy/psysh": "@stable",
- "cakephp/debug_kit": "~3.0",
- "cakephp/bake": "~1.0",
- "phpunit/phpunit": "^5.7|^6.0"
- },
- "suggest": {
- "phpunit/phpunit": "Allows automated tests to be run without system-wide install.",
- "cakephp/cakephp-codesniffer": "Allows to check the code against the coding standards used in CakePHP."
- },
- "autoload": {
- "psr-4": {
- "App\\": "src"
- }
- },
- "autoload-dev": {
- "psr-4": {
- "App\\Test\\": "tests",
- "Cake\\Test\\": "./vendor/cakephp/cakephp/tests"
- }
- },
- "scripts": {
- "post-install-cmd": "App\\Console\\Installer::postInstall",
- "post-autoload-dump": "Cake\\Composer\\Installer\\PluginInstaller::postAutoloadDump"
- },
- "minimum-stability": "dev",
- "prefer-stable": true
-}
diff --git a/cakephp/notejam/config/Migrations/20150928200943_initial.php b/cakephp/notejam/config/Migrations/20150928200943_initial.php
deleted file mode 100644
index 7ba3488b1..000000000
--- a/cakephp/notejam/config/Migrations/20150928200943_initial.php
+++ /dev/null
@@ -1,141 +0,0 @@
-table('notes');
- $table
- ->addColumn('pad_id', 'integer', [
- 'default' => null,
- 'limit' => null,
- 'null' => true,
- ])
- ->addColumn('user_id', 'integer', [
- 'default' => null,
- 'limit' => null,
- 'null' => false,
- ])
- ->addColumn('name', 'string', [
- 'default' => null,
- 'limit' => 100,
- 'null' => false,
- ])
- ->addColumn('text', 'text', [
- 'default' => null,
- 'limit' => null,
- 'null' => false,
- ])
- ->addColumn('created_at', 'datetime', [
- 'default' => null,
- 'limit' => null,
- 'null' => false,
- ])
- ->addColumn('updated_at', 'datetime', [
- 'default' => null,
- 'limit' => null,
- 'null' => false,
- ])
- ->addIndex(
- [
- 'pad_id',
- ]
- )
- ->addIndex(
- [
- 'user_id',
- ]
- )
- ->create();
-
- $table = $this->table('pads');
- $table
- ->addColumn('name', 'string', [
- 'default' => null,
- 'limit' => 100,
- 'null' => false,
- ])
- ->addColumn('user_id', 'integer', [
- 'default' => null,
- 'limit' => null,
- 'null' => false,
- ])
- ->addIndex(
- [
- 'user_id',
- ]
- )
- ->create();
-
- $table = $this->table('users');
- $table
- ->addColumn('email', 'string', [
- 'default' => null,
- 'limit' => 75,
- 'null' => false,
- ])
- ->addColumn('password', 'string', [
- 'default' => null,
- 'limit' => 128,
- 'null' => false,
- ])
- ->create();
-
- $this->table('notes')
- ->addForeignKey(
- 'pad_id',
- 'pads',
- 'id',
- [
- 'update' => 'NO_ACTION',
- 'delete' => 'NO_ACTION'
- ]
- )
- ->addForeignKey(
- 'user_id',
- 'users',
- 'id',
- [
- 'update' => 'NO_ACTION',
- 'delete' => 'NO_ACTION'
- ]
- )
- ->update();
-
- $this->table('pads')
- ->addForeignKey(
- 'user_id',
- 'users',
- 'id',
- [
- 'update' => 'NO_ACTION',
- 'delete' => 'NO_ACTION'
- ]
- )
- ->update();
-
- }
-
- public function down()
- {
- $this->table('notes')
- ->dropForeignKey(
- 'pad_id'
- )
- ->dropForeignKey(
- 'user_id'
- )
- ->update();
-
- $this->table('pads')
- ->dropForeignKey(
- 'user_id'
- )
- ->update();
-
- $this->dropTable('notes');
- $this->dropTable('pads');
- $this->dropTable('users');
- }
-}
diff --git a/cakephp/notejam/config/app.default.php b/cakephp/notejam/config/app.default.php
deleted file mode 100644
index 52722ccaf..000000000
--- a/cakephp/notejam/config/app.default.php
+++ /dev/null
@@ -1,326 +0,0 @@
- true,
-
- /**
- * Configure basic information about the application.
- *
- * - namespace - The namespace to find app classes under.
- * - encoding - The encoding used for HTML + database connections.
- * - base - The base directory the app resides in. If false this
- * will be auto detected.
- * - dir - Name of app directory.
- * - webroot - The webroot directory.
- * - wwwRoot - The file path to webroot.
- * - baseUrl - To configure CakePHP to *not* use mod_rewrite and to
- * use CakePHP pretty URLs, remove these .htaccess
- * files:
- * /.htaccess
- * /webroot/.htaccess
- * And uncomment the baseUrl key below.
- * - fullBaseUrl - A base URL to use for absolute links.
- * - imageBaseUrl - Web path to the public images directory under webroot.
- * - cssBaseUrl - Web path to the public css directory under webroot.
- * - jsBaseUrl - Web path to the public js directory under webroot.
- * - paths - Configure paths for non class based resources. Supports the
- * `plugins`, `templates`, `locales` subkeys, which allow the definition of
- * paths for plugins, view templates and locale files respectively.
- */
- 'App' => [
- 'namespace' => 'App',
- 'encoding' => 'UTF-8',
- 'base' => false,
- 'dir' => 'src',
- 'webroot' => 'webroot',
- 'wwwRoot' => WWW_ROOT,
- // 'baseUrl' => env('SCRIPT_NAME'),
- 'fullBaseUrl' => false,
- 'imageBaseUrl' => 'img/',
- 'cssBaseUrl' => 'css/',
- 'jsBaseUrl' => 'js/',
- 'paths' => [
- 'plugins' => [ROOT . DS . 'plugins' . DS],
- 'templates' => [APP . 'Template' . DS],
- 'locales' => [APP . 'Locale' . DS],
- ],
- ],
-
- /**
- * Security and encryption configuration
- *
- * - salt - A random string used in security hashing methods.
- * The salt value is also used as the encryption key.
- * You should treat it as extremely sensitive data.
- */
- 'Security' => [
- 'salt' => '__SALT__',
- ],
-
- /**
- * Apply timestamps with the last modified time to static assets (js, css, images).
- * Will append a querystring parameter containing the time the file was modified.
- * This is useful for busting browser caches.
- *
- * Set to true to apply timestamps when debug is true. Set to 'force' to always
- * enable timestamping regardless of debug value.
- */
- 'Asset' => [
- // 'timestamp' => true,
- ],
-
- /**
- * Configure the cache adapters.
- */
- 'Cache' => [
- 'default' => [
- 'className' => 'File',
- 'path' => CACHE,
- ],
-
- /**
- * Configure the cache used for general framework caching. Path information,
- * object listings, and translation cache files are stored with this
- * configuration.
- */
- '_cake_core_' => [
- 'className' => 'File',
- 'prefix' => 'myapp_cake_core_',
- 'path' => CACHE . 'persistent/',
- 'serialize' => true,
- 'duration' => '+2 minutes',
- ],
-
- /**
- * Configure the cache for model and datasource caches. This cache
- * configuration is used to store schema descriptions, and table listings
- * in connections.
- */
- '_cake_model_' => [
- 'className' => 'File',
- 'prefix' => 'myapp_cake_model_',
- 'path' => CACHE . 'models/',
- 'serialize' => true,
- 'duration' => '+2 minutes',
- ],
- ],
-
- /**
- * Configure the Error and Exception handlers used by your application.
- *
- * By default errors are displayed using Debugger, when debug is true and logged
- * by Cake\Log\Log when debug is false.
- *
- * In CLI environments exceptions will be printed to stderr with a backtrace.
- * In web environments an HTML page will be displayed for the exception.
- * With debug true, framework errors like Missing Controller will be displayed.
- * When debug is false, framework errors will be coerced into generic HTTP errors.
- *
- * Options:
- *
- * - `errorLevel` - int - The level of errors you are interested in capturing.
- * - `trace` - boolean - Whether or not backtraces should be included in
- * logged errors/exceptions.
- * - `log` - boolean - Whether or not you want exceptions logged.
- * - `exceptionRenderer` - string - The class responsible for rendering
- * uncaught exceptions. If you choose a custom class you should place
- * the file for that class in src/Error. This class needs to implement a
- * render method.
- * - `skipLog` - array - List of exceptions to skip for logging. Exceptions that
- * extend one of the listed exceptions will also be skipped for logging.
- * E.g.:
- * `'skipLog' => ['Cake\Network\Exception\NotFoundException', 'Cake\Network\Exception\UnauthorizedException']`
- */
- 'Error' => [
- 'errorLevel' => E_ALL & ~E_DEPRECATED,
- 'exceptionRenderer' => 'Cake\Error\ExceptionRenderer',
- 'skipLog' => [],
- 'log' => true,
- 'trace' => true,
- ],
-
- /**
- * Email configuration.
- *
- * You can configure email transports and email delivery profiles here.
- *
- * By defining transports separately from delivery profiles you can easily
- * re-use transport configuration across multiple profiles.
- *
- * You can specify multiple configurations for production, development and
- * testing.
- *
- * ### Configuring transports
- *
- * Each transport needs a `className`. Valid options are as follows:
- *
- * Mail - Send using PHP mail function
- * Smtp - Send using SMTP
- * Debug - Do not send the email, just return the result
- *
- * You can add custom transports (or override existing transports) by adding the
- * appropriate file to src/Network/Email. Transports should be named
- * 'YourTransport.php', where 'Your' is the name of the transport.
- *
- * ### Configuring delivery profiles
- *
- * Delivery profiles allow you to predefine various properties about email
- * messages from your application and give the settings a name. This saves
- * duplication across your application and makes maintenance and development
- * easier. Each profile accepts a number of keys. See `Cake\Network\Email\Email`
- * for more information.
- */
- 'EmailTransport' => [
- 'default' => [
- 'className' => 'Mail',
- // The following keys are used in SMTP transports
- 'host' => 'localhost',
- 'port' => 25,
- 'timeout' => 30,
- 'username' => 'user',
- 'password' => 'secret',
- 'client' => null,
- 'tls' => null,
- ],
- ],
-
- 'Email' => [
- 'default' => [
- 'transport' => 'default',
- 'from' => 'you@localhost',
- //'charset' => 'utf-8',
- //'headerCharset' => 'utf-8',
- ],
- ],
-
- /**
- * Connection information used by the ORM to connect
- * to your application's datastores.
- * Drivers include Mysql Postgres Sqlite Sqlserver
- * See vendor\cakephp\cakephp\src\Database\Driver for complete list
- */
- 'Datasources' => [
- 'default' => [
- 'className' => 'Cake\Database\Connection',
- 'driver' => 'Cake\Database\Driver\Mysql',
- 'persistent' => false,
- 'host' => 'localhost',
- /**
- * CakePHP will use the default DB port based on the driver selected
- * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
- * the following line and set the port accordingly
- */
- //'port' => 'nonstandard_port_number',
- 'username' => 'my_app',
- 'password' => 'secret',
- 'database' => 'my_app',
- 'encoding' => 'utf8',
- 'timezone' => 'UTC',
- 'cacheMetadata' => true,
-
- /**
- * Set identifier quoting to true if you are using reserved words or
- * special characters in your table or column names. Enabling this
- * setting will result in queries built using the Query Builder having
- * identifiers quoted when creating SQL. It should be noted that this
- * decreases performance because each query needs to be traversed and
- * manipulated before being executed.
- */
- 'quoteIdentifiers' => false,
-
- /**
- * During development, if using MySQL < 5.6, uncommenting the
- * following line could boost the speed at which schema metadata is
- * fetched from the database. It can also be set directly with the
- * mysql configuration directive 'innodb_stats_on_metadata = 0'
- * which is the recommended value in production environments
- */
- //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
- ],
-
- /**
- * The test connection is used during the test suite.
- */
- 'test' => [
- 'className' => 'Cake\Database\Connection',
- 'driver' => 'Cake\Database\Driver\Mysql',
- 'persistent' => false,
- 'host' => 'localhost',
- //'port' => 'nonstandard_port_number',
- 'username' => 'my_app',
- 'password' => 'secret',
- 'database' => 'test_myapp',
- 'encoding' => 'utf8',
- 'timezone' => 'UTC',
- 'cacheMetadata' => true,
- 'quoteIdentifiers' => false,
- //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
- ],
- ],
-
- /**
- * Configures logging options
- */
- 'Log' => [
- 'debug' => [
- 'className' => 'Cake\Log\Engine\FileLog',
- 'path' => LOGS,
- 'file' => 'debug',
- 'levels' => ['notice', 'info', 'debug'],
- ],
- 'error' => [
- 'className' => 'Cake\Log\Engine\FileLog',
- 'path' => LOGS,
- 'file' => 'error',
- 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
- ],
- ],
-
- /**
- *
- * Session configuration.
- *
- * Contains an array of settings to use for session configuration. The
- * `defaults` key is used to define a default preset to use for sessions, any
- * settings declared here will override the settings of the default config.
- *
- * ## Options
- *
- * - `cookie` - The name of the cookie to use. Defaults to 'CAKEPHP'.
- * - `cookiePath` - The url path for which session cookie is set. Maps to the
- * `session.cookie_path` php.ini config. Defaults to base path of app.
- * - `timeout` - The time in minutes the session should be valid for.
- * Pass 0 to disable checking timeout.
- * - `defaults` - The default configuration set to use as a basis for your session.
- * There are four built-in options: php, cake, cache, database.
- * - `handler` - Can be used to enable a custom session handler. Expects an
- * array with at least the `engine` key, being the name of the Session engine
- * class to use for managing the session. CakePHP bundles the `CacheSession`
- * and `DatabaseSession` engines.
- * - `ini` - An associative array of additional ini values to set.
- *
- * The built-in `defaults` options are:
- *
- * - 'php' - Uses settings defined in your php.ini.
- * - 'cake' - Saves session files in CakePHP's /tmp directory.
- * - 'database' - Uses CakePHP's database sessions.
- * - 'cache' - Use the Cache class to save sessions.
- *
- * To define a custom session handler, save it at src/Network/Session/.php.
- * Make sure the class implements PHP's `SessionHandlerInterface` and set
- * Session.handler to
- *
- * To use database sessions, load the SQL file located at config/Schema/sessions.sql
- */
- 'Session' => [
- 'defaults' => 'php',
- ],
-];
diff --git a/cakephp/notejam/config/app.php b/cakephp/notejam/config/app.php
deleted file mode 100644
index 3c36cdb55..000000000
--- a/cakephp/notejam/config/app.php
+++ /dev/null
@@ -1,313 +0,0 @@
- true,
-
- /**
- * Configure basic information about the application.
- *
- * - namespace - The namespace to find app classes under.
- * - encoding - The encoding used for HTML + database connections.
- * - base - The base directory the app resides in. If false this
- * will be auto detected.
- * - dir - Name of app directory.
- * - webroot - The webroot directory.
- * - wwwRoot - The file path to webroot.
- * - baseUrl - To configure CakePHP to *not* use mod_rewrite and to
- * use CakePHP pretty URLs, remove these .htaccess
- * files:
- * /.htaccess
- * /webroot/.htaccess
- * And uncomment the baseUrl key below.
- * - fullBaseUrl - A base URL to use for absolute links.
- * - imageBaseUrl - Web path to the public images directory under webroot.
- * - cssBaseUrl - Web path to the public css directory under webroot.
- * - jsBaseUrl - Web path to the public js directory under webroot.
- * - paths - Configure paths for non class based resources. Supports the
- * `plugins`, `templates`, `locales` subkeys, which allow the definition of
- * paths for plugins, view templates and locale files respectively.
- */
- 'App' => [
- 'namespace' => 'App',
- 'encoding' => 'UTF-8',
- 'base' => false,
- 'dir' => 'src',
- 'webroot' => 'webroot',
- 'wwwRoot' => WWW_ROOT,
- // 'baseUrl' => env('SCRIPT_NAME'),
- 'fullBaseUrl' => false,
- 'imageBaseUrl' => 'img/',
- 'cssBaseUrl' => 'css/',
- 'jsBaseUrl' => 'js/',
- 'paths' => [
- 'plugins' => [ROOT . DS . 'plugins' . DS],
- 'templates' => [APP . 'Template' . DS],
- 'locales' => [APP . 'Locale' . DS],
- ],
- ],
-
- /**
- * Security and encryption configuration
- *
- * - salt - A random string used in security hashing methods.
- * The salt value is also used as the encryption key.
- * You should treat it as extremely sensitive data.
- */
- 'Security' => [
- 'salt' => '5a7f2d28c26b43c1eca92cd2fabb1a18bbba049f43799f6399f701a0c3f074d3',
- ],
-
- /**
- * Apply timestamps with the last modified time to static assets (js, css, images).
- * Will append a querystring parameter containing the time the file was modified.
- * This is useful for busting browser caches.
- *
- * Set to true to apply timestamps when debug is true. Set to 'force' to always
- * enable timestamping regardless of debug value.
- */
- 'Asset' => [
- // 'timestamp' => true,
- ],
-
- /**
- * Configure the cache adapters.
- */
- 'Cache' => [
- 'default' => [
- 'className' => 'File',
- 'path' => CACHE,
- ],
-
- /**
- * Configure the cache used for general framework caching. Path information,
- * object listings, and translation cache files are stored with this
- * configuration.
- */
- '_cake_core_' => [
- 'className' => 'File',
- 'prefix' => 'myapp_cake_core_',
- 'path' => CACHE . 'persistent/',
- 'serialize' => true,
- 'duration' => '+2 minutes',
- ],
-
- /**
- * Configure the cache for model and datasource caches. This cache
- * configuration is used to store schema descriptions, and table listings
- * in connections.
- */
- '_cake_model_' => [
- 'className' => 'File',
- 'prefix' => 'myapp_cake_model_',
- 'path' => CACHE . 'models/',
- 'serialize' => true,
- 'duration' => '+2 minutes',
- ],
- ],
-
- /**
- * Configure the Error and Exception handlers used by your application.
- *
- * By default errors are displayed using Debugger, when debug is true and logged
- * by Cake\Log\Log when debug is false.
- *
- * In CLI environments exceptions will be printed to stderr with a backtrace.
- * In web environments an HTML page will be displayed for the exception.
- * With debug true, framework errors like Missing Controller will be displayed.
- * When debug is false, framework errors will be coerced into generic HTTP errors.
- *
- * Options:
- *
- * - `errorLevel` - int - The level of errors you are interested in capturing.
- * - `trace` - boolean - Whether or not backtraces should be included in
- * logged errors/exceptions.
- * - `log` - boolean - Whether or not you want exceptions logged.
- * - `exceptionRenderer` - string - The class responsible for rendering
- * uncaught exceptions. If you choose a custom class you should place
- * the file for that class in src/Error. This class needs to implement a
- * render method.
- * - `skipLog` - array - List of exceptions to skip for logging. Exceptions that
- * extend one of the listed exceptions will also be skipped for logging.
- * E.g.:
- * `'skipLog' => ['Cake\Network\Exception\NotFoundException', 'Cake\Network\Exception\UnauthorizedException']`
- */
- 'Error' => [
- 'errorLevel' => E_ALL & ~E_DEPRECATED,
- 'exceptionRenderer' => 'Cake\Error\ExceptionRenderer',
- 'skipLog' => [],
- 'log' => true,
- 'trace' => true,
- ],
-
- /**
- * Email configuration.
- *
- * You can configure email transports and email delivery profiles here.
- *
- * By defining transports separately from delivery profiles you can easily
- * re-use transport configuration across multiple profiles.
- *
- * You can specify multiple configurations for production, development and
- * testing.
- *
- * ### Configuring transports
- *
- * Each transport needs a `className`. Valid options are as follows:
- *
- * Mail - Send using PHP mail function
- * Smtp - Send using SMTP
- * Debug - Do not send the email, just return the result
- *
- * You can add custom transports (or override existing transports) by adding the
- * appropriate file to src/Network/Email. Transports should be named
- * 'YourTransport.php', where 'Your' is the name of the transport.
- *
- * ### Configuring delivery profiles
- *
- * Delivery profiles allow you to predefine various properties about email
- * messages from your application and give the settings a name. This saves
- * duplication across your application and makes maintenance and development
- * easier. Each profile accepts a number of keys. See `Cake\Network\Email\Email`
- * for more information.
- */
- 'EmailTransport' => [
- 'default' => [
- 'className' => 'Mail',
- // The following keys are used in SMTP transports
- 'host' => 'localhost',
- 'port' => 25,
- 'timeout' => 30,
- 'username' => 'user',
- 'password' => 'secret',
- 'client' => null,
- 'tls' => null,
- ],
- ],
-
- 'Email' => [
- 'default' => [
- 'transport' => 'default',
- 'from' => 'you@localhost',
- //'charset' => 'utf-8',
- //'headerCharset' => 'utf-8',
- ],
- ],
-
- /**
- * Connection information used by the ORM to connect
- * to your application's datastores.
- * Drivers include Mysql Postgres Sqlite Sqlserver
- * See vendor\cakephp\cakephp\src\Database\Driver for complete list
- */
- 'Datasources' => [
- 'default' => [
- 'className' => 'Cake\Database\Connection',
- 'driver' => 'Cake\Database\Driver\Sqlite',
- 'persistent' => false,
- 'database' => 'notejam.db',
- 'encoding' => 'utf8',
- 'timezone' => 'UTC',
- 'cacheMetadata' => true,
-
- /**
- * Set identifier quoting to true if you are using reserved words or
- * special characters in your table or column names. Enabling this
- * setting will result in queries built using the Query Builder having
- * identifiers quoted when creating SQL. It should be noted that this
- * decreases performance because each query needs to be traversed and
- * manipulated before being executed.
- */
- 'quoteIdentifiers' => false,
-
- /**
- * During development, if using MySQL < 5.6, uncommenting the
- * following line could boost the speed at which schema metadata is
- * fetched from the database. It can also be set directly with the
- * mysql configuration directive 'innodb_stats_on_metadata = 0'
- * which is the recommended value in production environments
- */
- //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
- ],
-
- /**
- * The test connection is used during the test suite.
- */
- 'test' => [
- 'className' => 'Cake\Database\Connection',
- 'driver' => 'Cake\Database\Driver\Sqlite',
- 'persistent' => false,
- 'database' => 'tests/notejam.db',
- 'encoding' => 'utf8',
- 'timezone' => 'UTC',
- 'cacheMetadata' => true,
- 'quoteIdentifiers' => false,
- //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
- ],
- ],
-
- /**
- * Configures logging options
- */
- 'Log' => [
- 'debug' => [
- 'className' => 'Cake\Log\Engine\FileLog',
- 'path' => LOGS,
- 'file' => 'debug',
- 'levels' => ['notice', 'info', 'debug'],
- ],
- 'error' => [
- 'className' => 'Cake\Log\Engine\FileLog',
- 'path' => LOGS,
- 'file' => 'error',
- 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
- ],
- ],
-
- /**
- *
- * Session configuration.
- *
- * Contains an array of settings to use for session configuration. The
- * `defaults` key is used to define a default preset to use for sessions, any
- * settings declared here will override the settings of the default config.
- *
- * ## Options
- *
- * - `cookie` - The name of the cookie to use. Defaults to 'CAKEPHP'.
- * - `cookiePath` - The url path for which session cookie is set. Maps to the
- * `session.cookie_path` php.ini config. Defaults to base path of app.
- * - `timeout` - The time in minutes the session should be valid for.
- * Pass 0 to disable checking timeout.
- * - `defaults` - The default configuration set to use as a basis for your session.
- * There are four built-in options: php, cake, cache, database.
- * - `handler` - Can be used to enable a custom session handler. Expects an
- * array with at least the `engine` key, being the name of the Session engine
- * class to use for managing the session. CakePHP bundles the `CacheSession`
- * and `DatabaseSession` engines.
- * - `ini` - An associative array of additional ini values to set.
- *
- * The built-in `defaults` options are:
- *
- * - 'php' - Uses settings defined in your php.ini.
- * - 'cake' - Saves session files in CakePHP's /tmp directory.
- * - 'database' - Uses CakePHP's database sessions.
- * - 'cache' - Use the Cache class to save sessions.
- *
- * To define a custom session handler, save it at src/Network/Session/.php.
- * Make sure the class implements PHP's `SessionHandlerInterface` and set
- * Session.handler to
- *
- * To use database sessions, load the SQL file located at config/Schema/sessions.sql
- */
- 'Session' => [
- 'defaults' => 'php',
- ],
-];
diff --git a/cakephp/notejam/config/bootstrap.php b/cakephp/notejam/config/bootstrap.php
deleted file mode 100644
index 62d662ece..000000000
--- a/cakephp/notejam/config/bootstrap.php
+++ /dev/null
@@ -1,202 +0,0 @@
-getMessage() . "\n");
-}
-
-// Load an environment local configuration file.
-// You can use a file like app_local.php to provide local overrides to your
-// shared configuration.
-//Configure::load('app_local', 'default');
-
-// When debug = false the metadata cache should last
-// for a very very long time, as we don't want
-// to refresh the cache while users are doing requests.
-if (!Configure::read('debug')) {
- Configure::write('Cache._cake_model_.duration', '+1 years');
- Configure::write('Cache._cake_core_.duration', '+1 years');
-}
-
-/**
- * Set server timezone to UTC. You can change it to another timezone of your
- * choice but using UTC makes time calculations / conversions easier.
- */
-date_default_timezone_set('UTC');
-
-/**
- * Configure the mbstring extension to use the correct encoding.
- */
-mb_internal_encoding(Configure::read('App.encoding'));
-
-/**
- * Set the default locale. This controls how dates, number and currency is
- * formatted and sets the default language to use for translations.
- */
-ini_set('intl.default_locale', 'en_US');
-
-/**
- * Register application error and exception handlers.
- */
-$isCli = php_sapi_name() === 'cli';
-if ($isCli) {
- (new ConsoleErrorHandler(Configure::read('Error')))->register();
-} else {
- (new ErrorHandler(Configure::read('Error')))->register();
-}
-
-// Include the CLI bootstrap overrides.
-if ($isCli) {
- require __DIR__ . '/bootstrap_cli.php';
-}
-
-/**
- * Set the full base URL.
- * This URL is used as the base of all absolute links.
- *
- * If you define fullBaseUrl in your config file you can remove this.
- */
-if (!Configure::read('App.fullBaseUrl')) {
- $s = null;
- if (env('HTTPS')) {
- $s = 's';
- }
-
- $httpHost = env('HTTP_HOST');
- if (isset($httpHost)) {
- Configure::write('App.fullBaseUrl', 'http' . $s . '://' . $httpHost);
- }
- unset($httpHost, $s);
-}
-
-Cache::config(Configure::consume('Cache'));
-ConnectionManager::config(Configure::consume('Datasources'));
-Email::configTransport(Configure::consume('EmailTransport'));
-Email::config(Configure::consume('Email'));
-Log::config(Configure::consume('Log'));
-Security::salt(Configure::consume('Security.salt'));
-
-/**
- * The default crypto extension in 3.0 is OpenSSL.
- * If you are migrating from 2.x uncomment this code to
- * use a more compatible Mcrypt based implementation
- */
-// Security::engine(new \Cake\Utility\Crypto\Mcrypt());
-
-/**
- * Setup detectors for mobile and tablet.
- */
-Request::addDetector('mobile', function ($request) {
- $detector = new \Detection\MobileDetect();
- return $detector->isMobile();
-});
-Request::addDetector('tablet', function ($request) {
- $detector = new \Detection\MobileDetect();
- return $detector->isTablet();
-});
-
-/**
- * Custom Inflector rules, can be set to correctly pluralize or singularize
- * table, model, controller names or whatever other string is passed to the
- * inflection functions.
- *
- * Inflector::rules('plural', ['/^(inflect)or$/i' => '\1ables']);
- * Inflector::rules('irregular', ['red' => 'redlings']);
- * Inflector::rules('uninflected', ['dontinflectme']);
- * Inflector::rules('transliteration', ['/Ã¥/' => 'aa']);
- */
-
-/**
- * Plugins need to be loaded manually, you can either load them one by one or all of them in a single call
- * Uncomment one of the lines below, as you need. make sure you read the documentation on Plugin to use more
- * advanced ways of loading plugins
- *
- * Plugin::loadAll(); // Loads all plugins at once
- * Plugin::load('Migrations'); //Loads a single plugin named Migrations
- *
- */
-
-Plugin::load('Migrations');
-
-// Only try to load DebugKit in development mode
-// Debug Kit should not be installed on a production system
-if (Configure::read('debug')) {
- Plugin::load('DebugKit', ['bootstrap' => true]);
-}
-
-/**
- * Connect middleware/dispatcher filters.
- */
-DispatcherFactory::add('Asset');
-DispatcherFactory::add('Routing');
-DispatcherFactory::add('ControllerFactory');
-
-/**
- * Enable default locale format parsing.
- * This is needed for matching the auto-localized string output of Time() class when parsing dates.
- */
-Type::build('datetime')->useLocaleParser();
diff --git a/cakephp/notejam/config/bootstrap_cli.php b/cakephp/notejam/config/bootstrap_cli.php
deleted file mode 100644
index 13cf979fa..000000000
--- a/cakephp/notejam/config/bootstrap_cli.php
+++ /dev/null
@@ -1,32 +0,0 @@
-connect('/', ['controller' => 'Notes', 'action' => 'index'], ['_name' => 'index']);
-
- $routes->connect('/signup', ['controller' => 'Users', 'action' => 'signup'], ['_name' => 'signup']);
- $routes->connect('/signin', ['controller' => 'Users', 'action' => 'signin'], ['_name' => 'signin']);
- $routes->connect('/signout', ['controller' => 'Users', 'action' => 'signout'], ['_name' => 'signout']);
- $routes->connect('/settings', ['controller' => 'Users', 'action' => 'settings'], ['_name' => 'settings']);
- $routes->connect('/forgot-password', ['controller' => 'Users', 'action' => 'forgotpassword'], ['_name' => 'forgot_password']);
-
-
- $routes->scope('/pads', ['controller' => 'Pads'], function($routes) {
- $routes->connect('/create', ['controller' => 'Pads', 'action' => 'create'], ['_name' => 'create_pad']);
- $routes->connect('/:id/edit', ['controller' => 'Pads', 'action' => 'edit'], ['id' => '\d+', 'pass' => ['id'], '_name' => 'edit_pad']);
- $routes->connect('/:id/delete', ['controller' => 'Pads', 'action' => 'delete'], ['id' => '\d+', 'pass' => ['id'], '_name' => 'delete_pad']);
- $routes->connect('/:id', ['controller' => 'Pads', 'action' => 'view'], ['id' => '\d+', 'pass' => ['id'], '_name' => 'view_pad']);
- });
-
- $routes->scope('/notes', ['controller' => 'Notes'], function($routes) {
- $routes->connect('/create', ['controller' => 'Notes', 'action' => 'create'], ['_name' => 'create_note']);
- $routes->connect('/:id/edit', ['controller' => 'Notes', 'action' => 'edit'], ['id' => '\d+', 'pass' => ['id'], '_name' => 'edit_note']);
- $routes->connect('/:id', ['controller' => 'Notes', 'action' => 'view'], ['id' => '\d+', 'pass' => ['id'], '_name' => 'view_note']);
- $routes->connect('/:id/delete', ['controller' => 'Notes', 'action' => 'delete'], ['id' => '\d+', 'pass' => ['id'], '_name' => 'delete_note']);
- });
-});
-
-/**
- * Load all plugin routes. See the Plugin documentation on
- * how to customize the loading of plugin routes.
- */
-Plugin::routes();
diff --git a/cakephp/notejam/config/schema/i18n.sql b/cakephp/notejam/config/schema/i18n.sql
deleted file mode 100644
index 66a42bd19..000000000
--- a/cakephp/notejam/config/schema/i18n.sql
+++ /dev/null
@@ -1,27 +0,0 @@
-# $Id$
-#
-# Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
-#
-# Licensed under The MIT License
-# For full copyright and license information, please see the LICENSE.txt
-# Redistributions of files must retain the above copyright notice.
-# MIT License (http://www.opensource.org/licenses/mit-license.php)
-
-CREATE TABLE i18n (
- id int(10) NOT NULL auto_increment,
- locale varchar(6) NOT NULL,
- model varchar(255) NOT NULL,
- foreign_key int(10) NOT NULL,
- field varchar(255) NOT NULL,
- content mediumtext,
- PRIMARY KEY (id),
-# UNIQUE INDEX I18N_LOCALE_FIELD(locale, model, foreign_key, field),
-# INDEX I18N_LOCALE_ROW(locale, model, foreign_key),
-# INDEX I18N_LOCALE_MODEL(locale, model),
-# INDEX I18N_FIELD(model, foreign_key, field),
-# INDEX I18N_ROW(model, foreign_key),
- INDEX locale (locale),
- INDEX model (model),
- INDEX row_id (foreign_key),
- INDEX field (field)
-);
\ No newline at end of file
diff --git a/cakephp/notejam/config/schema/sessions.sql b/cakephp/notejam/config/schema/sessions.sql
deleted file mode 100644
index 434e1aa1c..000000000
--- a/cakephp/notejam/config/schema/sessions.sql
+++ /dev/null
@@ -1,17 +0,0 @@
-# $Id$
-#
-# Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
-# 1785 E. Sahara Avenue, Suite 490-204
-# Las Vegas, Nevada 89104
-#
-# Licensed under The MIT License
-# For full copyright and license information, please see the LICENSE.txt
-# Redistributions of files must retain the above copyright notice.
-# MIT License (http://www.opensource.org/licenses/mit-license.php)
-
-CREATE TABLE sessions (
- id varchar(40) NOT NULL default '',
- data text,
- expires INT(11) NOT NULL,
- PRIMARY KEY (id)
-);
diff --git a/cakephp/notejam/index.php b/cakephp/notejam/index.php
deleted file mode 100644
index fc5e39ccb..000000000
--- a/cakephp/notejam/index.php
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- ./tests/TestCase
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/cakephp/notejam/src/Console/Installer.php b/cakephp/notejam/src/Console/Installer.php
deleted file mode 100644
index 06d1115f7..000000000
--- a/cakephp/notejam/src/Console/Installer.php
+++ /dev/null
@@ -1,192 +0,0 @@
-getIO();
-
- $rootDir = dirname(dirname(__DIR__));
-
- static::createAppConfig($rootDir, $io);
- static::createWritableDirectories($rootDir, $io);
-
- // ask if the permissions should be changed
- if ($io->isInteractive()) {
- $validator = function ($arg) {
- if (in_array($arg, ['Y', 'y', 'N', 'n'])) {
- return $arg;
- }
- throw new Exception('This is not a valid answer. Please choose Y or n.');
- };
- $setFolderPermissions = $io->askAndValidate(
- 'Set Folder Permissions ? (Default to Y) [Y,n]? ',
- $validator,
- 10,
- 'Y'
- );
-
- if (in_array($setFolderPermissions, ['Y', 'y'])) {
- static::setFolderPermissions($rootDir, $io);
- }
- } else {
- static::setFolderPermissions($rootDir, $io);
- }
-
- static::setSecuritySalt($rootDir, $io);
-
- if (class_exists('\Cake\Codeception\Console\Installer')) {
- \Cake\Codeception\Console\Installer::customizeCodeceptionBinary($event);
- }
- }
-
- /**
- * Create the config/app.php file if it does not exist.
- *
- * @param string $dir The application's root directory.
- * @param \Composer\IO\IOInterface $io IO interface to write to console.
- * @return void
- */
- public static function createAppConfig($dir, $io)
- {
- $appConfig = $dir . '/config/app.php';
- $defaultConfig = $dir . '/config/app.default.php';
- if (!file_exists($appConfig)) {
- copy($defaultConfig, $appConfig);
- $io->write('Created `config/app.php` file');
- }
- }
-
- /**
- * Create the `logs` and `tmp` directories.
- *
- * @param string $dir The application's root directory.
- * @param \Composer\IO\IOInterface $io IO interface to write to console.
- * @return void
- */
- public static function createWritableDirectories($dir, $io)
- {
- $paths = [
- 'logs',
- 'tmp',
- 'tmp/cache',
- 'tmp/cache/models',
- 'tmp/cache/persistent',
- 'tmp/cache/views',
- 'tmp/sessions',
- 'tmp/tests'
- ];
-
- foreach ($paths as $path) {
- $path = $dir . '/' . $path;
- if (!file_exists($path)) {
- mkdir($path);
- $io->write('Created `' . $path . '` directory');
- }
- }
- }
-
- /**
- * Set globally writable permissions on the "tmp" and "logs" directory.
- *
- * This is not the most secure default, but it gets people up and running quickly.
- *
- * @param string $dir The application's root directory.
- * @param \Composer\IO\IOInterface $io IO interface to write to console.
- * @return void
- */
- public static function setFolderPermissions($dir, $io)
- {
- // Change the permissions on a path and output the results.
- $changePerms = function ($path, $perms, $io) {
- // Get current permissions in decimal format so we can bitmask it.
- $currentPerms = octdec(substr(sprintf('%o', fileperms($path)), -4));
- if (($currentPerms & $perms) == $perms) {
- return;
- }
-
- $res = chmod($path, $currentPerms | $perms);
- if ($res) {
- $io->write('Permissions set on ' . $path);
- } else {
- $io->write('Failed to set permissions on ' . $path);
- }
- };
-
- $walker = function ($dir, $perms, $io) use (&$walker, $changePerms) {
- $files = array_diff(scandir($dir), ['.', '..']);
- foreach ($files as $file) {
- $path = $dir . '/' . $file;
-
- if (!is_dir($path)) {
- continue;
- }
-
- $changePerms($path, $perms, $io);
- $walker($path, $perms, $io);
- }
- };
-
- $worldWritable = bindec('0000000111');
- $walker($dir . '/tmp', $worldWritable, $io);
- $changePerms($dir . '/tmp', $worldWritable, $io);
- $changePerms($dir . '/logs', $worldWritable, $io);
- }
-
- /**
- * Set the security.salt value in the application's config file.
- *
- * @param string $dir The application's root directory.
- * @param \Composer\IO\IOInterface $io IO interface to write to console.
- * @return void
- */
- public static function setSecuritySalt($dir, $io)
- {
- $config = $dir . '/config/app.php';
- $content = file_get_contents($config);
-
- $newKey = hash('sha256', $dir . php_uname() . microtime(true));
- $content = str_replace('__SALT__', $newKey, $content, $count);
-
- if ($count == 0) {
- $io->write('No Security.salt placeholder to replace.');
- return;
- }
-
- $result = file_put_contents($config, $content);
- if ($result) {
- $io->write('Updated Security.salt value in config/app.php');
- return;
- }
- $io->write('Unable to update Security.salt value.');
- }
-}
diff --git a/cakephp/notejam/src/Controller/AppController.php b/cakephp/notejam/src/Controller/AppController.php
deleted file mode 100644
index 2207fda8d..000000000
--- a/cakephp/notejam/src/Controller/AppController.php
+++ /dev/null
@@ -1,88 +0,0 @@
-loadComponent('Flash');
- $this->loadComponent('Auth', [
- 'authenticate' => [
- 'Form' => [
- 'fields' => [
- 'username' => 'email',
- 'password' => 'password'
- ]
- ]
- ],
- 'loginAction' => [
- 'controller' => 'Users',
- 'action' => 'signin'
- ]
- ]);
- $this->Auth->allow(['signup', 'forgotpassword']);
- }
-
- /**
- * Get authenticated user
- *
- * @return App\Model\Entity\User
- */
- protected function getUser()
- {
- $id = $this->request->session()->read('Auth.User.id');
- return TableRegistry::get('Users')->get($id, [
- 'contain' => ['Pads', 'Notes']
- ]);
- }
-
- /**
- * Build order statetment
- *
- * @param string $order Order param
- * @return array
- */
- public function buildOrderBy($order)
- {
- $config = [
- 'name' => ['Notes.name' => 'ASC'],
- '-name' => ['Notes.name' => 'DESC'],
- 'updated_at' => ['Notes.updated_at' => 'ASC'],
- '-updated_at' => ['Notes.updated_at' => 'DESC'],
- ];
- return $config[$order ? $order : 'updated_at'];
- }
-}
diff --git a/cakephp/notejam/src/Controller/NotesController.php b/cakephp/notejam/src/Controller/NotesController.php
deleted file mode 100644
index 18740fc06..000000000
--- a/cakephp/notejam/src/Controller/NotesController.php
+++ /dev/null
@@ -1,138 +0,0 @@
-viewBuilder()->layout('user');
- }
-
- /**
- * Index method
- *
- * @return void
- */
- public function index()
- {
- $this->set(
- 'notes',
- $this->Notes->find('all', ['contain' => 'Pads'])
- ->where(['Notes.user_id' => $this->getUser()->id])
- ->order($this->buildOrderBy($this->request->query('order')))
- );
- }
-
- /**
- * View note
- *
- * @param string|null $id Note id.
- * @return void
- * @throws \Cake\Network\Exception\NotFoundException When record not found.
- */
- public function view($id = null)
- {
- $note = $this->getNote($id);
- $this->set('note', $note);
- }
-
- /**
- * Create note action
- *
- * @return void Redirects on successful add, renders view otherwise.
- */
- public function create()
- {
- $note = $this->Notes->newEntity();
- if ($this->request->is('post')) {
- $note = $this->Notes->patchEntity($note, array_merge(
- $this->request->data,
- ['user_id' => $this->getUser()->id]
- ));
- if ($this->Notes->save($note)) {
- $this->Flash->success(__('The note has been saved.'));
- return $this->redirect(['action' => 'index']);
- } else {
- $this->Flash->error(__('The note could not be saved. Please, try again.'));
- }
- }
- // current pad
- $pad = $this->request->query('pad');
-
- $pads = collection($this->getUser()->pads)->combine('id', 'name')->toArray();
- $this->set(compact('note', 'pads', 'pad'));
- }
-
-
- /**
- * Edit note
- *
- * @param string|null $id Note id.
- * @return void Redirects on successful edit, renders view otherwise.
- * @throws \Cake\Network\Exception\NotFoundException When record not found.
- */
- public function edit($id = null)
- {
- $note = $this->getNote($id);
- if ($this->request->is(['patch', 'post', 'put'])) {
- $note = $this->Notes->patchEntity($note, $this->request->data);
- if ($this->Notes->save($note)) {
- $this->Flash->success(__('The note has been saved.'));
- return $this->redirect(['action' => 'view', 'id' => $note->id]);
- } else {
- $this->Flash->error(__('The note could not be saved. Please, try again.'));
- }
- }
- $pads = collection($this->getUser()->pads)->combine('id', 'name')->toArray();
- $this->set(compact('note', 'pads'));
- }
-
- /**
- * Delete method
- *
- * @param string|null $id Note id.
- * @return void Redirects to index.
- * @throws \Cake\Network\Exception\NotFoundException When record not found.
- */
- public function delete($id = null)
- {
- $note = $this->getNote($id);
- if ($this->request->is('post')) {
- $this->Notes->delete($note);
- $this->Flash->success(__('The note has been deleted.'));
- return $this->redirect(['action' => 'index']);
- }
- $this->set(compact('note'));
- }
-
- /**
- * Get note
- *
- * @param int $id Note id
- * @return Note
- */
- protected function getNote($id)
- {
- return TableRegistry::get('Notes')->find()
- ->contain(['Pads', 'Users'])
- ->where(['Notes.id' => $id])
- ->where(['Notes.user_id' => $this->getUser()->id])
- ->firstOrFail();
- }
-}
diff --git a/cakephp/notejam/src/Controller/PadsController.php b/cakephp/notejam/src/Controller/PadsController.php
deleted file mode 100644
index 246b98430..000000000
--- a/cakephp/notejam/src/Controller/PadsController.php
+++ /dev/null
@@ -1,121 +0,0 @@
-viewBuilder()->layout('user');
- }
-
- /**
- * View pad
- *
- * @param string|null $id Pad id.
- * @return void
- * @throws \Cake\Network\Exception\NotFoundException When record not found.
- */
- public function view($id = null)
- {
- $pad = $this->getPad($id);
- $notes = TableRegistry::get('Notes')->find('all', ['contain' => 'Pads'])
- ->where(['Notes.pad_id' => $id])
- ->where(['Notes.user_id' => $this->getUser()->id])
- ->order($this->buildOrderBy($this->request->query('order')));
-
- $this->set('pad', $pad);
- $this->set('notes', $notes);
- }
-
- /**
- * Create a pad
- *
- * @return void Redirects on successful add, renders view otherwise.
- */
- public function create()
- {
- $pad = $this->Pads->newEntity();
- if ($this->request->is('post')) {
- $pad = $this->Pads->patchEntity($pad, array_merge(
- $this->request->data,
- ['user_id' => $this->Auth->user('id')]
- ));
- if ($this->Pads->save($pad)) {
- $this->Flash->success(__('The pad has been created.'));
- return $this->redirect(['action' => 'view', 'id' => $pad->id]);
- }
- }
- $this->set(compact('pad'));
- }
-
- /**
- * Edit pad
- *
- * @param string|null $id Pad id.
- * @return void Redirects on successful edit, renders view otherwise.
- * @throws \Cake\Network\Exception\NotFoundException When record not found.
- */
- public function edit($id = null)
- {
- $pad = $this->getPad($id);
- if ($this->request->is(['patch', 'post', 'put'])) {
- $pad = $this->Pads->patchEntity($pad, $this->request->data);
- if ($this->Pads->save($pad)) {
- $this->Flash->success(__('The pad has been saved.'));
- return $this->redirect(['action' => 'view', 'id' => $pad->id]);
- } else {
- $this->Flash->error(__('The pad could not be saved. Please, try again.'));
- }
- }
- $this->set(compact('pad'));
- }
-
- /**
- * Delete method
- *
- * @param string|null $id Pad id.
- * @return void Redirects to index.
- * @throws \Cake\Network\Exception\NotFoundException When record not found.
- */
- public function delete($id = null)
- {
- $pad = $this->getPad($id);
- if ($this->request->is('post')) {
- $this->Pads->delete($pad);
- $this->Flash->success(__('The pad has been deleted.'));
- return $this->redirect(['_name' => 'index']);
- }
- $this->set(compact('pad'));
- }
-
- /**
- * Get pad
- *
- * @param int $id Pad id
- * @return Pad
- */
- protected function getPad($id)
- {
- return TableRegistry::get('Pads')->find()
- ->contain(['Users'])
- ->where(['Pads.id' => $id])
- ->where(['Pads.user_id' => $this->getUser()->id])
- ->firstOrFail();
- }
-}
diff --git a/cakephp/notejam/src/Controller/UsersController.php b/cakephp/notejam/src/Controller/UsersController.php
deleted file mode 100644
index 00b1afb37..000000000
--- a/cakephp/notejam/src/Controller/UsersController.php
+++ /dev/null
@@ -1,145 +0,0 @@
-viewBuilder()->layout('anonymous');
- }
-
- /**
- * Signup action
- *
- * @return void Redirects on successful signup, renders errors otherwise.
- */
- public function signup()
- {
- $user = $this->Users->newEntity();
- if ($this->request->is('post')) {
- $user = $this->Users->patchEntity($user, $this->request->data);
- if ($this->Users->save($user)) {
- $this->Flash->success(__('Now you can signin'));
- return $this->redirect(['action' => 'signin']);
- } else {
- $this->Flash->error(__('The user could not be saved. Please, try again.'));
- }
- }
- $this->set(compact('user'));
- }
-
- /**
- * Signin action
- *
- * @return void Redirects on successful signup, renders errors otherwise.
- */
- public function signin()
- {
- if ($this->request->is('post')) {
- $user = $this->Auth->identify();
- if ($user) {
- $this->Auth->setUser($user);
- return $this->redirect($this->Auth->redirectUrl());
- }
- $this->Flash->error('Your username or password is incorrect.');
- }
- }
-
- /**
- * Sign out action
- *
- * @return void Redirects on successful signin
- */
- public function signout()
- {
- return $this->redirect($this->Auth->logout());
- }
-
- /**
- * Account settings action
- *
- * @return void
- */
- public function settings()
- {
- $settings = new SettingsForm();
- if ($this->request->is('post') &&
- $settings->validate($this->request->data)) {
-
- $user = $this->getUser();
- if ($user->checkPassword($this->request->data['current_password'])) {
- $user->password = $this->request->data['new_password'];
- $this->Users->save($user);
- $this->Flash->success('Password is successfully changed.');
- return $this->redirect(['_name' => 'index']);
- }
- $this->Flash->error('Current password is not correct.');
- }
- $this->set(compact('settings'));
- }
-
- /**
- * Forgot password action
- *
- * @return void
- */
- public function forgotPassword()
- {
- $form = new ForgotPasswordForm();
- if ($this->request->is('post') &&
- $form->validate($this->request->data)) {
-
- $user = $this->Users->find()
- ->where(['email' => $this->request->data['email']])
- ->first();
- if ($user) {
- $this->resetPassword($user);
- $this->Flash->success('New temp password is sent to your inbox.');
- return $this->redirect(['_name' => 'index']);
- }
- $this->Flash->error('User with given email does not exist.');
- }
- $this->set(compact('form'));
- }
-
- /**
- * Reset user's password
- *
- * @param App\Model\Entity\User $user User
- * @return void
- */
- protected function resetPassword($user)
- {
- // primitive way to generate temporary password
- $user->password = $password = substr(
- sha1(time() . rand() . Configure::read('Security.salt')), 0, 8
- );
- $this->Users->save($user);
-
- Email::deliver(
- $user->email,
- "New notejam password",
- "Your new temporary password is {$password}.
- We recommend you to change it after signing in.",
- ["from" => "noreply@notejamapp.com", "transport" => "default"]
- );
- }
-}
diff --git a/cakephp/notejam/src/Form/ForgotPasswordForm.php b/cakephp/notejam/src/Form/ForgotPasswordForm.php
deleted file mode 100644
index 5b7a3d2c8..000000000
--- a/cakephp/notejam/src/Form/ForgotPasswordForm.php
+++ /dev/null
@@ -1,35 +0,0 @@
-addField('email', ['type' => 'string']);
- }
-
- /**
- * Default validation rules.
- *
- * @param \Cake\Validation\Validator $validator Validator instance.
- * @return \Cake\Validation\Validator
- */
- protected function _buildValidator(Validator $validator)
- {
- return $validator
- ->requirePresence('email', 'create')
- ->add('email', 'valid', ['rule' => 'email']);
- }
-}
-
diff --git a/cakephp/notejam/src/Form/SettingsForm.php b/cakephp/notejam/src/Form/SettingsForm.php
deleted file mode 100644
index ef7391a58..000000000
--- a/cakephp/notejam/src/Form/SettingsForm.php
+++ /dev/null
@@ -1,47 +0,0 @@
-addField('current_password', ['type' => 'password'])
- ->addField('new_password', ['type' => 'password'])
- ->addField('confirm_new_password', ['type' => 'password']);
- }
-
- /**
- * Default validation rules.
- *
- * @param \Cake\Validation\Validator $validator Validator instance.
- * @return \Cake\Validation\Validator
- */
- protected function _buildValidator(Validator $validator)
- {
- return $validator
- ->requirePresence('current_password', 'create')
- ->notEmpty('current_password')
- ->requirePresence('new_password', 'create')
- ->notEmpty('new_password')
- ->add('new_password', [
- 'length' => [
- 'rule' => ['minLength', 6]
- ],
- 'compare' => [
- 'rule' => ['compareWith', 'confirm_new_password'],
- 'message' => 'Passwords do not match'
- ],
- ]);
- }
-}
diff --git a/cakephp/notejam/src/Model/Entity/Note.php b/cakephp/notejam/src/Model/Entity/Note.php
deleted file mode 100644
index 56c772790..000000000
--- a/cakephp/notejam/src/Model/Entity/Note.php
+++ /dev/null
@@ -1,41 +0,0 @@
- true,
- 'user_id' => true,
- 'name' => true,
- 'text' => true,
- 'created_at' => true,
- 'updated_at' => true,
- 'pad' => true,
- 'user' => true,
- ];
-
- /**
- * Get pretty date like "Yesterday", "2 days ago", "etc"
- *
- * @return string
- */
- public function getPrettyDate()
- {
- $time = new Time($this->_properties['updated_at']);
- return $time->timeAgoInWords([
- 'format' => 'd'
- ]);
- }
-}
diff --git a/cakephp/notejam/src/Model/Entity/Pad.php b/cakephp/notejam/src/Model/Entity/Pad.php
deleted file mode 100644
index 30163e110..000000000
--- a/cakephp/notejam/src/Model/Entity/Pad.php
+++ /dev/null
@@ -1,23 +0,0 @@
- true,
- 'user_id' => true,
- 'user' => true,
- 'notes' => true,
- ];
-}
diff --git a/cakephp/notejam/src/Model/Entity/User.php b/cakephp/notejam/src/Model/Entity/User.php
deleted file mode 100644
index 14dc77f42..000000000
--- a/cakephp/notejam/src/Model/Entity/User.php
+++ /dev/null
@@ -1,50 +0,0 @@
- true,
- 'password' => true,
- 'notes' => true,
- 'pads' => true,
- ];
-
-
- /**
- * Password setter
- *
- * @param string $value password
- * @return string
- */
- protected function _setPassword($value)
- {
- $hasher = new DefaultPasswordHasher();
- return $hasher->hash($value);
- }
-
- /**
- * Check if passwords matches
- *
- * @param string $password Password
- * @return boolean
- */
- public function checkPassword($password)
- {
- $hasher = new DefaultPasswordHasher();
- return $hasher->check($password, $this->password);
- }
-}
diff --git a/cakephp/notejam/src/Model/Table/NotesTable.php b/cakephp/notejam/src/Model/Table/NotesTable.php
deleted file mode 100644
index bcf9415a2..000000000
--- a/cakephp/notejam/src/Model/Table/NotesTable.php
+++ /dev/null
@@ -1,82 +0,0 @@
-table('notes');
- $this->displayField('name');
- $this->primaryKey('id');
- $this->addBehavior('Timestamp', [
- 'events' => [
- 'Model.beforeSave' => [
- 'created_at' => 'new',
- 'updated_at' => 'always'
- ]
- ]
- ]);
- $this->belongsTo('Pads', [
- 'foreignKey' => 'pad_id'
- ]);
- $this->belongsTo('Users', [
- 'foreignKey' => 'user_id',
- 'joinType' => 'INNER'
- ]);
- }
-
- /**
- * Default validation rules.
- *
- * @param \Cake\Validation\Validator $validator Validator instance.
- * @return \Cake\Validation\Validator
- */
- public function validationDefault(Validator $validator)
- {
- $validator
- ->add('id', 'valid', ['rule' => 'numeric'])
- ->allowEmpty('id', 'create');
-
- $validator
- ->requirePresence('name', 'create')
- ->notEmpty('name');
-
- $validator
- ->requirePresence('text', 'create')
- ->notEmpty('text');
-
- return $validator;
- }
-
- /**
- * Returns a rules checker object that will be used for validating
- * application integrity.
- *
- * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
- * @return \Cake\ORM\RulesChecker
- */
- public function buildRules(RulesChecker $rules)
- {
- $rules->add($rules->existsIn(['user_id'], 'Users'));
- return $rules;
- }
-}
diff --git a/cakephp/notejam/src/Model/Table/PadsTable.php b/cakephp/notejam/src/Model/Table/PadsTable.php
deleted file mode 100644
index 921e2a328..000000000
--- a/cakephp/notejam/src/Model/Table/PadsTable.php
+++ /dev/null
@@ -1,70 +0,0 @@
-table('pads');
- $this->displayField('name');
- $this->primaryKey('id');
- $this->belongsTo('Users', [
- 'foreignKey' => 'user_id',
- 'joinType' => 'INNER'
- ]);
- $this->hasMany('Notes', [
- 'foreignKey' => 'pad_id'
- ]);
- }
-
- /**
- * Default validation rules.
- *
- * @param \Cake\Validation\Validator $validator Validator instance.
- * @return \Cake\Validation\Validator
- */
- public function validationDefault(Validator $validator)
- {
- $validator
- ->add('id', 'valid', ['rule' => 'numeric'])
- ->allowEmpty('id', 'create');
-
- $validator
- ->requirePresence('name', 'create')
- ->notEmpty('name');
-
- return $validator;
- }
-
- /**
- * Returns a rules checker object that will be used for validating
- * application integrity.
- *
- * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
- * @return \Cake\ORM\RulesChecker
- */
- public function buildRules(RulesChecker $rules)
- {
- $rules->add($rules->existsIn(['user_id'], 'Users'));
- return $rules;
- }
-}
diff --git a/cakephp/notejam/src/Model/Table/UsersTable.php b/cakephp/notejam/src/Model/Table/UsersTable.php
deleted file mode 100644
index ba359d614..000000000
--- a/cakephp/notejam/src/Model/Table/UsersTable.php
+++ /dev/null
@@ -1,80 +0,0 @@
-table('users');
- $this->displayField('id');
- $this->primaryKey('id');
- $this->hasMany('Notes', [
- 'foreignKey' => 'user_id'
- ]);
- $this->hasMany('Pads', [
- 'foreignKey' => 'user_id'
- ]);
- }
-
- /**
- * Default validation rules.
- *
- * @param \Cake\Validation\Validator $validator Validator instance.
- * @return \Cake\Validation\Validator
- */
- public function validationDefault(Validator $validator)
- {
- $validator
- ->add('email', 'valid', ['rule' => 'email'])
- ->requirePresence('email', 'create')
- ->notEmpty('email');
-
- $validator
- ->requirePresence('password', 'create')
- ->notEmpty('password')
- ->add('password', [
- 'length' => [
- 'rule' => ['minLength', 6]
- ],
- 'compare' => [
- 'rule' => ['compareWith', 'confirm_password'],
- 'message' => 'Passwords do not match'
- ],
- ]);
-
-
- return $validator;
- }
-
- /**
- * Returns a rules checker object that will be used for validating
- * application integrity.
- *
- * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
- * @return \Cake\ORM\RulesChecker
- */
- public function buildRules(RulesChecker $rules)
- {
- $rules->add($rules->isUnique(['email']));
- return $rules;
- }
-}
diff --git a/cakephp/notejam/src/Shell/ConsoleShell.php b/cakephp/notejam/src/Shell/ConsoleShell.php
deleted file mode 100644
index 97c797443..000000000
--- a/cakephp/notejam/src/Shell/ConsoleShell.php
+++ /dev/null
@@ -1,79 +0,0 @@
-err('Unable to load Psy\Shell.');
- $this->err('');
- $this->err('Make sure you have installed psysh as a dependency,');
- $this->err('and that Psy\Shell is registered in your autoloader.');
- $this->err('');
- $this->err('If you are using composer run');
- $this->err('');
- $this->err('$ php composer.phar require --dev psy/psysh');
- $this->err('');
- return 1;
- }
-
- $this->out("You can exit with `CTRL-C` or `exit`");
- $this->out('');
-
- Log::drop('debug');
- Log::drop('error');
- $this->_io->setLoggers(false);
- restore_error_handler();
- restore_exception_handler();
-
- $psy = new PsyShell();
- $psy->run();
- }
-
- /**
- * Display help for this console.
- *
- * @return ConsoleOptionParser
- */
- public function getOptionParser()
- {
- $parser = new ConsoleOptionParser('console', false);
- $parser->description(
- 'This shell provides a REPL that you can use to interact ' .
- 'with your application in an interactive fashion. You can use ' .
- 'it to run adhoc queries with your models, or experiment ' .
- 'and explore the features of CakePHP and your application.' .
- "\n\n" .
- 'You will need to have psysh installed for this Shell to work.'
- );
- return $parser;
- }
-}
diff --git a/cakephp/notejam/src/Template/Cell/Pads/display.ctp b/cakephp/notejam/src/Template/Cell/Pads/display.ctp
deleted file mode 100644
index 51181b443..000000000
--- a/cakephp/notejam/src/Template/Cell/Pads/display.ctp
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
= __("My pads"); ?>
-
-
diff --git a/cakephp/notejam/src/Template/Element/Flash/default.ctp b/cakephp/notejam/src/Template/Element/Flash/default.ctp
deleted file mode 100644
index bc1e2c369..000000000
--- a/cakephp/notejam/src/Template/Element/Flash/default.ctp
+++ /dev/null
@@ -1,7 +0,0 @@
-
-= h($message) ?>
diff --git a/cakephp/notejam/src/Template/Element/Flash/error.ctp b/cakephp/notejam/src/Template/Element/Flash/error.ctp
deleted file mode 100644
index d3995ad10..000000000
--- a/cakephp/notejam/src/Template/Element/Flash/error.ctp
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/cakephp/notejam/src/Template/Element/Flash/success.ctp b/cakephp/notejam/src/Template/Element/Flash/success.ctp
deleted file mode 100644
index 3ce1cc159..000000000
--- a/cakephp/notejam/src/Template/Element/Flash/success.ctp
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/cakephp/notejam/src/Template/Element/notes/form.ctp b/cakephp/notejam/src/Template/Element/notes/form.ctp
deleted file mode 100644
index 8351ee735..000000000
--- a/cakephp/notejam/src/Template/Element/notes/form.ctp
+++ /dev/null
@@ -1,6 +0,0 @@
-Form->create($note, ['class' => 'note']); ?>
- Form->input('name'); ?>
- Form->textarea('text'); ?>
- Form->input('pad_id', ['type' => 'select', 'empty' => '---------', 'options' => $pads, 'default' => !empty($pad) ? $pad : 0]); ?>
- Form->submit(__('Save')); ?>
-Form->end(); ?>
diff --git a/cakephp/notejam/src/Template/Element/pads/form.ctp b/cakephp/notejam/src/Template/Element/pads/form.ctp
deleted file mode 100644
index dc9460c87..000000000
--- a/cakephp/notejam/src/Template/Element/pads/form.ctp
+++ /dev/null
@@ -1,4 +0,0 @@
-Form->create($pad, ['class' => 'pad']); ?>
- Form->input('name'); ?>
- Form->submit(__('Save')); ?>
-Form->end(); ?>
diff --git a/cakephp/notejam/src/Template/Email/html/default.ctp b/cakephp/notejam/src/Template/Email/html/default.ctp
deleted file mode 100644
index 386674a1a..000000000
--- a/cakephp/notejam/src/Template/Email/html/default.ctp
+++ /dev/null
@@ -1,22 +0,0 @@
-
- ' . $line . "
\n";
-endforeach;
-?>
diff --git a/cakephp/notejam/src/Template/Email/text/default.ctp b/cakephp/notejam/src/Template/Email/text/default.ctp
deleted file mode 100644
index 704b46f03..000000000
--- a/cakephp/notejam/src/Template/Email/text/default.ctp
+++ /dev/null
@@ -1,16 +0,0 @@
-
-= $content ?>
diff --git a/cakephp/notejam/src/Template/Error/error400.ctp b/cakephp/notejam/src/Template/Error/error400.ctp
deleted file mode 100644
index 5cd7ce6ee..000000000
--- a/cakephp/notejam/src/Template/Error/error400.ctp
+++ /dev/null
@@ -1,38 +0,0 @@
-layout = 'dev_error';
-
- $this->assign('title', $message);
- $this->assign('templateName', 'error400.ctp');
-
- $this->start('file');
-?>
-queryString)) : ?>
-
- SQL Query:
- = h($error->queryString) ?>
-
-
-params)) : ?>
- SQL Query Params:
- = Debugger::dump($error->params) ?>
-
-= $this->element('auto_table_warning') ?>
-end();
-endif;
-?>
-= h($message) ?>
-
- = __d('cake', 'Error') ?>:
- = sprintf(
- __d('cake', 'The requested address %s was not found on this server.'),
- "'{$url}'"
- ) ?>
-
diff --git a/cakephp/notejam/src/Template/Error/error500.ctp b/cakephp/notejam/src/Template/Error/error500.ctp
deleted file mode 100644
index d2b7d92a1..000000000
--- a/cakephp/notejam/src/Template/Error/error500.ctp
+++ /dev/null
@@ -1,37 +0,0 @@
-layout = 'dev_error';
-
- $this->assign('title', $message);
- $this->assign('templateName', 'error500.ctp');
-
- $this->start('file');
-?>
-queryString)) : ?>
-
- SQL Query:
- = h($error->queryString) ?>
-
-
-params)) : ?>
- SQL Query Params:
- = Debugger::dump($error->params) ?>
-
-element('auto_table_warning');
-
- if (extension_loaded('xdebug')):
- xdebug_print_function_stack();
- endif;
-
- $this->end();
-endif;
-?>
-= __d('cake', 'An Internal Error Has Occurred') ?>
-
- = __d('cake', 'Error') ?>:
- = h($message) ?>
-
diff --git a/cakephp/notejam/src/Template/Layout/Email/html/default.ctp b/cakephp/notejam/src/Template/Layout/Email/html/default.ctp
deleted file mode 100644
index 2b4397008..000000000
--- a/cakephp/notejam/src/Template/Layout/Email/html/default.ctp
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
- = $this->fetch('title') ?>
-
-
- = $this->fetch('content') ?>
-
-
diff --git a/cakephp/notejam/src/Template/Layout/Email/text/default.ctp b/cakephp/notejam/src/Template/Layout/Email/text/default.ctp
deleted file mode 100644
index 871dcfb48..000000000
--- a/cakephp/notejam/src/Template/Layout/Email/text/default.ctp
+++ /dev/null
@@ -1,16 +0,0 @@
-
-= $this->fetch('content') ?>
diff --git a/cakephp/notejam/src/Template/Layout/ajax.ctp b/cakephp/notejam/src/Template/Layout/ajax.ctp
deleted file mode 100644
index 871dcfb48..000000000
--- a/cakephp/notejam/src/Template/Layout/ajax.ctp
+++ /dev/null
@@ -1,16 +0,0 @@
-
-= $this->fetch('content') ?>
diff --git a/cakephp/notejam/src/Template/Layout/anonymous.ctp b/cakephp/notejam/src/Template/Layout/anonymous.ctp
deleted file mode 100644
index 42db077f5..000000000
--- a/cakephp/notejam/src/Template/Layout/anonymous.ctp
+++ /dev/null
@@ -1,6 +0,0 @@
-extend('/Layout/default'); ?>
-
-
- = $this->Flash->render() ?>
- = $this->fetch('content') ?>
-
diff --git a/cakephp/notejam/src/Template/Layout/default.ctp b/cakephp/notejam/src/Template/Layout/default.ctp
deleted file mode 100644
index 9c9a7cc8d..000000000
--- a/cakephp/notejam/src/Template/Layout/default.ctp
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
- = $this->Html->charset() ?>
- = $this->fetch('title') ?>
-
- = $this->Html->css('http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/base.min.css') ?>
- = $this->Html->css('http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/skeleton.min.css') ?>
- = $this->Html->css('http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/layout.css') ?>
- = $this->Html->css('style.css') ?>
-
- = $this->fetch('css') ?>
-
-
-
-
-
- request->session()->read('Auth.User')): ?>
- = $this->request->session()->read('Auth.User.email') ?>: = $this->Html->link(__('Account settings'), ['_name' => 'settings'])?> = $this->Html->link(__('Sign out'), ['_name' => 'signout'])?>
-
- = $this->Html->link(__('Sign up'), ['_name' => 'signup'])?> = $this->Html->link(__('Sign in'), ['_name' => 'signin'])?>
-
-
-
-
-
-
-
- = $this->fetch('content') ?>
-
-
-
-
-
-
-
diff --git a/cakephp/notejam/src/Template/Layout/error.ctp b/cakephp/notejam/src/Template/Layout/error.ctp
deleted file mode 100644
index e6945a8ad..000000000
--- a/cakephp/notejam/src/Template/Layout/error.ctp
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
- = $this->Html->charset() ?>
-
- = $cakeDescription ?>:
- = $this->fetch('title') ?>
-
- = $this->Html->meta('icon') ?>
-
- = $this->Html->css('base.css') ?>
- = $this->Html->css('cake.css') ?>
-
- = $this->fetch('meta') ?>
- = $this->fetch('css') ?>
- = $this->fetch('script') ?>
-
-
-
-
-
- = $this->Flash->render() ?>
-
- = $this->fetch('content') ?>
-
-
-
-
-
diff --git a/cakephp/notejam/src/Template/Layout/rss/default.ctp b/cakephp/notejam/src/Template/Layout/rss/default.ctp
deleted file mode 100644
index fdadcbf78..000000000
--- a/cakephp/notejam/src/Template/Layout/rss/default.ctp
+++ /dev/null
@@ -1,14 +0,0 @@
-fetch('title');
-endif;
-
-echo $this->Rss->document(
- $this->Rss->channel(
- array(), $channel, $this->fetch('content')
- )
-);
-?>
diff --git a/cakephp/notejam/src/Template/Layout/user.ctp b/cakephp/notejam/src/Template/Layout/user.ctp
deleted file mode 100644
index 0ae6e9478..000000000
--- a/cakephp/notejam/src/Template/Layout/user.ctp
+++ /dev/null
@@ -1,8 +0,0 @@
-extend('/Layout/default'); ?>
-
-= $this->cell('Pads', ['auth' => 'auth_param']); ?>
-
-
- = $this->Flash->render() ?>
- = $this->fetch('content') ?>
-
diff --git a/cakephp/notejam/src/Template/Notes/create.ctp b/cakephp/notejam/src/Template/Notes/create.ctp
deleted file mode 100644
index 8c191f354..000000000
--- a/cakephp/notejam/src/Template/Notes/create.ctp
+++ /dev/null
@@ -1,3 +0,0 @@
-assign('title', __('New note')); ?>
-
-element('notes/form'); ?>
diff --git a/cakephp/notejam/src/Template/Notes/delete.ctp b/cakephp/notejam/src/Template/Notes/delete.ctp
deleted file mode 100644
index cc79d7d9e..000000000
--- a/cakephp/notejam/src/Template/Notes/delete.ctp
+++ /dev/null
@@ -1,7 +0,0 @@
-= __("Are you sure you want to delete {$note->name};") ?>
-= $this->Form->create(); ?>
-
- " ?>
-
- = $this->Html->link(__('Cancel'), ['_name' => 'view_note', 'id' => $note->id]) ?>
-= $this->Form->end(); ?>
diff --git a/cakephp/notejam/src/Template/Notes/edit.ctp b/cakephp/notejam/src/Template/Notes/edit.ctp
deleted file mode 100644
index 24faf5dee..000000000
--- a/cakephp/notejam/src/Template/Notes/edit.ctp
+++ /dev/null
@@ -1,3 +0,0 @@
-assign('title', __('Edit ' . $note->name)); ?>
-
-element('notes/form'); ?>
diff --git a/cakephp/notejam/src/Template/Notes/index.ctp b/cakephp/notejam/src/Template/Notes/index.ctp
deleted file mode 100644
index db767a984..000000000
--- a/cakephp/notejam/src/Template/Notes/index.ctp
+++ /dev/null
@@ -1,20 +0,0 @@
-assign('title', __("All notes ({$notes->count()})")); ?>
-count()): ?>
-
-
- | = __("Note") ?> = $this->Html->link('↑', ['_name' => 'index', 'order' => '-name'], ['class' => 'sort_arrow']) ?>= $this->Html->link('↓', ['_name' => 'index', 'order' => 'name'], ['class' => 'sort_arrow']) ?> |
- = __("Pad") ?> |
- = __("Last modified") ?> = $this->Html->link('↑', ['_name' => 'index', 'order' => '-updated_at'], ['class' => 'sort_arrow']) ?>= $this->Html->link('↓', ['_name' => 'index', 'order' => 'updated_at'], ['class' => 'sort_arrow']) ?> |
-
-
-
- | = $this->Html->link($note->name, ['id' => $note->id, '_name' => 'view_note']) ?> |
- = h($note->pad) ? $this->Html->link($note->pad->name, ['id' => $note->pad->id, '_name' => 'view_pad']) : 'No pad'; ?> |
- = $note->getPrettyDate(); ?> |
-
-
-
-
- = __("Create your first note") ?>
-
-= $this->Html->link(__("New note"), ["_name" => "create_note"], ["class" => "button"]); ?>
diff --git a/cakephp/notejam/src/Template/Notes/view.ctp b/cakephp/notejam/src/Template/Notes/view.ctp
deleted file mode 100644
index 3c48c2362..000000000
--- a/cakephp/notejam/src/Template/Notes/view.ctp
+++ /dev/null
@@ -1,9 +0,0 @@
-assign('title', h($note->name)); ?>
-Last edited at = $note->getPrettyDate(); ?>
-
-
- = h($note->text); ?>
-
-
-= $this->Html->link('Edit note', ['id' => $note->id, '_name' => 'edit_note'], ['class' => 'button']) ?>
-= $this->Html->link('Delete it', ['id' => $note->id, '_name' => 'delete_note'], ['class' => 'delete-note']) ?>
diff --git a/cakephp/notejam/src/Template/Pads/create.ctp b/cakephp/notejam/src/Template/Pads/create.ctp
deleted file mode 100644
index 236e80839..000000000
--- a/cakephp/notejam/src/Template/Pads/create.ctp
+++ /dev/null
@@ -1,3 +0,0 @@
-assign('title', __('New pad')); ?>
-
-element('pads/form'); ?>
diff --git a/cakephp/notejam/src/Template/Pads/delete.ctp b/cakephp/notejam/src/Template/Pads/delete.ctp
deleted file mode 100644
index b6f307d19..000000000
--- a/cakephp/notejam/src/Template/Pads/delete.ctp
+++ /dev/null
@@ -1,6 +0,0 @@
-= __("Are you sure you want to delete {$pad->name};") ?>
-= $this->Form->create(); ?>
- " ?>
-
- = $this->Html->link(__('Cancel'), ['_name' => 'index']) ?>
-= $this->Form->end(); ?>
diff --git a/cakephp/notejam/src/Template/Pads/edit.ctp b/cakephp/notejam/src/Template/Pads/edit.ctp
deleted file mode 100644
index 7fba45ec6..000000000
--- a/cakephp/notejam/src/Template/Pads/edit.ctp
+++ /dev/null
@@ -1,4 +0,0 @@
-assign('title', __('Edit ' . $pad->name)); ?>
-
-element('pads/form'); ?>
-= $this->Html->link('Delete pad', ['id' => $pad->id, '_name' => 'delete_pad'], ['class' => 'small-red']) ?>
diff --git a/cakephp/notejam/src/Template/Pads/view.ctp b/cakephp/notejam/src/Template/Pads/view.ctp
deleted file mode 100644
index 4766dc3f1..000000000
--- a/cakephp/notejam/src/Template/Pads/view.ctp
+++ /dev/null
@@ -1,19 +0,0 @@
-assign('title', __($pad->name . " ({$notes->count()})")); ?>
-count()): ?>
-
-
- | = __("Note") ?> = $this->Html->link('↑', ['_name' => 'view_pad', 'order' => '-name', 'id' => $pad->id], ['class' => 'sort_arrow']) ?>= $this->Html->link('↓', ['_name' => 'view_pad', 'order' => 'name', 'id' => $pad->id], ['class' => 'sort_arrow']) ?> |
- = __("Last modified") ?> = $this->Html->link('↑', ['_name' => 'view_pad', 'order' => '-updated_at', 'id' => $pad->id], ['class' => 'sort_arrow']) ?>= $this->Html->link('↓', ['_name' => 'view_pad', 'order' => 'updated_at', 'id' => $pad->id], ['class' => 'sort_arrow']) ?> |
-
-
-
- | = $this->Html->link($note->name, ['id' => $note->id, '_name' => 'view_note']) ?> |
- = $note->getPrettyDate(); ?> |
-
-
-
-
- = __("Create your first note in the pad") ?>
-
-= $this->Html->link(__("New note"), ["_name" => "create_note", "pad" => $pad->id], ["class" => "button"]); ?>
-= $this->Html->link(__("Pad settings"), ["_name" => "edit_pad", "id" => $pad->id]); ?>
diff --git a/cakephp/notejam/src/Template/Users/forgotpassword.ctp b/cakephp/notejam/src/Template/Users/forgotpassword.ctp
deleted file mode 100644
index da2eafa98..000000000
--- a/cakephp/notejam/src/Template/Users/forgotpassword.ctp
+++ /dev/null
@@ -1,6 +0,0 @@
-assign('title', __('Forgot password?')); ?>
-
-Form->create($form, ['class' => 'offset-by-six sign-in']); ?>
- Form->input('email', ['type' => 'text']); ?>
- Form->submit(__('Generate password')); ?>
-Form->end(); ?>
diff --git a/cakephp/notejam/src/Template/Users/index.ctp b/cakephp/notejam/src/Template/Users/index.ctp
deleted file mode 100644
index 7a4b50039..000000000
--- a/cakephp/notejam/src/Template/Users/index.ctp
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
= __('Actions') ?>
-
- - = $this->Html->link(__('New User'), ['action' => 'add']) ?>
- - = $this->Html->link(__('List Notes'), ['controller' => 'Notes', 'action' => 'index']) ?>
- - = $this->Html->link(__('New Note'), ['controller' => 'Notes', 'action' => 'add']) ?>
- - = $this->Html->link(__('List Pads'), ['controller' => 'Pads', 'action' => 'index']) ?>
- - = $this->Html->link(__('New Pad'), ['controller' => 'Pads', 'action' => 'add']) ?>
-
-
-
-
-
-
- | = $this->Paginator->sort('id') ?> |
- = $this->Paginator->sort('email') ?> |
- = $this->Paginator->sort('password') ?> |
- = __('Actions') ?> |
-
-
-
-
-
- | = $this->Number->format($user->id) ?> |
- = h($user->email) ?> |
- = h($user->password) ?> |
-
- = $this->Html->link(__('View'), ['action' => 'view', $user->id]) ?>
- = $this->Html->link(__('Edit'), ['action' => 'edit', $user->id]) ?>
- = $this->Form->postLink(__('Delete'), ['action' => 'delete', $user->id], ['confirm' => __('Are you sure you want to delete # {0}?', $user->id)]) ?>
- |
-
-
-
-
-
-
-
-
= $this->Paginator->counter() ?>
-
-
diff --git a/cakephp/notejam/src/Template/Users/settings.ctp b/cakephp/notejam/src/Template/Users/settings.ctp
deleted file mode 100644
index 9e6424874..000000000
--- a/cakephp/notejam/src/Template/Users/settings.ctp
+++ /dev/null
@@ -1,8 +0,0 @@
-assign('title', __('Account settings')); ?>
-
-Form->create($settings, ['class' => 'offset-by-six sign-in']); ?>
- Form->input('current_password', ['type' => 'password']); ?>
- Form->input('new_password', ['type' => 'password']); ?>
- Form->input('confirm_new_password', ['type' => 'password']); ?>
- Form->submit(__('Save')); ?>
-Form->end(); ?>
diff --git a/cakephp/notejam/src/Template/Users/signin.ctp b/cakephp/notejam/src/Template/Users/signin.ctp
deleted file mode 100644
index 7138e35eb..000000000
--- a/cakephp/notejam/src/Template/Users/signin.ctp
+++ /dev/null
@@ -1,9 +0,0 @@
-assign('title', __('Sign in')); ?>
-
-Form->create(null, ['class' => 'offset-by-six sign-in']); ?>
- Form->input('email'); ?>
- Form->input('password', ['label' => __('Password')]); ?>
- or = $this->Html->link(__('Sign Up'), ['_name' => 'signup']) ?>
-
- = $this->Html->link(__('Forgot password?'), ['_name' => 'forgot_password'], ['class' => 'small-red']) ?>
-Form->end(); ?>
diff --git a/cakephp/notejam/src/Template/Users/signup.ctp b/cakephp/notejam/src/Template/Users/signup.ctp
deleted file mode 100644
index 770953124..000000000
--- a/cakephp/notejam/src/Template/Users/signup.ctp
+++ /dev/null
@@ -1,7 +0,0 @@
-assign('title', __('Sign up')); ?>
-Form->create($user, ['class' => 'offset-by-six sign-in']); ?>
- Form->input('email'); ?>
- Form->input('password', ['label' => __('Password')]); ?>
- Form->input('confirm_password', ['label' => __('Confirm password'), 'type' => 'password']); ?>
- or = $this->Html->link(__('Sign In'), ['_name' => 'signin']) ?>
-Form->end(); ?>
diff --git a/cakephp/notejam/src/View/AppView.php b/cakephp/notejam/src/View/AppView.php
deleted file mode 100644
index e8bb1118c..000000000
--- a/cakephp/notejam/src/View/AppView.php
+++ /dev/null
@@ -1,35 +0,0 @@
-loadHelper('Html');`
- *
- * @return void
- */
- public function initialize()
- {
- }
-}
diff --git a/cakephp/notejam/src/View/Cell/PadsCell.php b/cakephp/notejam/src/View/Cell/PadsCell.php
deleted file mode 100644
index 10d2d301a..000000000
--- a/cakephp/notejam/src/View/Cell/PadsCell.php
+++ /dev/null
@@ -1,33 +0,0 @@
-request->session()->read('Auth.User.id');
- $user = \Cake\ORM\TableRegistry::get('Users')->get($id, [
- 'contain' => ['Pads']
- ]);
- $this->set('pads', $user->pads);
- }
-}
diff --git a/cakephp/notejam/tests/Fixture/NotesFixture.php b/cakephp/notejam/tests/Fixture/NotesFixture.php
deleted file mode 100644
index 5252801d2..000000000
--- a/cakephp/notejam/tests/Fixture/NotesFixture.php
+++ /dev/null
@@ -1,51 +0,0 @@
- ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => false, 'default' => null, 'autoIncrement' => true, 'precision' => null, 'comment' => null],
- 'pad_id' => ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => true, 'default' => null, 'precision' => null, 'comment' => null, 'autoIncrement' => null],
- 'user_id' => ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null, 'autoIncrement' => null],
- 'name' => ['type' => 'string', 'length' => 100, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null, 'fixed' => null],
- 'text' => ['type' => 'text', 'length' => null, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null],
- 'created_at' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null],
- 'updated_at' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null],
- '_constraints' => [
- 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
- 'user_id_fk' => ['type' => 'foreign', 'columns' => ['user_id'], 'references' => ['users', 'id'], 'update' => 'noAction', 'delete' => 'noAction', 'length' => []],
- 'pad_id_fk' => ['type' => 'foreign', 'columns' => ['pad_id'], 'references' => ['pads', 'id'], 'update' => 'noAction', 'delete' => 'noAction', 'length' => []],
- ],
- ];
- // @codingStandardsIgnoreEnd
-
- /**
- * Records
- *
- * @var array
- */
- public $records = [
- [
- 'id' => 1,
- 'pad_id' => 1,
- 'user_id' => 1,
- 'name' => 'Note #1',
- 'text' => 'Lorem ipsum dolor sit amet, aliquet feugiat. Convallis morbi fringilla gravida, phasellus feugiat dapibus velit nunc, pulvinar eget sollicitudin venenatis cum nullam, vivamus ut a sed, mollitia lectus. Nulla vestibulum massa neque ut et, id hendrerit sit, feugiat in taciti enim proin nibh, tempor dignissim, rhoncus duis vestibulum nunc mattis convallis.',
- 'created_at' => '2015-07-12 19:07:40',
- 'updated_at' => '2015-07-12 19:07:40'
- ],
- ];
-}
diff --git a/cakephp/notejam/tests/Fixture/PadsFixture.php b/cakephp/notejam/tests/Fixture/PadsFixture.php
deleted file mode 100644
index 27da918d4..000000000
--- a/cakephp/notejam/tests/Fixture/PadsFixture.php
+++ /dev/null
@@ -1,42 +0,0 @@
- ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => false, 'default' => null, 'autoIncrement' => true, 'precision' => null, 'comment' => null],
- 'name' => ['type' => 'string', 'length' => 100, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null, 'fixed' => null],
- 'user_id' => ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null, 'autoIncrement' => null],
- '_constraints' => [
- 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
- 'user_id_fk' => ['type' => 'foreign', 'columns' => ['user_id'], 'references' => ['users', 'id'], 'update' => 'noAction', 'delete' => 'noAction', 'length' => []],
- ],
- ];
- // @codingStandardsIgnoreEnd
-
- /**
- * Records
- *
- * @var array
- */
- public $records = [
- [
- 'id' => 1,
- 'name' => 'Pad',
- 'user_id' => 1
- ],
- ];
-}
diff --git a/cakephp/notejam/tests/Fixture/UsersFixture.php b/cakephp/notejam/tests/Fixture/UsersFixture.php
deleted file mode 100644
index 6731d3a4f..000000000
--- a/cakephp/notejam/tests/Fixture/UsersFixture.php
+++ /dev/null
@@ -1,48 +0,0 @@
- ['type' => 'integer', 'length' => null, 'unsigned' => false, 'null' => false, 'default' => null, 'autoIncrement' => true, 'precision' => null, 'comment' => null],
- 'email' => ['type' => 'string', 'length' => 75, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null, 'fixed' => null],
- 'password' => ['type' => 'string', 'length' => 128, 'null' => false, 'default' => null, 'precision' => null, 'comment' => null, 'fixed' => null],
- '_constraints' => [
- 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
- ],
- ];
- // @codingStandardsIgnoreEnd
-
- /**
- * Records
- *
- * @var array
- */
- public $records = [
- [
- 'id' => 1,
- 'email' => 'user1@example.com',
- // password is 111111
- 'password' => '$2y$10$0hoGWxcL.dC6WWrhCDQUVezLFlxMkguhXDziDi.yQSLjhoBaI9FDO'
- ],
- [
- 'id' => 2,
- 'email' => 'user2@example.com',
- // password is 111111
- 'password' => '$2y$10$0hoGWxcL.dC6WWrhCDQUVezLFlxMkguhXDziDi.yQSLjhoBaI9FDO'
- ],
- ];
-}
diff --git a/cakephp/notejam/tests/TestCase/Controller/NotesControllerTest.php b/cakephp/notejam/tests/TestCase/Controller/NotesControllerTest.php
deleted file mode 100644
index 5fc33976f..000000000
--- a/cakephp/notejam/tests/TestCase/Controller/NotesControllerTest.php
+++ /dev/null
@@ -1,151 +0,0 @@
-signin($this->user);
- $data = ['name' => 'New note', 'text' => 'Text'];
- $this->post('/notes/create', $data);
- $this->assertResponseSuccess();
- $this->assertRedirect('/');
- $this->assertEquals(
- TableRegistry::get('Notes')->get(2)->name,
- $data['name']
- );
- }
-
- /**
- * Test if validation works when create a note
- *
- * @return void
- */
- public function testCreateFailRequiredFields()
- {
- $this->signin($this->user);
- $this->post('/notes/create', ['name' => '']);
- $this->assertResponseContains('This field cannot be left empty');
- }
-
- /**
- * Test if note can be successfully edited
- *
- * @return void
- */
- public function testEditSuccess()
- {
- $this->signin($this->user);
- $data = ['name' => 'New note name'];
- $this->post('/notes/1/edit', $data);
- $this->assertResponseSuccess();
- $this->assertRedirect('/notes/1');
- $this->assertEquals(
- TableRegistry::get('Notes')->get(1)->name,
- $data['name']
- );
- }
-
- /**
- * Test if validation works when edit a note
- *
- * @return void
- */
- public function testEditFailRequiredFields()
- {
- $this->signin($this->user);
- $this->post('/notes/1/edit', ['name' => '']);
- $this->assertResponseContains('This field cannot be left empty');
- }
-
- /**
- * Test if note cannot be successfully viewed by not an owner
- *
- * @return void
- */
- public function testEditFailNotAnOwner()
- {
- $this->signin(['id' => 2, 'email' => 'user2@example.com']);
- $data = ['name' => 'New note name'];
- $this->post('/notes/1/edit', $data);
- $this->assertResponseError();
- }
-
- /**
- * Test if note can be successfully viewed
- *
- * @return void
- */
- public function testViewSuccess()
- {
- $this->signin($this->user);
- $this->get('/notes/1');
- $this->assertResponseSuccess();
- $this->assertResponseContains('Note #1');
- }
-
- /**
- * Test if note cannot be viewed by not an owner
- *
- * @return void
- */
- public function testViewFailNotAnOwner()
- {
- $this->signin(['id' => 2, 'email' => 'user2@example.com']);
- $this->get('/notes/1/');
- $this->assertResponseError();
- }
-
- /**
- * Test if note can be successfully deleted
- *
- * @return void
- */
- public function testDeleteSuccess()
- {
- $this->signin($this->user);
- $this->post('/notes/1/delete', []);
- $this->assertResponseSuccess();
- $this->assertRedirect('/');
- $this->assertEquals(
- TableRegistry::get('Notes')->find('all')->count(),
- 0
- );
- }
-
- /**
- * Test if note cannot be deleted by not an owner
- *
- * @return void
- */
- public function testDeleteFailNotAnOwner()
- {
- $this->signin(['id' => 2, 'email' => 'user2@example.com']);
- $this->post('/notes/1/delete', []);
- $this->assertResponseError();
- }
-}
diff --git a/cakephp/notejam/tests/TestCase/Controller/PadsControllerTest.php b/cakephp/notejam/tests/TestCase/Controller/PadsControllerTest.php
deleted file mode 100644
index d1921f7cb..000000000
--- a/cakephp/notejam/tests/TestCase/Controller/PadsControllerTest.php
+++ /dev/null
@@ -1,151 +0,0 @@
-signin($this->user);
- $data = ['name' => 'New pad'];
- $this->post('/pads/create', $data);
- $this->assertResponseSuccess();
- $this->assertRedirect('/pads/2');
- $this->assertEquals(
- TableRegistry::get('Pads')->get(2)->name,
- $data['name']
- );
- }
-
- /**
- * Test if validation works when create a pad
- *
- * @return void
- */
- public function testCreateFailRequiredFields()
- {
- $this->signin($this->user);
- $this->post('/pads/create', ['name' => '']);
- $this->assertResponseContains('This field cannot be left empty');
- }
-
- /**
- * Test if pad can be successfully edited
- *
- * @return void
- */
- public function testEditSuccess()
- {
- $this->signin($this->user);
- $data = ['name' => 'New pad name'];
- $this->post('/pads/1/edit', $data);
- $this->assertResponseSuccess();
- $this->assertRedirect('/pads/1');
- $this->assertEquals(
- TableRegistry::get('Pads')->get(1)->name,
- $data['name']
- );
- }
-
- /**
- * Test if validation works when edit a pad
- *
- * @return void
- */
- public function testEditFailRequiredFields()
- {
- $this->signin($this->user);
- $this->post('/pads/1/edit', ['name' => '']);
- $this->assertResponseContains('This field cannot be left empty');
- }
-
- /**
- * Test if pad cannot be edited by not an owner
- *
- * @return void
- */
- public function testEditFailNotAnOwner()
- {
- $this->signin(['id' => 2, 'email' => 'user2@example.com']);
- $data = ['name' => 'New pad name'];
- $this->post('/pads/1/edit', $data);
- $this->assertResponseError();
- }
-
- /**
- * Test if pad can be successfully viewed
- *
- * @return void
- */
- public function testViewSuccess()
- {
- $this->signin($this->user);
- $this->get('/pads/1');
- $this->assertResponseSuccess();
- $this->assertResponseContains('Pad (1)');
- }
-
- /**
- * Test if pad cannot be viewed by not an owner
- *
- * @return void
- */
- public function testViewFailNotAnOwner()
- {
- $this->signin(['id' => 2, 'email' => 'user2@example.com']);
- $this->get('/pads/1');
- $this->assertResponseError();
- }
-
- /**
- * Test if pad can be successfully deleted
- *
- * @return void
- */
- public function testDeleteSuccess()
- {
- $this->signin($this->user);
- $this->post('/pads/1/delete', []);
- $this->assertResponseSuccess();
- $this->assertRedirect('/');
- $this->assertEquals(
- TableRegistry::get('Pads')->find('all')->count(),
- 0
- );
- }
-
- /**
- * Test if pad cannot be deleted by not an owner
- *
- * @return void
- */
- public function testDeleteFailNotAnOwner()
- {
- $this->signin(['id' => 2, 'email' => 'user2@example.com']);
- $this->post('/pads/1/delete', []);
- $this->assertResponseError();
- }
-}
diff --git a/cakephp/notejam/tests/TestCase/Controller/UsersControllerTest.php b/cakephp/notejam/tests/TestCase/Controller/UsersControllerTest.php
deleted file mode 100644
index 15ce28ec3..000000000
--- a/cakephp/notejam/tests/TestCase/Controller/UsersControllerTest.php
+++ /dev/null
@@ -1,139 +0,0 @@
- 'user@example.com',
- 'password' => 'pa$$word',
- 'confirm_password' => 'pa$$word'
- ];
- $this->post('/signup', $data);
- $this->assertResponseSuccess();
- $users = TableRegistry::get('Users');
- $query = $users->find()->where(['email' => $data['email']]);
- $this->assertEquals(1, $query->count());
- }
-
- /**
- * Test if signup fails if required fields are missing
- *
- * @return void
- */
- public function testSignupFailRequiredFields()
- {
- $data = [
- 'email' => '',
- 'password' => '',
- 'confirm_password' => ''
- ];
- $this->post('/signup', $data);
- $this->assertResponseSuccess();
- $this->assertResponseContains('This field cannot be left empty');
- }
-
- /**
- * Test if signup fails if email is invalid
- *
- * @return void
- */
- public function testSignupFailInvalidEmail()
- {
- $data = [
- 'email' => 'invalid email'
- ];
- $this->post('/signup', $data);
- $this->assertResponseSuccess();
- $this->assertResponseContains('The provided value is invalid');
- }
-
- /**
- * Test if signup fails if email already exists
- *
- * @return void
- */
- public function testSignupFailEmailExists()
- {
- $data = [
- 'email' => 'user1@example.com',
- 'password' => 'pa$$word',
- 'confirm_password' => 'pa$$word'
- ];
- $this->post('/signup', $data);
- $this->assertResponseSuccess();
- $this->assertResponseContains('This value is already in use');
- }
-
- /**
- * Test if signup fails if passwords do not match
- *
- * @return void
- */
- public function testSignupFailPasswordsNotMatch()
- {
- $data = [
- 'email' => 'user1@example.com',
- 'password' => 'pa$$word1',
- 'confirm_password' => 'pa$$word2'
- ];
- $this->post('/signup', $data);
- $this->assertResponseSuccess();
- $this->assertResponseContains('Passwords do not match');
- }
-
- /**
- * Test if signin success
- *
- * @return void
- */
- public function testSigninSuccess()
- {
- $data = [
- 'email' => 'user1@example.com',
- 'password' => '111111'
- ];
- $this->post('/signin', $data);
- $this->assertResponseSuccess();
- $this->assertRedirect(['controller' => 'Notes', 'action' => 'index']);
- $this->assertSession('user1@example.com', 'Auth.User.email');
-
- }
-
- /**
- * Test if signin fails if provided credentials are wroing
- *
- * @return void
- */
- public function testSigninFailWrongCredentials()
- {
- $data = [
- 'email' => 'user2@example.com',
- 'password' => 'wrong password'
- ];
- $this->post('/signin', $data);
- $this->assertResponseContains('Your username or password is incorrect.');
- }
-}
diff --git a/cakephp/notejam/tests/TestCase/NotejamTestCase.php b/cakephp/notejam/tests/TestCase/NotejamTestCase.php
deleted file mode 100644
index d8d5f468c..000000000
--- a/cakephp/notejam/tests/TestCase/NotejamTestCase.php
+++ /dev/null
@@ -1,44 +0,0 @@
- 1,
- 'email' => 'user@example.com'
- ];
-
- /**
- * Sign in user
- *
- * @param array $user User
- * @return void
- */
- public function signin($user)
- {
- $this->session([
- 'Auth' => [
- 'User' => [
- 'id' => $user['id'],
- 'username' => $user['email']
- ]
- ]
- ]);
- }
-
- /**
- * Create a user
- *
- * @param array $userData User data
- * @return User
- */
- public function createUser($userData)
- {
- $user = TableRegistry::get('Users')->newEntity($userData);
- TableRegistry::get('Users')->save($user);
- return $user;
- }
-}
diff --git a/cakephp/notejam/tests/bootstrap.php b/cakephp/notejam/tests/bootstrap.php
deleted file mode 100644
index e56aa9df2..000000000
--- a/cakephp/notejam/tests/bootstrap.php
+++ /dev/null
@@ -1,8 +0,0 @@
-
- RewriteEngine On
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteRule ^ index.php [L]
-
diff --git a/cakephp/notejam/webroot/css/style.css b/cakephp/notejam/webroot/css/style.css
deleted file mode 100644
index 5748e0390..000000000
--- a/cakephp/notejam/webroot/css/style.css
+++ /dev/null
@@ -1,396 +0,0 @@
-/*
-* Skeleton V1.0.3
-* Copyright 2011, Dave Gamache
-* www.getskeleton.com
-* Free to use under the MIT license.
-* http://www.opensource.org/licenses/mit-license.php
-* 7/17/2011
-*/
-
-
-/* Documentation Styles
-================================================== */
- div.container {
- padding-top: 40px; }
-
- /* Doc nav */
- nav {
- width: 160px; }
- #logo, .bold-header {
- margin-bottom: 30px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- letter-spacing: -1px;
- color: #555;
- font-weight: bold; }
- .bold-header span {
- font-weight: normal;
- font-size: 23px;
- }
- .bold-header a.header {
- text-decoration: none;
- color: inherit;
- }
- .bold-header span.jam {
- font-size: 46px;
- line-height: 50px;
- }
- nav ul {
- float: left; }
- nav ul li {
- display: block;
- margin-bottom: 10px; }
- nav ul li a,
- nav ul li a:visited,
- nav ul li a:active {
- font-size: 14px;
- color: #555;
- text-decoration: none;
- font-weight: bold; }
- nav ul li a:hover,
- nav ul li a:focus {
- color: #222; }
- header h1 {
- font-size: 52px;
- line-height: 61px;
- letter-spacing: -1px;
- font-weight: normal;
- font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; }
- hr.large {
- border: none;
- height: 8px;
- background: #ebebeb;
- margin: 50px 0; }
- div.doc-section {
- margin: 30px 0; }
-
- #whatAndWhy .row {
- padding: 30px 0 0; }
-
- #typography blockquote {
- margin-top: 20px; }
-
- .hidden-code a {
- font-size: 12px;
- color: #999; }
- .hidden-code>div {
- display: none; }
-
-
- /* Grid */
- #grid .column,
- #grid .columns {
- background: #ddd;
- height: 25px;
- line-height: 25px;
- margin-bottom: 10px;
- text-align: center;
- text-transform: uppercase;
- color: #555;
- font-size: 12px;
- font-weight: bold;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border-radius: 2px; }
- #grid .column:hover,
- #grid .columns:hover {
- background: #bbb;
- color: #333; }
- #grid .example-grid { overflow: hidden; }
-
- .post-button-note,
- .post-button-note a {
- font-size: 11px;
- color: #999; }
-
- #examples .four.columns a {
- text-decoration: none;
- }
- #examples .four.columns a:hover {
- text-decoration: underline;
- }
-
-
- .resize {
- position: fixed;
- bottom: 0;
- right: 0;
- height: 80px;
- width: 80px;
- background: url(images/resize.png); }
-
-
- img {
- max-width: 100%;
- height: auto; }
-
- .gist-meta { display: none !important;}
-
- ul ul ul li { margin-bottom: 3px; }
-
- .twitter-share-button { margin-bottom: -18px; }
-
- /* Table stylesheets */
- table {
- width: 100%;
- border-collapse: collapse;
- }
-
- table th, table td {
- padding: 10px 10px 9px;
- font-size: 13px;
- line-height: 18px;
- text-align: left;
- }
-
- table td {
- vertical-align: top;
- border-top: solid 1px #ddd;
- }
-
- table th {
- padding-top: 9px;
- font-weight: bold;
- vertical-align: middle;
- }
-
- table.condensed th, table.condensed td {
- padding: 5px 5px 4px;
- }
-
- table.bordered {
- border-collapse: separate;
- border: solid 1px #ddd;
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- border-radius: 2px;
- }
-
- table.bordered th + th,
- table.bordered th + td,
- table.bordered td + td {
- border-left: solid 1px #ddd;
- }
-
- .zebra-striped tbody tr:nth-child(odd) td,
- .zebra-striped tbody tr:nth-child(odd) th {
- background: #f5f5f5;
- }
-
-.carbonad,
-.carbonad-image,
-.carbonad-text,
-.carbonad-tag {
- background: none !important;
- border: none !important;
- margin-left: 0 !important;
-}
-.carbonad-tag {
- margin-top: 6px !important;
- padding-top: 0 !important;
-}
-.carbonad-text {
- height: auto !important;
-}
-.carbonad-image {
- margin-top: 0 !important;
-}
-
-.hidden-text {
- font-size: 12px;
- color: #999;
-}
-
-td.date, th.date {
- text-align: right;
-}
-
-td.date {
- font-style: italic;
-}
-
-form.note input[type="text"], form.note textarea {
- width: 100%;
-}
-
-form hr {
- width: 218px;
- margin: 10px 0px;
-}
-
-form.note textarea {
- height: 250px;
-}
-
-div.content-area {
- min-height: 600px;
-}
-
-hr.footer {
- margin-bottom: 10px;
-}
-
-div.footer {
- margin-bottom: 10px;
- text-align: center;
- font-size: 12px;
-}
-
-form.sign-in {
- margin: 50px 0 0 0;
-}
-
-.sort_arrow {
- text-decoration: none;
-}
-
-.sort_arrow:hover {
- text-decoration: none;
- color: red;
-}
-
-div.sign-in-out-block {
- position: absolute;
- right: 14px;
- top: 8px;
- font-size: 12px;
-}
-
-div.sign-in-out-block a {
- /*text-decoration: none;*/
-}
-
-a.small-red {
- color: red;
- font-size: 12px;
-}
-
-table.notes {
- margin: 0 0 20px 0;
-}
-
-table.notes th.note {
- width: 72%;
-}
-
-table.notes td.pad {
- color: grey;
-}
-
-table.notes td.pad a {
- color: grey;
- text-decoration: underline;
- font-style: normal;
-}
-
-
-table.notes td.pad a:hover {
- color: black;
-}
-
-p.empty {
- color: grey;
- font-style: italic;
-}
-
-a.delete-note {
- float: right;
- font-size: 12px;
- color: red;
-}
-
-.red, input.red {
- color: red !important;
-}
-
-ul.errorlist, ul.errors, .error-message {
- margin: -18px 0 0 0;
-}
-
-ul.errorlist li, ul.errors li, .error-message {
- color: red;
-}
-
-.alert-area {
- text-align: center;
-}
-
-.alert {
- padding: 5px 8px;
- margin: 0 0 12px 0;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border-radius: 2px;
-}
-
-.alert-success {
- color: #468847;
- background-color: #dff0d8;
- border: 1px solid #d6e9c6;
-}
-
-.alert-error {
- color: #b94a48;
- background-color: #f2dede;
- border: 1px solid #eed3d7;
-}
-
- /* Mobile */
- @media only screen and (max-width: 767px) {
- header h1 { font-size: 34px; line-height: 37px; }
- nav { position: relative; }
- nav ul,
- .carbonad {
- display: none;
- }
- #logo { text-align: left; }
- #examples .four.columns {
- padding-top: 30px;
- }
- }
-
- /* Mobile Landscape */
- @media only screen and (min-width: 480px) and (max-width: 767px) {
- nav ul {
- display: none;
- }
- }
-
- /* Non 960 */
- @media only screen and (max-width: 959px) {
- #logo {
- font-size: 21px;
- margin-bottom: 15px; }
- nav .button {
- padding: 9px 20px 11px; }
- }
-
- /* iPad Portrait/Browser */
- @media only screen and (min-width: 768px) and (max-width: 959px) {
- nav {
- width: 124px; }
- }
-
- /* Mobile/Browser */
- @media only screen and (max-width: 767px) {}
-
- /* Mobile Landscape/Browser */
- @media only screen and (min-width: 480px) and (max-width: 767px) {}
-
- /* Anything smaller than standard 960 */
- @media only screen and (max-width: 959px) {}
-
-
- /* iPad Portrait Only */
- @media only screen and (min-width: 768px) and (max-width: 959px) and (max-device-width: 1000px) {}
-
- /* Mobile Only */
- @media only screen and (max-width: 767px) and (max-device-width: 1000px) {}
-
- /* Mobile Landscape Only */
- @media only screen and (min-width: 480px) and (max-width: 767px) and (max-device-width: 1000px) {}
-
- /* Anything smaller than standard 960 on a device */
- @media only screen and (max-width: 959px) and (max-device-width: 1000px) {
- .resize { display: none; }
- }
-
diff --git a/cakephp/notejam/webroot/favicon.ico b/cakephp/notejam/webroot/favicon.ico
deleted file mode 100644
index aaac9c853a085a151ef0b2ded6f03ecd88f88899..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1782
zcmZuxc{H2(8vck{YH2L3U6I6Ci{zs&X;D#QrZ*&^i{84XI(0j$xRmxXt*IrVEw@F7
z+uEv@*w=$BB$il$kZ35^Qn3tU=~#l=<}*Ea{<`P9=l8tpAMbgd-wOZ|fFuBi0}#pr
z2ND2a1OR}({+F091pr7%0HAo{-4u^&9fwMa?qB1G5JD3GTowks#ug_?5R7?V@^Xc+
z*}%H~v}J{^c^3lwVjYGU$f?$|_%lYZU5qWiP`8H5XL1GKO@bkLp9V|}jig5&7zyPTS^5n9mvAcYk~WabC%ir3gh_ZWG%
zD$_ms>m%x||H3BV2cxfchuo++1AeTHsj#x0=!{w{DxMom7B&QIe;8kxC>F2sJMWWr
zrWTfF2X+qECkLp@CFR?DE7foA?rzPu6#t7;@raumG{FuXX-%w*Oiex7Ih=?m0cQVh
zO)*WEo_=NCnmi$zX#M`TV^FQt9p~(&AvnjIJ@v#1er$?BkO)jDSULrx(?$C^T@q=l
zo!QLDt-CQ_WxrCM4cC$EmO4Pbe1!kbc-DsD8)$x({B1rb3h-(#DZC?2C!4-KuJX2T
zePuoL{C#EA)OvuHgOYTE`sA@hJKwvJk-LIOu}-70N3W2!84<UQ4$(~
zL;}g98v*tpK&~M;PndfMERw5v=GF2+#
zJrsWuY_9aotmF4L*1Ifh=SQ1ft0~r{V#RB}WQ3?SzBCqiT*)<7t$E?VK5g;#5xPCl
zVSi7Ys|kMrllmm$wnSSt-$ShL|KsB?t_xc}Yx8swg|ag>{)yK38>^e=i=X5bcO*G>
zI$L&7{d>K!Jx+F&Pi>yvgjHTQqH{fjtfw>qp)SL|>CL6uDqH~(G1Nvbh%xFc0OuIw
zeunvSDT^9l-a*va*_&S9XelkT{mA>d--XoKq`tZJt~pkVl_opRBdu=5_fzhS{udk-
z*p%99jnt8bdoi3`P0_;D3OD`T-O)V7cY6@)I)CUNourP%dFr8TO^U8NSFcCW>~J}{fUbJAengd7wot}smH>`oZ#`iWcLKC`dVhH`E@jgo?sQGb-NIa!C*{!yQq4B)0pO7_Q
zZ|PP~+f
zzPQM(X5rbSW0p$na0Z(|9#YE1K1R9XtkvMgc|+4Rlc!sh$`U9X);EmktX{IAvH@I)
z45Q{|EYbpCrWx1xWt_dJ(D3kJJI9xObF~K*+fG$E-cvT9Oo#-F?!7lMaXw|?VfmuzF_PH2>WxRtJg
zJiotCAc}er#jch1bAG0!AeRy~KgRoRbtGeWcePZ|uo6mN&H|oyh>Qjn>K;$*qvAee
zGA+&UIpgyY9v>cD31jE};0fDMP@I)MSV~Sw2@WR2W-V7@!ir_#Rh#7}%J;Wlb7xOs
z#ngTj%aeevi&OmZZRIXlK>y0w#W3#d>0~B8|2$gUm@UvG$k|{`jCbwNuZgNyfv>%!
vNX3^}e9zJgoz!XVI;{2C>Dyj9q)cr7>
zIGsQFGn3|
zCzs2iP$-yfVPOGVTU&6sT(-5fwHb2tVsLP9#{Vr9Ct?R7q(rf?v2A5#W$OI=e1YUJ
zQ1YRnA&iWSQ1XYAm__>aYb6XIhMiYVD+-z8_pYi6+CsH{*^m;vOjqvbr=H&DFkeqxHQBh$Scsoy0Glw(T
zsaSG*ok62V;~yXYNgP*DUw;o98^+0@vGFb{HC+As}XJ=;xg=B7N_;-mKbHH{|lXs_o+aPcs5~J?s%^P2Odb)Uz
z$GvY6^!N9(C2-h?28B$qx7%_yHnt2eU%nQ0qThbl6a_+b)EirjBgQ`g1_07Fr&6R?
RzIgxu002ovPDHLkV1mdlwUYn<
diff --git a/cakephp/notejam/webroot/img/cake.power.gif b/cakephp/notejam/webroot/img/cake.power.gif
deleted file mode 100644
index 8f8d570a2e24d86f0ad7730ee8f2435fd49f152c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 201
zcmV;)05<&ZTq0L2I(c1A@d@rg`ENj#vn
zcl`yi#iKX*jb2F7vd0WQgUq5Tw}Jp}g+ZnCeBY3dYNI+m71%bHRfx4UCkD2th(Q*@
zmd5r+MJNYn7dispatch(
- Request::createFromGlobals(),
- new Response()
-);
diff --git a/cakephp/notejam/webroot/js/empty b/cakephp/notejam/webroot/js/empty
deleted file mode 100644
index e69de29bb..000000000
diff --git a/contribute.rst b/contribute.rst
deleted file mode 100644
index 4272d6c7f..000000000
--- a/contribute.rst
+++ /dev/null
@@ -1,152 +0,0 @@
-******************
-Contribution guide
-******************
-
-=========================
-Pull requests and commits
-=========================
-
-Send your pull requests in the ``master`` branch.
-
-Please prepend commit messages with framework name.
-
-**Good** commit messages:
-
-.. code-block::
-
- Django: Implemented signout functionality
-
-.. code-block::
-
- Symfony: Fixed broken pad tests
-
-**Bad** commit messages:
-
-.. code-block::
-
- Implemented signout functionality in django
-
-.. code-block::
-
- Fixed broken symfony pad tests
-
-
-==========
-Code style
-==========
-
-Please follow code style guidelines and best practices for your programming language and framework.
-Specify guidelines in a README file in a code style section.
-
-
-====================
-Application overview
-====================
-
-Notejam is a web application which allows user to sign up/in/out and create/view/edit/delete notes.
-Notes are grouped in pads. See `screenshots `_
-for look and feel.
-
------------------------
-Objects/Models/Entities
------------------------
-
-Structure of objects (aka models or entities) used in the app:
-
-* Note: id, pad_id, user_id, name, text, created_at, updated_at
-* Pad: id, user_id, name
-* User: id, email, password
-
-See recommended `database schema `_ for details.
-
-
------
-Pages
------
-
-All html layouts are sliced and available in the `html `_ folder.
-
-**User pages**
-
-* ``GET /signup/`` - Show Sign Up form
-* ``POST /signup/`` - Sign Up
-* ``GET /signin/`` - Show Sign In form
-* ``POST /signin/`` - Sign In
-* ``GET /signout/`` - Sign out
-* ``GET /forgot-password/`` - Show Forgot password form
-* ``POST /forgot-password/`` - Forgot Password request
-* ``GET /settings/`` - Show user settings form
-* ``POST /settings/`` - Change user settings
-
-
-**Note pages**
-
-
-* ``GET /notes/create/`` - Show Create note form
-* ``POST /notes/create/`` - Create note
-* ``GET /notes//`` - View note
-* ``GET /notes//edit/`` - Show Edit note form
-* ``POST /notes//edit/`` - Edit note
-* ``GET /notes//delete/`` - Show confirmation delete page
-* ``POST /notes//delete/`` - Delete note
-
-
-**Pad pages**
-
-
-* ``GET /pads/create/`` - Show Create pad form
-* ``POST /pads/create/`` - Create pad
-* ``GET /pads//`` - View pad notes
-* ``GET /pads//edit/`` - Show Edit pad form
-* ``POST /pads//edit/`` - Edit pad
-* ``GET /pads//delete/`` - Show confirmation delete page
-* ``POST /pads//delete/`` - Delete pad
-
-
----------------------
-Functional/unit tests
----------------------
-
-Any kind of tests are very desirable.
-
-**Recommended test cases**
-
-Sign Up:
-
-* user can successfully sign up
-* user can't sign up if required fields are missing
-* user can't sign up if email is invalid
-* user can't sign up if email already exists
-* user can't sign up if passwords do not match
-
-Sign In:
-
-* user can successfully sign in
-* user can't sign in if required fields are missing
-* user can't sign in if credentials are wrong
-
-Notes:
-
-* note can be successfully created
-* note can't be created by anonymous user
-* note can't be created if required fields are missing
-* note can be edited by its owner
-* note can't be edited if required fields are missing
-* note can't be edited by not an owner
-* note can't be added into another's user pad
-* note can be viewed by its owner
-* note can't be viewed by not an owner
-* note can be deleted by its owner
-* note can't be deleted by not an owner
-
-Pads:
-
-* pad can be successfully created
-* pad can't be created if required fields are missing
-* pad can be edited by its owner
-* pad can't be edited if required fields are missing
-* pad can't be edited by not an owner
-* pad can be viewed by its owner
-* pad can't be viewed by not an owner
-* pad can be deleted by its owner
-* pad can't be deleted by not an owner
diff --git a/django/README.rst b/django/README.rst
deleted file mode 100644
index bfcdd1ba2..000000000
--- a/django/README.rst
+++ /dev/null
@@ -1,83 +0,0 @@
-***************
-Notejam: Django
-***************
-
-Notejam application implemented using `Django `_ framework.
-
-Django version: 1.6
-
-==========================
-Installation and launching
-==========================
-
------
-Clone
------
-
-Clone the repo:
-
-.. code-block:: bash
-
- $ git clone git@github.com:komarserjio/notejam.git YOUR_PROJECT_DIR/
-
--------
-Install
--------
-Use `virtualenv `_ or `virtualenvwrapper `_
-for `environment management `_.
-
-Install dependencies:
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/django/
- $ virtualenv .venv -p python2.7 # This version of Django only works on python2
- $ source .venv/bin/activate
- $ pip install -r requirements.txt
-
-Create database schema:
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/django/notejam/
- $ ./manage.py syncdb
- $ ./manage.py migrate
-
-------
-Launch
-------
-
-Start django web server:
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/django/notejam/
- $ ./manage.py runserver
-
-Go to http://127.0.0.1:8000/ in your browser.
-
----------
-Run tests
----------
-
-Run functional and unit tests:
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/django/notejam/
- $ ./manage.py test
-
-
-============
-Contribution
-============
-Do you have python/django experience? Help the app to follow python and django best practices.
-
-Please send your pull requests in the ``master`` branch.
-Always prepend your commits with framework name:
-
-.. code-block:: bash
-
- Django: Implemented sign in functionality
-
-Read `contribution guide `_ for details.
diff --git a/django/notejam/manage.py b/django/notejam/manage.py
deleted file mode 100755
index 6b90f3bb6..000000000
--- a/django/notejam/manage.py
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env python
-import os
-import sys
-
-if __name__ == "__main__":
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "notejam.settings")
-
- from django.core.management import execute_from_command_line
-
- execute_from_command_line(sys.argv)
diff --git a/django/notejam/notejam/__init__.py b/django/notejam/notejam/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/django/notejam/notejam/settings.py b/django/notejam/notejam/settings.py
deleted file mode 100644
index 19991825b..000000000
--- a/django/notejam/notejam/settings.py
+++ /dev/null
@@ -1,184 +0,0 @@
-import os
-
-DEBUG = True
-TEMPLATE_DEBUG = DEBUG
-ALLOWED_HOSTS = []
-
-PROJECT_DIR = "{}/../".format(os.path.dirname(__file__))
-
-ADMINS = (
- ('Sergey Komar', 'komarserjio@gmail.com'),
-)
-
-MANAGERS = ADMINS
-
-DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': 'notejam.db',
- 'USER': '',
- 'PASSWORD': '',
- 'HOST': '',
- 'PORT': '',
- }
-}
-
-# Local time zone for this installation. Choices can be found here:
-# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
-# although not all choices may be available on all operating systems.
-# In a Windows environment this must be set to your system time zone.
-TIME_ZONE = 'Europe/Kiev'
-
-# Language code for this installation. All choices can be found here:
-# http://www.i18nguy.com/unicode/language-identifiers.html
-LANGUAGE_CODE = 'en-us'
-
-SITE_ID = 1
-
-# If you set this to False, Django will make some optimizations so as not
-# to load the internationalization machinery.
-USE_I18N = True
-
-# If you set this to False, Django will not format dates, numbers and
-# calendars according to the current locale.
-USE_L10N = True
-
-# If you set this to False, Django will not use timezone-aware datetimes.
-USE_TZ = True
-
-# Absolute filesystem path to the directory that will hold user-uploaded files.
-# Example: "/home/media/media.lawrence.com/media/"
-MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media/')
-
-# URL that handles the media served from MEDIA_ROOT. Make sure to use a
-# trailing slash.
-# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
-MEDIA_URL = ''
-
-# Absolute path to the directory static files should be collected to.
-# Don't put anything in this directory yourself; store your static files
-# in apps' "static/" subdirectories and in STATICFILES_DIRS.
-# Example: "/home/media/media.lawrence.com/static/"
-STATIC_ROOT = os.path.join(PROJECT_DIR, 'static/')
-
-# URL prefix for static files.
-# Example: "http://media.lawrence.com/static/"
-STATIC_URL = '/static/'
-
-# Additional locations of static files
-STATICFILES_DIRS = (
- os.path.join(PROJECT_DIR, 'static_files/'),
-)
-
-# List of finder classes that know how to find static files in
-# various locations.
-STATICFILES_FINDERS = (
- 'django.contrib.staticfiles.finders.FileSystemFinder',
- 'django.contrib.staticfiles.finders.AppDirectoriesFinder',
-# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
-)
-
-# Make this unique, and don't share it with anybody.
-SECRET_KEY = 'g+cy2q816xje*f#k=9z!e*t%h-7tt(tbo$q^1n)l0gd1=x8$65'
-
-# List of callables that know how to import templates from various sources.
-TEMPLATE_LOADERS = (
- 'django.template.loaders.filesystem.Loader',
- 'django.template.loaders.app_directories.Loader',
-# 'django.template.loaders.eggs.Loader',
-)
-
-TEMPLATE_CONTEXT_PROCESSORS = (
- "django.contrib.auth.context_processors.auth",
- "django.core.context_processors.debug",
- "django.core.context_processors.i18n",
- "django.core.context_processors.media",
- "django.core.context_processors.static",
- "django.core.context_processors.tz",
- "django.core.context_processors.request",
- "django.contrib.messages.context_processors.messages"
-)
-
-MIDDLEWARE_CLASSES = (
- 'django.middleware.common.CommonMiddleware',
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.middleware.csrf.CsrfViewMiddleware',
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
- 'django.contrib.messages.middleware.MessageMiddleware',
- # Uncomment the next line for simple clickjacking protection:
- # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
-)
-
-ROOT_URLCONF = 'notejam.urls'
-
-APPEND_SLASH = True
-
-# Python dotted path to the WSGI application used by Django's runserver.
-WSGI_APPLICATION = 'notejam.wsgi.application'
-
-TEMPLATE_DIRS = (
- os.path.join(PROJECT_DIR, 'templates/'),
-)
-
-INSTALLED_APPS = (
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.sites',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- #'django.contrib.admin',
- 'pads',
- 'notes',
- 'users',
- 'south',
-)
-
-AUTHENTICATION_BACKENDS = (
- 'users.auth_backends.EmailModelBackend',
- 'django.contrib.auth.backends.ModelBackend',
-)
-
-LOGIN_URL = '/signin/'
-LOGOUT_URL = '/signout/'
-
-# development email file-based backend
-EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
-EMAIL_FILE_PATH = '/tmp'
-
-# 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.
-# See http://docs.djangoproject.com/en/dev/topics/logging for
-# more details on how to customize your logging configuration.
-LOGGING = {
- 'version': 1,
- 'disable_existing_loggers': False,
- 'filters': {
- 'require_debug_false': {
- '()': 'django.utils.log.RequireDebugFalse'
- }
- },
- 'handlers': {
- 'mail_admins': {
- 'level': 'ERROR',
- 'filters': ['require_debug_false'],
- 'class': 'django.utils.log.AdminEmailHandler'
- }
- },
- 'loggers': {
- 'django.request': {
- 'handlers': ['mail_admins'],
- 'level': 'ERROR',
- 'propagate': True,
- },
- }
-}
-
-# custom test runner
-TEST_RUNNER = 'notejam.tests.AdvancedTestSuiteRunner'
-
-# exclude non app tests
-TEST_EXCLUDE = (
- 'django',
-)
diff --git a/django/notejam/notejam/tests.py b/django/notejam/notejam/tests.py
deleted file mode 100644
index af2615253..000000000
--- a/django/notejam/notejam/tests.py
+++ /dev/null
@@ -1,36 +0,0 @@
-from django.test.simple import DjangoTestSuiteRunner
-from django.conf import settings
-from django.contrib.auth.models import User
-
-
-EXCLUDED_APPS = getattr(settings, 'TEST_EXCLUDE', [])
-
-
-# based on http://djangosnippets.org/snippets/2211/
-# main approach is to ignore library tests
-class AdvancedTestSuiteRunner(DjangoTestSuiteRunner):
- def __init__(self, *args, **kwargs):
- # to avoid circular import
- from django.conf import settings
- settings.TESTING = True
- super(AdvancedTestSuiteRunner, self).__init__(*args, **kwargs)
-
- def build_suite(self, *args, **kwargs):
- suite = super(AdvancedTestSuiteRunner, self).build_suite(*args,
- **kwargs)
- if not args[0] and not getattr(settings, 'RUN_ALL_TESTS', False):
- tests = []
- for case in suite:
- pkg = case.__class__.__module__.split('.')[0]
- if pkg not in EXCLUDED_APPS:
- tests.append(case)
- suite._tests = tests
- return suite
-
-
-# helper test functions
-def create_user(user_data):
- user = User.objects.create(username=user_data['email'], **user_data)
- user.set_password(user_data['password'])
- user.save()
- return user
diff --git a/django/notejam/notejam/urls.py b/django/notejam/notejam/urls.py
deleted file mode 100644
index d3be6875b..000000000
--- a/django/notejam/notejam/urls.py
+++ /dev/null
@@ -1,25 +0,0 @@
-from django.conf.urls import patterns, include, url
-from django.contrib.auth.decorators import login_required
-
-from users.views import (SignupView, SigninView, AccountSettingsView,
-ForgotPasswordView)
-from notes.views import NoteListView
-
-urlpatterns = patterns('',
- # user relates urls
- url(r'^signup/', SignupView.as_view(), name='signup'),
- url(r'^signin/', SigninView.as_view(), name='signin'),
- url(r'^account/', login_required(AccountSettingsView.as_view()),
- name='account_settings'),
- url(r'^forgot-password/', ForgotPasswordView.as_view(),
- name='forgot_password'),
- url(r'^signout/$', 'django.contrib.auth.views.logout',
- {'next_page': '/'}, name='signout'),
-
- # notes
- url(r'^notes/', include('notes.urls')),
- # pads
- url(r'^pads/', include('pads.urls')),
-
- url(r'^$', login_required(NoteListView.as_view()), name='home'),
-)
diff --git a/django/notejam/notejam/wsgi.py b/django/notejam/notejam/wsgi.py
deleted file mode 100644
index 1a69fe50f..000000000
--- a/django/notejam/notejam/wsgi.py
+++ /dev/null
@@ -1,28 +0,0 @@
-"""
-WSGI config for notejam 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
-named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover
-this application via the ``WSGI_APPLICATION`` setting.
-
-Usually you will have the standard Django WSGI application here, but it also
-might make sense to replace the whole Django WSGI application with a custom one
-that later delegates to the Django one. For example, you could introduce WSGI
-middleware here, or combine a Django application with an application of another
-framework.
-
-"""
-import os
-
-os.environ.setdefault("DJANGO_SETTINGS_MODULE", "notejam.settings")
-
-# This application object is used by any WSGI server configured to use this
-# file. This includes Django's development server, if the WSGI_APPLICATION
-# setting points here.
-from django.core.wsgi import get_wsgi_application
-application = get_wsgi_application()
-
-# Apply WSGI middleware here.
-# from helloworld.wsgi import HelloWorldApplication
-# application = HelloWorldApplication(application)
diff --git a/django/notejam/notes/__init__.py b/django/notejam/notes/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/django/notejam/notes/forms.py b/django/notejam/notes/forms.py
deleted file mode 100644
index f42e6a4bc..000000000
--- a/django/notejam/notes/forms.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from django import forms
-
-from notes.models import Note
-
-
-class NoteForm(forms.ModelForm):
- class Meta:
- model = Note
- exclude = ('created_at', 'updated_at', 'user')
diff --git a/django/notejam/notes/migrations/0001_initial.py b/django/notejam/notes/migrations/0001_initial.py
deleted file mode 100644
index 9c1489759..000000000
--- a/django/notejam/notes/migrations/0001_initial.py
+++ /dev/null
@@ -1,84 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
- def forwards(self, orm):
- # Adding model 'Note'
- db.create_table('notes_note', (
- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('pad', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['pads.Pad'], null=True)),
- ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
- ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
- ('text', self.gf('django.db.models.fields.TextField')()),
- ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
- ('updated_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
- ))
- db.send_create_signal('notes', ['Note'])
-
-
- def backwards(self, orm):
- # Deleting model 'Note'
- db.delete_table('notes_note')
-
-
- models = {
- 'auth.group': {
- 'Meta': {'object_name': 'Group'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
- 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
- },
- 'auth.permission': {
- 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
- 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
- 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
- },
- 'auth.user': {
- 'Meta': {'object_name': 'User'},
- 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
- 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
- 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
- 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
- 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
- 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
- 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
- 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
- },
- 'contenttypes.contenttype': {
- 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
- 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
- },
- 'notes.note': {
- 'Meta': {'object_name': 'Note'},
- 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
- 'pad': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['pads.Pad']", 'null': 'True'}),
- 'text': ('django.db.models.fields.TextField', [], {}),
- 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
- 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
- },
- 'pads.pad': {
- 'Meta': {'object_name': 'Pad'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
- 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
- }
- }
-
- complete_apps = ['notes']
\ No newline at end of file
diff --git a/django/notejam/notes/migrations/__init__.py b/django/notejam/notes/migrations/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/django/notejam/notes/models.py b/django/notejam/notes/models.py
deleted file mode 100644
index 055ab8000..000000000
--- a/django/notejam/notes/models.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from django.contrib.auth.models import User
-from django.db import models
-
-from pads.models import Pad
-
-
-class Note(models.Model):
- pad = models.ForeignKey(Pad, null=True, blank=True)
- user = models.ForeignKey(User)
- name = models.CharField(max_length=100)
- text = models.TextField()
- created_at = models.DateTimeField(auto_now_add=True)
- updated_at = models.DateTimeField(auto_now=True)
diff --git a/django/notejam/notes/templates/notes/note_confirm_delete.html b/django/notejam/notes/templates/notes/note_confirm_delete.html
deleted file mode 100644
index c06b5f5e5..000000000
--- a/django/notejam/notes/templates/notes/note_confirm_delete.html
+++ /dev/null
@@ -1,13 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}{{ note.name }}{% endblock %}
-{% block page_title %}{{ note.name }}{% endblock %}
-
-{% block content %}
- Are you sure you want to delete {{ note.name }}?
-
-{% endblock %}
diff --git a/django/notejam/notes/templates/notes/note_create.html b/django/notejam/notes/templates/notes/note_create.html
deleted file mode 100644
index fd38ecb14..000000000
--- a/django/notejam/notes/templates/notes/note_create.html
+++ /dev/null
@@ -1,8 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}New note{% endblock %}
-{% block page_title %}New note{% endblock %}
-
-{% block content %}
- {% include "notes/note_form.html" %}
-{% endblock %}
diff --git a/django/notejam/notes/templates/notes/note_detail.html b/django/notejam/notes/templates/notes/note_detail.html
deleted file mode 100644
index 2390b9df9..000000000
--- a/django/notejam/notes/templates/notes/note_detail.html
+++ /dev/null
@@ -1,14 +0,0 @@
-{% extends "base.html" %}
-{% load date_tags %}
-
-{% block title %}{{note.name}}{%endblock%}
-{% block page_title %}{{note.name}}{%endblock%}
-
-{% block content %}
- Last edited {{ note.updated_at|smart_date }}
-
- {{ note.text }}
-
- Edit
- Delete it
-{% endblock %}
diff --git a/django/notejam/notes/templates/notes/note_edit.html b/django/notejam/notes/templates/notes/note_edit.html
deleted file mode 100644
index 145216fa0..000000000
--- a/django/notejam/notes/templates/notes/note_edit.html
+++ /dev/null
@@ -1,8 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}{{ note.name }}{% endblock %}
-{% block page_title %}{{ note.name }}{% endblock %}
-
-{% block content %}
- {% include "notes/note_form.html" %}
-{% endblock %}
diff --git a/django/notejam/notes/templates/notes/note_form.html b/django/notejam/notes/templates/notes/note_form.html
deleted file mode 100644
index 120e87efc..000000000
--- a/django/notejam/notes/templates/notes/note_form.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
diff --git a/django/notejam/notes/templates/notes/note_list.html b/django/notejam/notes/templates/notes/note_list.html
deleted file mode 100644
index f1c9f5080..000000000
--- a/django/notejam/notes/templates/notes/note_list.html
+++ /dev/null
@@ -1,33 +0,0 @@
-{% extends "base.html" %}
-{% load date_tags %}
-
-{% block title %}All notes ({{ notes.count }}){% endblock %}
-{% block page_title %}All notes ({{ notes.count }}){% endblock %}
-
-{% block content %}
- {% if notes %}
-
-
- | Note ↓↑ |
- Pad |
- Last modified ↓↑ |
-
- {% for note in notes %}
-
- | {{ note.name }} |
-
- {% if note.pad %}
- {{ note.pad.name }}
- {% else %}
- No pad
- {% endif %}
- |
- {{ note.updated_at|smart_date }} |
-
- {% endfor %}
-
- {% else %}
- Create your first note.
- {% endif %}
- New note
-{% endblock %}
diff --git a/django/notejam/notes/templatetags/__init__.py b/django/notejam/notes/templatetags/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/django/notejam/notes/templatetags/date_tags.py b/django/notejam/notes/templatetags/date_tags.py
deleted file mode 100644
index acc17a0c0..000000000
--- a/django/notejam/notes/templatetags/date_tags.py
+++ /dev/null
@@ -1,17 +0,0 @@
-from datetime import date
-from django import template
-
-register = template.Library()
-
-
-@register.filter
-def smart_date(updated_at):
- delta = date.today() - updated_at.date()
- if delta.days == 0:
- return 'Today at {}'.format(updated_at.strftime("%H:%M"))
- elif delta.days == 1:
- return 'Yesterday at {}'.format(updated_at.strftime("%H:%M"))
- elif 1 > delta.days > 4:
- return '{} days ago'.format(abs(delta.days))
- else:
- return updated_at.date()
diff --git a/django/notejam/notes/tests.py b/django/notejam/notes/tests.py
deleted file mode 100644
index e99e18798..000000000
--- a/django/notejam/notes/tests.py
+++ /dev/null
@@ -1,110 +0,0 @@
-from django.core.urlresolvers import reverse
-from django.test import TestCase, Client
-
-from notejam.tests import create_user
-from notes.models import Note
-
-
-class NoteTest(TestCase):
- def setUp(self):
- user_data = {
- 'email': 'user@example.com',
- 'password': 'secure_password'
- }
- self.user = create_user(user_data)
- self.client.login(**user_data)
-
- def test_create_success(self):
- self.client.post(
- reverse('create_note'), {'name': 'pad', 'text': 'pad text'})
- self.assertEqual(1, Note.objects.count())
-
- def test_create_fail_required_fields(self):
- response = self.client.post(reverse('create_note'), {})
- self.assertEqual(
- set(['name', 'text']), set(response.context['form'].errors.keys()))
-
- def test_edit_success(self):
- note_data = {
- 'name': 'note name',
- 'text': 'note text'
- }
- note = Note.objects.create(user=self.user, **note_data)
-
- note_data['name'] = 'new name'
- response = self.client.post(
- reverse('edit_note', args=(note.id,)), note_data)
- self.assertRedirects(response, reverse('home'))
- self.assertEqual(note_data['name'], Note.objects.get(id=note.id).name)
-
- def test_another_user_cant_edit(self):
- user_data = {
- 'email': 'another_user@example.com',
- 'password': 'another_secure_password'
- }
- create_user(user_data)
-
- note_data = {
- 'name': 'note name',
- 'text': 'note text'
- }
- note = Note.objects.create(user=self.user, **note_data)
-
- client = Client()
- client.login(**user_data)
- response = client.post(reverse('edit_note', args=(note.id,)), {})
- self.assertEqual(404, response.status_code)
-
- def test_view_success(self):
- note_data = {
- 'name': 'note name',
- 'text': 'note text'
- }
- note = Note.objects.create(user=self.user, **note_data)
- response = self.client.get(reverse('view_note', args=(note.id,)), {})
- self.assertEqual(note, response.context['note'])
-
- def test_another_user_cant_view(self):
- user_data = {
- 'email': 'another_user@example.com',
- 'password': 'another_secure_password'
- }
- create_user(user_data)
-
- note_data = {
- 'name': 'note name',
- 'text': 'note text'
- }
- note = Note.objects.create(user=self.user, **note_data)
-
- client = Client()
- client.login(**user_data)
- response = client.get(reverse('view_note', args=(note.id,)), {})
- self.assertEqual(404, response.status_code)
-
- def test_delete_success(self):
- note_data = {
- 'name': 'note name',
- 'text': 'note text'
- }
- note = Note.objects.create(user=self.user, **note_data)
- self.client.post(reverse('delete_note', args=(note.id,)), {})
- self.assertEqual(0, Note.objects.count())
-
- def test_another_user_cant_delete(self):
- user_data = {
- 'email': 'another_user@example.com',
- 'password': 'another_secure_password'
- }
- create_user(user_data)
-
- note_data = {
- 'name': 'note name',
- 'text': 'note text'
- }
- note = Note.objects.create(user=self.user, **note_data)
-
- client = Client()
- client.login(**user_data)
- response = client.get(reverse('view_note', args=(note.id,)), {})
- self.assertEqual(404, response.status_code)
diff --git a/django/notejam/notes/urls.py b/django/notejam/notes/urls.py
deleted file mode 100644
index 8f12af5c5..000000000
--- a/django/notejam/notes/urls.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from django.conf.urls import patterns, url
-from django.contrib.auth.decorators import login_required
-
-from notes.views import (NoteCreateView, NoteDeleteView,
-NoteDetailView, NoteUpdateView)
-
-
-# Uncomment the next two lines to enable the admin:
-# from django.contrib import admin
-# admin.autodiscover()
-
-urlpatterns = patterns('notes.views',
- url(r'^create/$', login_required(NoteCreateView.as_view()),
- name='create_note'),
- url(r'^(?P\d+)/$', login_required(NoteDetailView.as_view()),
- name='view_note'),
- url(r'^(?P\d+)/edit/$', login_required(NoteUpdateView.as_view()),
- name='edit_note'),
- url(r'^(?P\d+)/delete/$', login_required(NoteDeleteView.as_view()),
- name='delete_note'),
-)
diff --git a/django/notejam/notes/views.py b/django/notejam/notes/views.py
deleted file mode 100644
index 36fa8ebe2..000000000
--- a/django/notejam/notes/views.py
+++ /dev/null
@@ -1,110 +0,0 @@
-from django.contrib import messages
-from django.core.urlresolvers import reverse_lazy
-from django.shortcuts import redirect
-from django.views.generic.edit import CreateView, UpdateView, DeleteView
-from django.views.generic.detail import DetailView
-from django.views.generic import ListView
-
-
-from notes.models import Note, Pad
-from notes.forms import NoteForm
-
-
-class NoteCreateView(CreateView):
- model = Note
- form_class = NoteForm
- template_name_suffix = '_create'
- success_message = 'Note is successfully created'
-
- def get_initial(self):
- return {'pad': self.request.GET.get('pad', None)}
-
- def get_form(self, form_class):
- form = super(NoteCreateView, self).get_form(self.get_form_class())
- # limit pad choice
- form.fields['pad'].queryset = Pad.objects.filter(
- user=self.request.user
- )
- return form
-
- def form_valid(self, form):
- self.object = form.save(commit=False)
- self.object.user = self.request.user
- self.object.save()
- messages.success(self.request, self.success_message)
- return redirect(self.get_success_url())
-
- def get_success_url(self):
- if self.object.pad is not None:
- return reverse_lazy(
- 'view_pad_notes', kwargs={'pk': self.object.pad.id}
- )
- else:
- return reverse_lazy('home')
-
-
-class NoteUpdateView(UpdateView):
- model = Note
- form_class = NoteForm
- success_url = reverse_lazy('home')
- template_name_suffix = '_edit'
- success_message = 'Note is successfully updated'
-
- def form_valid(self, form):
- messages.success(self.request, self.success_message)
- return super(NoteUpdateView, self).form_valid(form)
-
- def get_queryset(self):
- qs = super(NoteUpdateView, self).get_queryset()
- return qs.filter(user=self.request.user)
-
- def get_form(self, form_class):
- form = super(NoteUpdateView, self).get_form(self.get_form_class())
- # limit pad choice
- form.fields['pad'].queryset = Pad.objects.filter(
- user=self.request.user
- )
- return form
-
- def get_success_url(self):
- if self.object.pad is not None:
- return reverse_lazy(
- 'view_pad_notes', kwargs={'pk': self.object.pad.id}
- )
- else:
- return reverse_lazy('home')
-
-
-class NoteDeleteView(DeleteView):
- model = Note
-
- def get_queryset(self):
- qs = super(NoteDeleteView, self).get_queryset()
- return qs.filter(user=self.request.user)
-
- def get_success_url(self):
- if self.object.pad is not None:
- return reverse_lazy(
- 'view_pad_notes', kwargs={'pk': self.object.pad.id}
- )
- else:
- return reverse_lazy('home')
-
-
-class NoteDetailView(DetailView):
- model = Note
-
- def get_queryset(self):
- qs = super(NoteDetailView, self).get_queryset()
- return qs.filter(user=self.request.user)
-
-
-class NoteListView(ListView):
- model = Note
- context_object_name = 'notes'
- order_by = '-updated_at'
-
- def get_queryset(self):
- qs = super(NoteListView, self).get_queryset()
- order_by = self.request.GET.get('order', self.order_by)
- return qs.filter(user=self.request.user).order_by(order_by)
diff --git a/django/notejam/pads/__init__.py b/django/notejam/pads/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/django/notejam/pads/forms.py b/django/notejam/pads/forms.py
deleted file mode 100644
index b2bf2665a..000000000
--- a/django/notejam/pads/forms.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from django import forms
-
-from pads.models import Pad
-
-
-class PadForm(forms.ModelForm):
- class Meta:
- model = Pad
- exclude = ('user',)
diff --git a/django/notejam/pads/migrations/0001_initial.py b/django/notejam/pads/migrations/0001_initial.py
deleted file mode 100644
index 095fb8c12..000000000
--- a/django/notejam/pads/migrations/0001_initial.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
- def forwards(self, orm):
- # Adding model 'Pad'
- db.create_table('pads_pad', (
- ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
- ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
- ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
- ))
- db.send_create_signal('pads', ['Pad'])
-
-
- def backwards(self, orm):
- # Deleting model 'Pad'
- db.delete_table('pads_pad')
-
-
- models = {
- 'auth.group': {
- 'Meta': {'object_name': 'Group'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
- 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
- },
- 'auth.permission': {
- 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
- 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
- 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
- },
- 'auth.user': {
- 'Meta': {'object_name': 'User'},
- 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
- 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
- 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
- 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
- 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
- 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
- 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
- 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
- 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
- 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
- },
- 'contenttypes.contenttype': {
- 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
- 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
- },
- 'pads.pad': {
- 'Meta': {'object_name': 'Pad'},
- 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
- 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
- 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
- }
- }
-
- complete_apps = ['pads']
\ No newline at end of file
diff --git a/django/notejam/pads/migrations/__init__.py b/django/notejam/pads/migrations/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/django/notejam/pads/models.py b/django/notejam/pads/models.py
deleted file mode 100644
index 673c1e9ce..000000000
--- a/django/notejam/pads/models.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from django.contrib.auth.models import User
-from django.db import models
-
-
-class Pad(models.Model):
- name = models.CharField(max_length=100)
- user = models.ForeignKey(User)
-
- def __unicode__(self):
- return self.name
diff --git a/django/notejam/pads/templates/pads/pad_confirm_delete.html b/django/notejam/pads/templates/pads/pad_confirm_delete.html
deleted file mode 100644
index 4a2270905..000000000
--- a/django/notejam/pads/templates/pads/pad_confirm_delete.html
+++ /dev/null
@@ -1,14 +0,0 @@
-{% extends "base.html" %}
-
-{% block breadcrumbs %}Delete {{ pad.name }}{% endblock %}
-{% block content %}
- Are you sure you want to delete {{ pad.name }} and all related notes?
-
-{% endblock %}
-
-
-
diff --git a/django/notejam/pads/templates/pads/pad_create.html b/django/notejam/pads/templates/pads/pad_create.html
deleted file mode 100644
index 77506cf8c..000000000
--- a/django/notejam/pads/templates/pads/pad_create.html
+++ /dev/null
@@ -1,9 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}New pad{% endblock %}
-{% block page_title %}New pad{% endblock %}
-
-{% block content %}
- {% include "pads/pad_form.html" %}
-{% endblock %}
-
diff --git a/django/notejam/pads/templates/pads/pad_edit.html b/django/notejam/pads/templates/pads/pad_edit.html
deleted file mode 100644
index 1e7fa62cf..000000000
--- a/django/notejam/pads/templates/pads/pad_edit.html
+++ /dev/null
@@ -1,11 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}{{ pad.name }}{% endblock %}
-{% block page_title %}{{ pad.name }}{% endblock %}
-
-{% block content %}
- {% include "pads/pad_form.html" %}
- Delete pad
-{% endblock %}
-
-
diff --git a/django/notejam/pads/templates/pads/pad_form.html b/django/notejam/pads/templates/pads/pad_form.html
deleted file mode 100644
index fd678c0b9..000000000
--- a/django/notejam/pads/templates/pads/pad_form.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
diff --git a/django/notejam/pads/templates/pads/pad_note_list.html b/django/notejam/pads/templates/pads/pad_note_list.html
deleted file mode 100644
index c04602836..000000000
--- a/django/notejam/pads/templates/pads/pad_note_list.html
+++ /dev/null
@@ -1,29 +0,0 @@
-{% extends "base.html" %}
-{% load date_tags %}
-
-{% block title %}{{ pad.name }} ({{ notes.count }}){%endblock%}
-{% block page_title %}{{ pad.name }} ({{ notes.count }}){%endblock%}
-
-{% block content %}
- {% if notes %}
-
-
- | Note ↓↑ |
- Last modified ↓↑ |
-
- {% for note in notes %}
-
- | {{ note.name }} |
- {{ note.updated_at|smart_date }} |
-
- {% endfor %}
-
- {% else %}
- Create your first note in the pad.
- {% endif %}
- New note
- Pad settings
-{% endblock %}
-
-
-
diff --git a/django/notejam/pads/templatetags/__init__.py b/django/notejam/pads/templatetags/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/django/notejam/pads/templatetags/pad_tags.py b/django/notejam/pads/templatetags/pad_tags.py
deleted file mode 100644
index eb029b146..000000000
--- a/django/notejam/pads/templatetags/pad_tags.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from django import template
-
-from pads.models import Pad
-
-register = template.Library()
-
-
-def do_get_pads(parser, token):
- try:
- tag_name, as_, var_name = token.split_contents()
- except ValueError:
- raise template.TemplateSyntaxError(
- "%r tag requires a single argument - var name"
- % token.contents.split()[0]
- )
- if as_ != 'as':
- raise template.TemplateSyntaxError(
- "Format is: %r as VARNAME" % tag_name
- )
- return GetPadsNode(var_name)
-
-
-class GetPadsNode(template.Node):
- def __init__(self, var_name):
- self.var_name = var_name
-
- def render(self, context):
- context[self.var_name] = Pad.objects.filter(user=context['user'])
- return ''
-
-register.tag('get_pads', do_get_pads)
diff --git a/django/notejam/pads/tests.py b/django/notejam/pads/tests.py
deleted file mode 100644
index d76e87109..000000000
--- a/django/notejam/pads/tests.py
+++ /dev/null
@@ -1,49 +0,0 @@
-from django.core.urlresolvers import reverse
-from django.test import TestCase, Client
-
-from notejam.tests import create_user
-from pads.models import Pad
-
-
-class PadTest(TestCase):
- def setUp(self):
- user_data = {
- 'email': 'user@example.com',
- 'password': 'secure_password'
- }
- self.user = create_user(user_data)
- self.client.login(**user_data)
-
- def _create_pads(self, pads):
- return [
- (lambda pad: Pad.objects.create(name=pad, user=self.user).id)(pad)
- for pad in pads
- ]
-
- def test_create_success(self):
- self.client.post(reverse('create_pad'), {'name': 'pad'})
- self.assertEqual(1, Pad.objects.count())
-
- def test_create_fail_required_name(self):
- response = self.client.post(reverse('create_pad'), {})
- self.assertIn('name', response.context['form'].errors)
-
- def test_edit_success(self):
- id = self._create_pads(['pad'])[0]
- data = {'name': 'new name'}
- response = self.client.post(reverse('edit_pad', args=(id,)), data)
- self.assertRedirects(response, reverse('view_pad_notes', args=(id,)))
- self.assertEqual(data['name'], Pad.objects.get(id=id).name)
-
- def test_another_user_cant_edit_pad(self):
- user_data = {
- 'email': 'another_user@example.com',
- 'password': 'another_secure_password'
- }
- create_user(user_data)
-
- client = Client()
- client.login(**user_data)
- id = self._create_pads(['pad'])[0]
- response = client.post(reverse('edit_pad', args=(id,)), {})
- self.assertEqual(404, response.status_code)
diff --git a/django/notejam/pads/urls.py b/django/notejam/pads/urls.py
deleted file mode 100644
index bec671a6a..000000000
--- a/django/notejam/pads/urls.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from django.conf.urls import patterns, url
-from django.contrib.auth.decorators import login_required
-
-from pads.views import (PadCreateView, PadNotesListView, PadUpdateView,
-PadDeleteView)
-
-urlpatterns = patterns('',
- url(r'^create/$', login_required(PadCreateView.as_view()),
- name='create_pad'),
- url(r'^(?P\d+)/$', login_required(PadNotesListView.as_view()),
- name='view_pad_notes'),
- url(r'^(?P\d+)/edit/$', login_required(PadUpdateView.as_view()),
- name='edit_pad'),
- url(r'^(?P\d+)/delete/$', login_required(PadDeleteView.as_view()),
- name='delete_pad'),
-)
diff --git a/django/notejam/pads/views.py b/django/notejam/pads/views.py
deleted file mode 100644
index 8d3211462..000000000
--- a/django/notejam/pads/views.py
+++ /dev/null
@@ -1,79 +0,0 @@
-from django.contrib import messages
-from django.core.urlresolvers import reverse_lazy
-from django.shortcuts import redirect
-from django.shortcuts import get_object_or_404
-from django.views.generic.edit import CreateView, UpdateView, DeleteView
-from django.views.generic import ListView
-
-
-from pads.models import Pad
-from notes.models import Note
-from pads.forms import PadForm
-
-
-class PadCreateView(CreateView):
- model = Pad
- form_class = PadForm
- template_name_suffix = '_create'
- success_url = reverse_lazy('home')
- success_message = 'Pad is successfully created'
-
- def form_valid(self, form):
- self.object = form.save(commit=False)
- self.object.user = self.request.user
- self.object.save()
- messages.success(self.request, self.success_message)
- return redirect(self.get_success_url())
-
- def get_success_url(self):
- return reverse_lazy("view_pad_notes", kwargs={'pk': self.object.pk})
-
-
-class PadUpdateView(UpdateView):
- model = Pad
- form_class = PadForm
- template_name_suffix = '_edit'
- success_url = reverse_lazy('home')
- success_message = 'Pad is successfully updated'
-
- def form_valid(self, form):
- messages.success(self.request, self.success_message)
- return super(PadUpdateView, self).form_valid(form)
-
- def get_queryset(self):
- qs = super(PadUpdateView, self).get_queryset()
- return qs.filter(user=self.request.user)
-
- def get_success_url(self):
- return reverse_lazy("view_pad_notes", kwargs={'pk': self.object.pk})
-
-
-# Note list mixed with pad details data
-class PadNotesListView(ListView):
- model = Note
- context_object_name = 'notes'
- order_by = '-updated_at'
- template_name = 'pads/pad_note_list.html'
-
- def get_queryset(self):
- order_by = self.request.GET.get('order', self.order_by)
- return self.get_pad().note_set.all().order_by(order_by)
-
- def get_pad(self):
- return get_object_or_404(
- Pad, pk=int(self.kwargs.get('pk')), user=self.request.user
- )
-
- def get_context_data(self, **kwargs):
- context = super(PadNotesListView, self).get_context_data(**kwargs)
- context['pad'] = self.get_pad()
- return context
-
-
-class PadDeleteView(DeleteView):
- model = Pad
- success_url = reverse_lazy("home")
-
- def get_queryset(self):
- qs = super(PadDeleteView, self).get_queryset()
- return qs.filter(user=self.request.user)
diff --git a/django/notejam/static_files/css/style.css b/django/notejam/static_files/css/style.css
deleted file mode 100644
index 86cd131ff..000000000
--- a/django/notejam/static_files/css/style.css
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
-* Skeleton V1.0.3
-* Copyright 2011, Dave Gamache
-* www.getskeleton.com
-* Free to use under the MIT license.
-* http://www.opensource.org/licenses/mit-license.php
-* 7/17/2011
-*/
-
-
-/* Documentation Styles
-================================================== */
- div.container {
- padding-top: 40px; }
-
- /* Doc nav */
- nav {
- width: 160px; }
- #logo, .bold-header {
- margin-bottom: 30px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- letter-spacing: -1px;
- color: #555;
- font-weight: bold; }
- .bold-header span {
- font-weight: normal;
- font-size: 23px;
- }
- .bold-header a.header {
- text-decoration: none;
- color: inherit;
- }
- .bold-header span.jam {
- font-size: 46px;
- line-height: 50px;
- }
- nav ul {
- float: left; }
- nav ul li {
- display: block;
- margin-bottom: 10px; }
- nav ul li a,
- nav ul li a:visited,
- nav ul li a:active {
- font-size: 14px;
- color: #555;
- text-decoration: none;
- font-weight: bold; }
- nav ul li a:hover,
- nav ul li a:focus {
- color: #222; }
- header h1 {
- font-size: 52px;
- line-height: 61px;
- letter-spacing: -1px;
- font-weight: normal;
- font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; }
- hr.large {
- border: none;
- height: 8px;
- background: #ebebeb;
- margin: 50px 0; }
- div.doc-section {
- margin: 30px 0; }
-
- #whatAndWhy .row {
- padding: 30px 0 0; }
-
- #typography blockquote {
- margin-top: 20px; }
-
- .hidden-code a {
- font-size: 12px;
- color: #999; }
- .hidden-code>div {
- display: none; }
-
-
- /* Grid */
- #grid .column,
- #grid .columns {
- background: #ddd;
- height: 25px;
- line-height: 25px;
- margin-bottom: 10px;
- text-align: center;
- text-transform: uppercase;
- color: #555;
- font-size: 12px;
- font-weight: bold;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border-radius: 2px; }
- #grid .column:hover,
- #grid .columns:hover {
- background: #bbb;
- color: #333; }
- #grid .example-grid { overflow: hidden; }
-
- .post-button-note,
- .post-button-note a {
- font-size: 11px;
- color: #999; }
-
- #examples .four.columns a {
- text-decoration: none;
- }
- #examples .four.columns a:hover {
- text-decoration: underline;
- }
-
-
- .resize {
- position: fixed;
- bottom: 0;
- right: 0;
- height: 80px;
- width: 80px;
- background: url(images/resize.png); }
-
-
- img {
- max-width: 100%;
- height: auto; }
-
- .gist-meta { display: none !important;}
-
- ul ul ul li { margin-bottom: 3px; }
-
- .twitter-share-button { margin-bottom: -18px; }
-
- /* Table stylesheets */
- table {
- width: 100%;
- border-collapse: collapse;
- }
-
- table th, table td {
- padding: 10px 10px 9px;
- font-size: 13px;
- line-height: 18px;
- text-align: left;
- }
-
- table td {
- vertical-align: top;
- border-top: solid 1px #ddd;
- }
-
- table th {
- padding-top: 9px;
- font-weight: bold;
- vertical-align: middle;
- }
-
- table.condensed th, table.condensed td {
- padding: 5px 5px 4px;
- }
-
- table.bordered {
- border-collapse: separate;
- border: solid 1px #ddd;
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- border-radius: 2px;
- }
-
- table.bordered th + th,
- table.bordered th + td,
- table.bordered td + td {
- border-left: solid 1px #ddd;
- }
-
- .zebra-striped tbody tr:nth-child(odd) td,
- .zebra-striped tbody tr:nth-child(odd) th {
- background: #f5f5f5;
- }
-
-.carbonad,
-.carbonad-image,
-.carbonad-text,
-.carbonad-tag {
- background: none !important;
- border: none !important;
- margin-left: 0 !important;
-}
-.carbonad-tag {
- margin-top: 6px !important;
- padding-top: 0 !important;
-}
-.carbonad-text {
- height: auto !important;
-}
-.carbonad-image {
- margin-top: 0 !important;
-}
-
-.hidden-text {
- font-size: 12px;
- color: #999;
-}
-
-td.date, th.date {
- text-align: right;
-}
-
-td.date {
- font-style: italic;
-}
-
-form.note input[type="text"], form.note textarea {
- width: 100%;
-}
-
-form hr {
- width: 218px;
- margin: 10px 0px;
-}
-
-form.note textarea {
- height: 250px;
-}
-
-div.content-area {
- min-height: 600px;
-}
-
-hr.footer {
- margin-bottom: 10px;
-}
-
-div.footer {
- margin-bottom: 10px;
- text-align: center;
- font-size: 12px;
-}
-
-form.sign-in {
- margin: 50px 0 0 0;
-}
-
-.sort_arrow {
- text-decoration: none;
-}
-
-.sort_arrow:hover {
- text-decoration: none;
- color: red;
-}
-
-div.sign-in-out-block {
- position: absolute;
- right: 14px;
- top: 8px;
- font-size: 12px;
-}
-
-div.sign-in-out-block a {
- /*text-decoration: none;*/
-}
-
-a.small-red {
- color: red;
- font-size: 12px;
-}
-
-table.notes {
- margin: 0 0 20px 0;
-}
-
-table.notes th.note {
- width: 72%;
-}
-
-table.notes td.pad {
- color: grey;
-}
-
-table.notes td.pad a {
- color: grey;
- text-decoration: underline;
- font-style: normal;
-}
-
-
-table.notes td.pad a:hover {
- color: black;
-}
-
-p.empty {
- color: grey;
- font-style: italic;
-}
-
-a.delete-note {
- float: right;
- font-size: 12px;
- color: red;
-}
-
-.red, input.red {
- color: red !important;
-}
-
-ul.errorlist, ul.errors {
- margin: -18px 0 0 0;
-}
-
-ul.errorlist li, ul.errors li {
- color: red;
-}
-
-.alert-area {
- text-align: center;
-}
-
-.alert {
- padding: 5px 8px;
- margin: 0 0 12px 0;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border-radius: 2px;
-}
-
-.alert-success {
- color: #468847;
- background-color: #dff0d8;
- border: 1px solid #d6e9c6;
-}
-
-.alert-error {
- color: #b94a48;
- background-color: #f2dede;
- border: 1px solid #eed3d7;
-}
-
- /* Mobile */
- @media only screen and (max-width: 767px) {
- header h1 { font-size: 34px; line-height: 37px; }
- nav { position: relative; }
- nav ul,
- .carbonad {
- display: none;
- }
- #logo { text-align: left; }
- #examples .four.columns {
- padding-top: 30px;
- }
- }
-
- /* Mobile Landscape */
- @media only screen and (min-width: 480px) and (max-width: 767px) {
- nav ul {
- display: none;
- }
- }
-
- /* Non 960 */
- @media only screen and (max-width: 959px) {
- #logo {
- font-size: 21px;
- margin-bottom: 15px; }
- nav .button {
- padding: 9px 20px 11px; }
- }
-
- /* iPad Portrait/Browser */
- @media only screen and (min-width: 768px) and (max-width: 959px) {
- nav {
- width: 124px; }
- }
-
- /* Mobile/Browser */
- @media only screen and (max-width: 767px) {}
-
- /* Mobile Landscape/Browser */
- @media only screen and (min-width: 480px) and (max-width: 767px) {}
-
- /* Anything smaller than standard 960 */
- @media only screen and (max-width: 959px) {}
-
-
- /* iPad Portrait Only */
- @media only screen and (min-width: 768px) and (max-width: 959px) and (max-device-width: 1000px) {}
-
- /* Mobile Only */
- @media only screen and (max-width: 767px) and (max-device-width: 1000px) {}
-
- /* Mobile Landscape Only */
- @media only screen and (min-width: 480px) and (max-width: 767px) and (max-device-width: 1000px) {}
-
- /* Anything smaller than standard 960 on a device */
- @media only screen and (max-width: 959px) and (max-device-width: 1000px) {
- .resize { display: none; }
- }
diff --git a/django/notejam/templates/404.html b/django/notejam/templates/404.html
deleted file mode 100644
index e69de29bb..000000000
diff --git a/django/notejam/templates/base.html b/django/notejam/templates/base.html
deleted file mode 100644
index 5b84e65d2..000000000
--- a/django/notejam/templates/base.html
+++ /dev/null
@@ -1,92 +0,0 @@
-{% load pad_tags %}
-
-
-
-
-
-
-
-
-
- {% block title %}Notejam{% endblock %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {% block extrahead %}{% endblock %}
-
-
-
-
-
-
-
- {% block pads %}
-
-
My pads
-
-
-
-
- {% endblock %}
-
- {% if messages %}
-
- {% for message in messages %}
-
{{ message }}
- {% endfor %}
-
- {% endif %}
- {% block content %}
- {% endblock %}
-
-
-
-
-
-
-
diff --git a/django/notejam/templates/user.html b/django/notejam/templates/user.html
deleted file mode 100644
index 39a93a045..000000000
--- a/django/notejam/templates/user.html
+++ /dev/null
@@ -1,5 +0,0 @@
-{% extends "base.html" %}
-
-{% block pads %}{% endblock %}
-
-{% block content_class %}sixteen columns content-area{% endblock %}
diff --git a/django/notejam/users/__init__.py b/django/notejam/users/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/django/notejam/users/auth_backends.py b/django/notejam/users/auth_backends.py
deleted file mode 100644
index ada5ecd92..000000000
--- a/django/notejam/users/auth_backends.py
+++ /dev/null
@@ -1,18 +0,0 @@
-from django.contrib.auth.models import User
-
-
-class EmailModelBackend(object):
- ''' Custom backend to be able to use email for authentication '''
- def authenticate(self, email=None, password=None):
- try:
- user = User.objects.get(email=email)
- if user.check_password(password):
- return user
- except User.DoesNotExist:
- return None
-
- def get_user(self, user_id):
- try:
- return User.objects.get(pk=user_id)
- except User.DoesNotExist:
- return None
diff --git a/django/notejam/users/forms.py b/django/notejam/users/forms.py
deleted file mode 100644
index 0079708fb..000000000
--- a/django/notejam/users/forms.py
+++ /dev/null
@@ -1,56 +0,0 @@
-from django import forms
-from django.contrib.auth.models import User
-
-
-class SignupForm(forms.ModelForm):
- email = forms.EmailField()
- password = forms.CharField(widget=forms.PasswordInput())
- repeat_password = forms.CharField(widget=forms.PasswordInput())
-
- class Meta:
- model = User
- fields = ('email',)
-
- def save(self, force_insert=False, force_update=False, commit=True):
- user = super(SignupForm, self).save(commit=False)
- # username hack (we don't need username, but django requires it ?)
- user.username = user.email
-
- user.set_password(self.cleaned_data['password'])
- if commit:
- user.save()
- return user
-
- def clean_email(self):
- email = self.cleaned_data.get('email')
-
- if User.objects.filter(email=email).count():
- raise forms.ValidationError(
- 'User with this email is already signed up'
- )
-
- return email
-
- def clean_repeat_password(self):
- password = self.cleaned_data.get('password')
- repeat_password = self.cleaned_data.get('repeat_password')
-
- if password != repeat_password:
- raise forms.ValidationError("Your passwords do not match")
-
-
-class SigninForm(forms.Form):
- email = forms.EmailField()
- password = forms.CharField(widget=forms.PasswordInput())
-
-
-class ForgotPasswordForm(forms.Form):
- email = forms.EmailField()
-
- def clean_email(self):
- email = self.cleaned_data.get('email')
- try:
- User.objects.get(email=email)
- return email
- except User.DoesNotExist:
- raise forms.ValidationError("No user with given email")
diff --git a/django/notejam/users/models.py b/django/notejam/users/models.py
deleted file mode 100644
index 71a836239..000000000
--- a/django/notejam/users/models.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from django.db import models
-
-# Create your models here.
diff --git a/django/notejam/users/templates/forgot_password.html b/django/notejam/users/templates/forgot_password.html
deleted file mode 100644
index 8851e0f07..000000000
--- a/django/notejam/users/templates/forgot_password.html
+++ /dev/null
@@ -1,15 +0,0 @@
-{% extends "user.html" %}
-
-{% block title %}Forgot password?{% endblock %}
-{% block page_title %}Forgot password?{% endblock %}
-
-{% block content %}
-
-{% endblock %}
-
diff --git a/django/notejam/users/templates/settings.html b/django/notejam/users/templates/settings.html
deleted file mode 100644
index 699e780ee..000000000
--- a/django/notejam/users/templates/settings.html
+++ /dev/null
@@ -1,20 +0,0 @@
-{% extends "user.html" %}
-
-{% block title %}Account Settings{% endblock %}
-{% block page_title %}Account Settings{% endblock %}
-
-{% block content %}
-
-{% endblock %}
diff --git a/django/notejam/users/templates/signin.html b/django/notejam/users/templates/signin.html
deleted file mode 100644
index faee87030..000000000
--- a/django/notejam/users/templates/signin.html
+++ /dev/null
@@ -1,19 +0,0 @@
-{% extends "user.html" %}
-
-{% block title %}Sign In{% endblock %}
-{% block page_title %}Sign In{% endblock %}
-
-{% block content %}
-
-{% endblock %}
diff --git a/django/notejam/users/templates/signup.html b/django/notejam/users/templates/signup.html
deleted file mode 100644
index ba717ced7..000000000
--- a/django/notejam/users/templates/signup.html
+++ /dev/null
@@ -1,21 +0,0 @@
-{% extends "user.html" %}
-
-{% block title %}Sign Up{% endblock %}
-{% block page_title %}Sign Up{% endblock %}
-
-{% block content %}
-
-{% endblock %}
-
diff --git a/django/notejam/users/tests.py b/django/notejam/users/tests.py
deleted file mode 100644
index 5923a6a83..000000000
--- a/django/notejam/users/tests.py
+++ /dev/null
@@ -1,83 +0,0 @@
-from django.contrib.auth.models import User
-from django.core.urlresolvers import reverse
-from django.test import TestCase
-
-
-class SignUpTest(TestCase):
- def _get_user_data(self, **kwargs):
- user_data = {
- 'email': 'email@example.com',
- 'password': 'secure_password',
- 'repeat_password': 'secure_password'
- }
- user_data.update(**kwargs)
- return user_data
-
- def test_signup_success(self):
- response = self.client.post(
- reverse('signup'), self._get_user_data())
- self.assertRedirects(response, reverse('signin'))
- self.assertEqual(1, User.objects.all().count())
-
- def test_signup_fail_required_fields(self):
- response = self.client.post(reverse('signup'), {})
- self.assertEqual(
- response.context['form'].errors.keys(),
- self._get_user_data().keys()
- )
-
- def test_signup_fail_invalid_email(self):
- invalid_data = self._get_user_data(email='invalid email')
- response = self.client.post(reverse('signup'), invalid_data)
- self.assertIn('email', response.context['form'].errors)
-
- def test_signup_fail_passwords_dont_match(self):
- invalid_data = self._get_user_data(password='another pass')
- response = self.client.post(reverse('signup'), invalid_data)
- self.assertIn('repeat_password', response.context['form'].errors)
-
- def test_signup_fail_email_exists(self):
- data = self._get_user_data()
- User.objects.create(
- email=data['email'],
- username=data['email'],
- password=data['password']
- )
-
- response = self.client.post(reverse('signup'), data)
- self.assertIn('email', response.context['form'].errors)
-
-
-class SignInTest(TestCase):
- def _get_user_data(self, **kwargs):
- user_data = {
- 'email': 'email@example.com',
- 'password': 'secure_password'
- }
- user_data.update(**kwargs)
- return user_data
-
- def test_signin_success(self):
- data = self._get_user_data()
- user = User.objects.create(email=data['email'], username=data['email'])
- user.set_password(data['password'])
- user.save()
-
- response = self.client.post(reverse('signin'), data)
- self.assertRedirects(response, reverse('home'))
-
- def test_signin_fail(self):
- response = self.client.post(reverse('signin'), self._get_user_data())
- self.assertContains(response, 'Wrong email or password')
-
- def test_signin_fail_required_fields(self):
- response = self.client.post(reverse('signin'), {})
- self.assertEqual(
- response.context['form'].errors.keys(),
- self._get_user_data().keys()
- )
-
- def test_signin_fail_invalid_email(self):
- invalid_data = self._get_user_data(email='invalid email')
- response = self.client.post(reverse('signin'), invalid_data)
- self.assertIn('email', response.context['form'].errors)
diff --git a/django/notejam/users/views.py b/django/notejam/users/views.py
deleted file mode 100644
index 51ac56d38..000000000
--- a/django/notejam/users/views.py
+++ /dev/null
@@ -1,106 +0,0 @@
-import hashlib
-from datetime import datetime
-
-from django.conf import settings
-from django.contrib import messages
-from django.contrib.auth import authenticate, login
-from django.contrib.auth.forms import PasswordChangeForm
-from django.contrib.auth.models import User
-from django.core.mail import send_mail
-from django.core.urlresolvers import reverse_lazy
-from django.shortcuts import redirect
-from django.views.generic.edit import FormView
-from django.views.generic.edit import CreateView
-
-from users.forms import SignupForm, SigninForm, ForgotPasswordForm
-
-
-class SignupView(CreateView):
- model = User
- form_class = SignupForm
- template_name = "signup.html"
- success_url = reverse_lazy('signin')
- success_message = "Account is created. Now you can sign in."
-
- def form_valid(self, form):
- messages.success(self.request, self.success_message)
- return super(SignupView, self).form_valid(form)
-
-
-class SigninView(FormView):
- template_name = "signin.html"
- form_class = SigninForm
- success_url = reverse_lazy('home')
- error_message = "Wrong email or password"
-
- def post(self, request, *args, **kwargs):
- form_class = self.get_form_class()
- form = self.get_form(form_class)
- if form.is_valid():
- user = authenticate(
- email=form.cleaned_data['email'],
- password=form.cleaned_data['password']
- )
- if user is not None:
- login(request, user)
- return redirect(reverse_lazy('home'))
- else:
- messages.error(request, self.error_message)
-
- return self.render_to_response(
- self.get_context_data(form=form)
- )
- else:
- return self.form_invalid(form, **kwargs)
-
-
-class ForgotPasswordView(FormView):
- form_class = ForgotPasswordForm
- template_name = 'forgot_password.html'
- success_url = reverse_lazy('signin')
- success_message = 'New password is sent in your email inbox'
-
- def form_valid(self, form):
- m = hashlib.md5()
- m.update(
- "{email}{secret}{date}".format(
- email=form.cleaned_data['email'],
- secret=settings.SECRET_KEY,
- date=str(datetime.today())
- )
- )
- new_password = m.hexdigest()[:8]
-
- user = User.objects.get(email=form.cleaned_data['email'])
- user.set_password(new_password)
- user.save()
-
- send_mail(
- 'Notejam password reset',
- 'Hi, {}. Your new password is {}.'.format(
- form.cleaned_data['email'],
- new_password
- ),
- 'from@notejamapp.com',
- [form.cleaned_data['email']],
- fail_silently=False
- )
- messages.success(self.request, self.success_message)
-
- return super(ForgotPasswordView, self).form_valid(form)
-
-
-class AccountSettingsView(FormView):
- form_class = PasswordChangeForm
- template_name = 'settings.html'
- success_url = reverse_lazy('home')
- success_message = 'Password is successfully changed'
-
- def get_form_kwargs(self):
- kwargs = super(AccountSettingsView, self).get_form_kwargs()
- kwargs['user'] = self.request.user
- return kwargs
-
- def form_valid(self, form):
- messages.success(self.request, self.success_message)
- return super(AccountSettingsView, self).form_valid(form)
diff --git a/django/requirements.txt b/django/requirements.txt
deleted file mode 100644
index 4c05c817f..000000000
--- a/django/requirements.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Django==1.6.5
-South==1.0
diff --git a/express/README.rst b/express/README.rst
deleted file mode 100644
index a851fa182..000000000
--- a/express/README.rst
+++ /dev/null
@@ -1,83 +0,0 @@
-****************
-Notejam: Express
-****************
-
-Notejam application implemented using `Express.js `_ microframework.
-
-Express version: 4.2
-
-Middlewares/extentions used:
-
-* `Passport.js `_ for authentication
-* `Node ORM 2 `_ for database
-* `Mocha `_ and `Superagent `_ for testing
-* ... and `others `_
-
-==========================
-Installation and launching
-==========================
-
--------
-Cloning
--------
-
-Clone the repo:
-
-.. code-block:: bash
-
- $ git clone git@github.com:komarserjio/notejam.git YOUR_PROJECT_DIR/
-
--------------------
-Install environment
--------------------
-Use `npm `_ to manage dependencies.
-
-Install dependencies
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/express/notejam/
- $ npm install
-
-Create database schema
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/express/notejam/
- $ node db.js
-
-------
-Launch
-------
-
-Start built-in web server:
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/express/notejam/
- $ DEBUG=* ./bin/www
-
-Go to http://127.0.0.1:3000/ in your browser
-
-------------------
-Running unit tests
-------------------
-
-Run unit tests:
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/express/notejam/
- $ ./node_modules/mocha/bin/mocha tests
-
-============
-Contribution
-============
-
-Please send your pull requests in the ``master`` branch.
-
-Always prepend your commits with a framework name:
-
-.. code-block:: bash
-
- Express: Implemented sign in functionality
diff --git a/express/notejam/app.js b/express/notejam/app.js
deleted file mode 100644
index f78635800..000000000
--- a/express/notejam/app.js
+++ /dev/null
@@ -1,110 +0,0 @@
-var express = require('express');
-var session = require('express-session');
-var path = require('path');
-var favicon = require('static-favicon');
-var logger = require('morgan');
-var cookieParser = require('cookie-parser');
-var flash = require('connect-flash');
-var bodyParser = require('body-parser');
-var orm = require('orm');
-var expressValidator = require('express-validator');
-var passport = require('passport');
-var LocalStrategy = require('passport-local').Strategy;
-
-var users = require('./routes/users');
-var pads = require('./routes/pads');
-var notes = require('./routes/notes');
-var settings = require('./settings')
-
-var app = express();
-
-
-// view engine setup
-app.set('views', path.join(__dirname, 'views'));
-app.set('view engine', 'jade');
-
-app.use(favicon());
-app.use(logger('dev'));
-app.use(bodyParser.json());
-app.use(bodyParser.urlencoded());
-app.use(expressValidator());
-app.use(cookieParser());
-app.use(session({cookie: { maxAge: 60000 }, secret: 'secret'}));
-app.use(flash());
-app.use(passport.initialize());
-app.use(passport.session());
-app.use(express.static(path.join(__dirname, 'public')));
-
-// DB configuration
-var sqlite3 = require('sqlite3').verbose();
-var db = new sqlite3.Database(settings.db);
-
-orm.settings.set("instance.returnAllErrors", true);
-app.use(orm.express(settings.dsn, {
- define: function (db, models, next) {
- db.load("./models", function (err) {
- models.User = db.models.users;
- models.Pad = db.models.pads;
- models.Note = db.models.notes;
- next();
- });
- }
-}));
-
-// Flash Messages configuration
-app.use(function(req, res, next){
- res.locals.flash_messages = {
- 'success': req.flash('success'),
- 'error': req.flash('error')
- }
- next();
-});
-
-// Inject request object and user pads in view scope
-app.use(function(req, res, next){
- res.locals.req = req;
-
- if (req.isAuthenticated()) {
- req.user.getPads(function(i, pads) {
- res.locals.pads = pads;
- next();
- });
- } else {
- next();
- }
-});
-
-app.use('/', users);
-app.use('/', pads);
-app.use('/', notes);
-
-/// catch 404 and forward to error handler
-app.use(function(req, res, next) {
- var err = new Error('Not Found');
- err.status = 404;
- next(err);
-});
-
-// development error handler
-// will print stacktrace
-if (app.get('env') === 'development') {
- app.use(function(err, req, res, next) {
- res.status(err.status || 500);
- res.render('error', {
- message: err.message,
- error: err
- });
- });
-}
-
-// production error handler
-// no stacktraces leaked to user
-app.use(function(err, req, res, next) {
- res.status(err.status || 500);
- res.render('error', {
- message: err.message,
- error: {}
- });
-});
-
-module.exports = app;
diff --git a/express/notejam/bin/www b/express/notejam/bin/www
deleted file mode 100755
index 5e193192b..000000000
--- a/express/notejam/bin/www
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/env node
-var debug = require('debug')('notejam');
-var app = require('../app');
-
-app.set('port', process.env.PORT || 3000);
-
-var server = app.listen(app.get('port'), function() {
- debug('Express server listening on port ' + server.address().port);
-});
diff --git a/express/notejam/db.js b/express/notejam/db.js
deleted file mode 100644
index d0d4a0dec..000000000
--- a/express/notejam/db.js
+++ /dev/null
@@ -1,105 +0,0 @@
-var sqlite3 = require('sqlite3').verbose();
-var async = require('async');
-
-var settings = require('./settings');
-var db = new sqlite3.Database(settings.db);
-
-var functions = {
- createTables: function(next) {
- async.series({
- createUsers: function(callback) {
- db.run("CREATE TABLE IF NOT EXISTS users (" +
- "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +
- "email VARCHAR(75) NOT NULL," +
- "password VARCHAR(128) NOT NULL);", [],
- function() { callback(null); });
- },
- createPads: function(callback) {
- db.run("CREATE TABLE IF NOT EXISTS pads (" +
- "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +
- "name VARCHAR(100) NOT NULL," +
- "user_id INTEGER NOT NULL REFERENCES users(id));", [],
- function() { callback(null); })
- },
- createNotes: function(callback) {
- db.run("CREATE TABLE IF NOT EXISTS notes (" +
- "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +
- "pad_id INTEGER REFERENCES pads(id)," +
- "user_id INTEGER NOT NULL REFERENCES users(id)," +
- "name VARCHAR(100) NOT NULL," +
- "text text NOT NULL," +
- "created_at default current_timestamp," +
- "updated_at default current_timestamp);", [],
- function() { callback(null); });
- }
- },
- function(err, results) {
- next();
- });
- },
-
- applyFixtures: function(next) {
- this.truncateTables(function() {
- async.series([
- function(callback) {
- db.run("INSERT INTO users VALUES (1, 'user1@example.com', " +
- "'$2a$10$mhkqpUvPPs.zoRSTiGAEKODOJMljkOY96zludIIw.Pop1UvQCTx8u')", [],
- function() { callback(null) });
- },
- function(callback) {
- db.run("INSERT INTO users VALUES (2, 'user2@example.com', " +
- "'$2a$10$mhkqpUvPPs.zoRSTiGAEKODOJMljkOY96zludIIw.Pop1UvQCTx8u')", [],
- function() { callback(null) });
-
- },
- function(callback) {
- db.run("INSERT INTO pads VALUES (1, 'Pad 1', 1)", [],
- function() { callback(null) });
- },
- function(callback) {
- db.run("INSERT INTO pads VALUES (2, 'Pad 2', 1)", [],
- function() { callback(null) });
- },
- function(callback) {
- db.run("INSERT INTO notes VALUES (1, 1, 1, 'Note 1', 'Text', 1, 1)", [],
- function() { callback(null) });
- },
- function(callback) {
- db.run("INSERT INTO notes VALUES (2, 1, 1, 'Note 2', 'Text', 1, 1)", [],
- function() { callback(null) });
- }
- ], function(err, results) {
- next();
- })
- });
- },
-
- truncateTables: function(next) {
- async.series([
- function(callback) {
- db.run("DELETE FROM users;", [],
- function() { callback(null) });
- },
- function(callback) {
- db.run("DELETE FROM notes;", [],
- function() { callback(null) });
-
- },
- function(callback) {
- db.run("DELETE FROM pads;", [],
- function(result) { callback(null); });
- }
- ], function(err, results) {
- next();
- })
- }
-}
-
-
-if (require.main === module) {
- functions.createTables(function() {
- console.log("DB successfully initialized");
- });
-}
-
-module.exports = functions;
diff --git a/express/notejam/helpers.js b/express/notejam/helpers.js
deleted file mode 100644
index 21fe0a575..000000000
--- a/express/notejam/helpers.js
+++ /dev/null
@@ -1,22 +0,0 @@
-module.exports = {
- formatFormErrors: function(errors) {
- formatted = {};
- errors.forEach(function(e) {
- formatted[e.param] = e.msg;
- });
- return formatted;
- },
-
- formatModelErrors: function(errors) {
- formatted = {};
- errors.forEach(function(e) {
- formatted[e.property] = e.msg;
- });
- return formatted;
- },
-
- loginRequired: function (req, res, next) {
- if (req.isAuthenticated()) { return next(); }
- res.redirect('/signin')
- }
-}
diff --git a/express/notejam/models.js b/express/notejam/models.js
deleted file mode 100644
index aa5b3ab11..000000000
--- a/express/notejam/models.js
+++ /dev/null
@@ -1,49 +0,0 @@
-var orm = require('orm');
-var moment = require('moment');
-
-module.exports = function (db, cb) {
- var User = db.define("users", {
- id : { type: "serial", key: true },
- email : { type: "text" },
- password: { type: "text" }
- }, {
- validations: {
- email: [orm.enforce.unique("User with given email already exists!"),
- orm.enforce.patterns.email("Invalid email")],
- password: orm.enforce.notEmptyString("Password is required"),
- // @TODO add "match passwords" validation
- }
- });
-
- var Pad = db.define("pads", {
- id : { type: "serial", key: true },
- name : { type: "text" },
- }, {
- validations: {
- name: orm.enforce.notEmptyString("Name is required"),
- }
- });
- Pad.hasOne("user", User, { required: true, reverse: 'pads' });
-
- var Note = db.define("notes", {
- id : { type: "serial", key: true },
- name : { type: "text" },
- text : { type: "text" },
- created_at : { type: "date", time: true },
- updated_at : { type: "date", time: true }
- }, {
- methods: {
- updatedAt: function () {
- return moment(this.updated_at).fromNow();
- }
- },
- validations: {
- name: orm.enforce.notEmptyString("Name is required"),
- text: orm.enforce.notEmptyString("Text is required"),
- }
- });
- Note.hasOne("user", User, { required: true, reverse: 'notes' });
- Note.hasOne("pad", Pad, { required: false, reverse: 'notes' });
-
- return cb();
-};
diff --git a/express/notejam/package.json b/express/notejam/package.json
deleted file mode 100644
index cd4cb3a00..000000000
--- a/express/notejam/package.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "name": "notejam",
- "version": "0.0.1",
- "private": true,
- "scripts": {
- "start": "node ./bin/www"
- },
- "dependencies": {
- "express": "~4.2.0",
- "sqlite3": "*",
- "static-favicon": "~1.0.0",
- "morgan": "~1.0.0",
- "cookie-parser": "~1.0.1",
- "body-parser": "~1.0.0",
- "debug": "~0.7.4",
- "jade": "~1.3.0",
- "orm": "~2.1.19",
- "connect-flash": "~0.1.1",
- "express-session": "~1.0.2",
- "express-validator": "~2.6.0",
- "passport": "0.2.1",
- "passport-local": "1.0.0",
- "mocha": "1.*.*",
- "supertest": "0.*.*",
- "superagent": "*",
- "should": "*",
- "should-http": "*",
- "async": "*",
- "moment": "*",
- "bcrypt": "*",
- "nodemailer": "*",
- "nodemailer-stub-transport": "*"
- }
-}
diff --git a/express/notejam/public/stylesheets/style.css b/express/notejam/public/stylesheets/style.css
deleted file mode 100644
index f2cf7f5de..000000000
--- a/express/notejam/public/stylesheets/style.css
+++ /dev/null
@@ -1,397 +0,0 @@
-/*
-* Skeleton V1.0.3
-* Copyright 2011, Dave Gamache
-* www.getskeleton.com
-* Free to use under the MIT license.
-* http://www.opensource.org/licenses/mit-license.php
-* 7/17/2011
-*/
-
-
-/* Documentation Styles
-================================================== */
- div.container {
- padding-top: 40px; }
-
- /* Doc nav */
- nav {
- width: 160px; }
- #logo, .bold-header {
- margin-bottom: 30px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- letter-spacing: -1px;
- color: #555;
- font-weight: bold; }
- .bold-header span {
- font-weight: normal;
- font-size: 23px;
- }
- .bold-header a.header {
- text-decoration: none;
- color: inherit;
- }
- .bold-header span.jam {
- font-size: 46px;
- line-height: 50px;
- }
- nav ul {
- float: left; }
- nav ul li {
- display: block;
- margin-bottom: 10px; }
- nav ul li a,
- nav ul li a:visited,
- nav ul li a:active {
- font-size: 14px;
- color: #555;
- text-decoration: none;
- font-weight: bold; }
- nav ul li a:hover,
- nav ul li a:focus {
- color: #222; }
- header h1 {
- font-size: 52px;
- line-height: 61px;
- letter-spacing: -1px;
- font-weight: normal;
- font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; }
- hr.large {
- border: none;
- height: 8px;
- background: #ebebeb;
- margin: 50px 0; }
- div.doc-section {
- margin: 30px 0; }
-
- #whatAndWhy .row {
- padding: 30px 0 0; }
-
- #typography blockquote {
- margin-top: 20px; }
-
- .hidden-code a {
- font-size: 12px;
- color: #999; }
- .hidden-code>div {
- display: none; }
-
-
- /* Grid */
- #grid .column,
- #grid .columns {
- background: #ddd;
- height: 25px;
- line-height: 25px;
- margin-bottom: 10px;
- text-align: center;
- text-transform: uppercase;
- color: #555;
- font-size: 12px;
- font-weight: bold;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border-radius: 2px; }
- #grid .column:hover,
- #grid .columns:hover {
- background: #bbb;
- color: #333; }
- #grid .example-grid { overflow: hidden; }
-
- .post-button-note,
- .post-button-note a {
- font-size: 11px;
- color: #999; }
-
- #examples .four.columns a {
- text-decoration: none;
- }
- #examples .four.columns a:hover {
- text-decoration: underline;
- }
-
-
- .resize {
- position: fixed;
- bottom: 0;
- right: 0;
- height: 80px;
- width: 80px;
- background: url(images/resize.png); }
-
-
- img {
- max-width: 100%;
- height: auto; }
-
- .gist-meta { display: none !important;}
-
- ul ul ul li { margin-bottom: 3px; }
-
- .twitter-share-button { margin-bottom: -18px; }
-
- /* Table stylesheets */
- table {
- width: 100%;
- border-collapse: collapse;
- }
-
- table th, table td {
- padding: 10px 10px 9px;
- font-size: 13px;
- line-height: 18px;
- text-align: left;
- }
-
- table td {
- vertical-align: top;
- border-top: solid 1px #ddd;
- }
-
- table th {
- padding-top: 9px;
- font-weight: bold;
- vertical-align: middle;
- }
-
- table.condensed th, table.condensed td {
- padding: 5px 5px 4px;
- }
-
- table.bordered {
- border-collapse: separate;
- border: solid 1px #ddd;
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- border-radius: 2px;
- }
-
- table.bordered th + th,
- table.bordered th + td,
- table.bordered td + td {
- border-left: solid 1px #ddd;
- }
-
- .zebra-striped tbody tr:nth-child(odd) td,
- .zebra-striped tbody tr:nth-child(odd) th {
- background: #f5f5f5;
- }
-
-.carbonad,
-.carbonad-image,
-.carbonad-text,
-.carbonad-tag {
- background: none !important;
- border: none !important;
- margin-left: 0 !important;
-}
-.carbonad-tag {
- margin-top: 6px !important;
- padding-top: 0 !important;
-}
-.carbonad-text {
- height: auto !important;
-}
-.carbonad-image {
- margin-top: 0 !important;
-}
-
-.hidden-text {
- font-size: 12px;
- color: #999;
-}
-
-td.date, th.date {
- text-align: right;
-}
-
-td.date {
- font-style: italic;
-}
-
-form.note input[type="text"], form.note textarea {
- width: 100%;
-}
-
-form hr {
- width: 218px;
- margin: 10px 0px;
-}
-
-form.note textarea {
- height: 250px;
-}
-
-div.content-area {
- min-height: 600px;
-}
-
-hr.footer {
- margin-bottom: 10px;
-}
-
-div.footer {
- margin-bottom: 10px;
- text-align: center;
- font-size: 12px;
-}
-
-form.sign-in {
- margin: 50px 0 0 0;
-}
-
-.sort_arrow {
- text-decoration: none;
-}
-
-.sort_arrow:hover {
- text-decoration: none;
- color: red;
-}
-
-div.sign-in-out-block {
- position: absolute;
- right: 14px;
- top: 8px;
- font-size: 12px;
-}
-
-div.sign-in-out-block a {
- /*text-decoration: none;*/
-}
-
-a.small-red {
- color: red;
- font-size: 12px;
-}
-
-table.notes {
- margin: 0 0 20px 0;
-}
-
-table.notes th.note {
- width: 72%;
-}
-
-table.notes td.pad {
- color: grey;
-}
-
-table.notes td.pad a {
- color: grey;
- text-decoration: underline;
- font-style: normal;
-}
-
-
-table.notes td.pad a:hover {
- color: black;
-}
-
-p.empty {
- color: grey;
- font-style: italic;
-}
-
-a.delete-note {
- float: right;
- font-size: 12px;
- color: red;
-}
-
-.red, input.red {
- color: red !important;
-}
-
-ul.errorlist, ul.errors {
- margin: -18px 0 0 0;
-}
-
-ul.errorlist li, ul.errors li {
- color: red;
-}
-
-.alert-area {
- text-align: center;
-}
-
-.alert {
- padding: 5px 8px;
- margin: 0 0 12px 0;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border-radius: 2px;
-}
-
-.alert-success {
- color: #468847;
- background-color: #dff0d8;
- border: 1px solid #d6e9c6;
-}
-
-.alert-error {
- color: #b94a48;
- background-color: #f2dede;
- border: 1px solid #eed3d7;
-}
-
- /* Mobile */
- @media only screen and (max-width: 767px) {
- header h1 { font-size: 34px; line-height: 37px; }
- nav { position: relative; }
- nav ul,
- .carbonad {
- display: none;
- }
- #logo { text-align: left; }
- #examples .four.columns {
- padding-top: 30px;
- }
- }
-
- /* Mobile Landscape */
- @media only screen and (min-width: 480px) and (max-width: 767px) {
- nav ul {
- display: none;
- }
- }
-
- /* Non 960 */
- @media only screen and (max-width: 959px) {
- #logo {
- font-size: 21px;
- margin-bottom: 15px; }
- nav .button {
- padding: 9px 20px 11px; }
- }
-
- /* iPad Portrait/Browser */
- @media only screen and (min-width: 768px) and (max-width: 959px) {
- nav {
- width: 124px; }
- }
-
- /* Mobile/Browser */
- @media only screen and (max-width: 767px) {}
-
- /* Mobile Landscape/Browser */
- @media only screen and (min-width: 480px) and (max-width: 767px) {}
-
- /* Anything smaller than standard 960 */
- @media only screen and (max-width: 959px) {}
-
-
- /* iPad Portrait Only */
- @media only screen and (min-width: 768px) and (max-width: 959px) and (max-device-width: 1000px) {}
-
- /* Mobile Only */
- @media only screen and (max-width: 767px) and (max-device-width: 1000px) {}
-
- /* Mobile Landscape Only */
- @media only screen and (min-width: 480px) and (max-width: 767px) and (max-device-width: 1000px) {}
-
- /* Anything smaller than standard 960 on a device */
- @media only screen and (max-width: 959px) and (max-device-width: 1000px) {
- .resize { display: none; }
- }
-
-
diff --git a/express/notejam/routes/notes.js b/express/notejam/routes/notes.js
deleted file mode 100644
index 339e21228..000000000
--- a/express/notejam/routes/notes.js
+++ /dev/null
@@ -1,108 +0,0 @@
-var express = require('express');
-var router = express.Router();
-var orm = require('orm');
-var async = require('async');
-
-var helpers = require('../helpers');
-
-// All notes (main page)
-router.get('/', helpers.loginRequired, function(req, res) {
- req.user.getNotes(req.param("order", "-updated_at"), function(i, notes) {
- async.map(notes, function(item, cb) {
- item.getPad(function(err, pad) {
- item.pad = pad;
- return cb(null, item);
- })
- }, function(err, results) {
- res.render(
- 'notes/list',
- {title: 'All notes (' + results.length + ')', notes: results}
- );
- });
- })
-});
-
-// Create new note
-router.get('/notes/create', helpers.loginRequired, function(req, res) {
- res.render('notes/create', {padId: req.param('pad')});
-});
-
-router.post('/notes/create', helpers.loginRequired, function(req, res) {
- var data = req.body;
- data['user_id'] = req.user.id;
- req.models.Note.create(data, function(err, message) {
- if (err) {
- res.locals.errors = helpers.formatModelErrors(err);
- } else {
- req.flash(
- 'success',
- 'Note is successfully created'
- );
- return res.redirect('/');
- }
- res.render('notes/create');
- });
-});
-
-// Inject note in request
-router.use('/notes/:id', function(req, res, next) {
- if (req.user) {
- req.models.Note.one(
- {id: req.param('id'), user_id: req.user.id},
- function(err, note) {
- if (note == null) {
- res.send(404);
- return;
- };
- req.note = note;
- next();
- });
- } else {
- next();
- }
-});
-
-
-// View note
-router.get('/notes/:id', helpers.loginRequired, function(req, res) {
- res.render('notes/view', {note: req.note});
-});
-
-
-
-// Edit note
-router.get('/notes/:id/edit', helpers.loginRequired, function(req, res) {
- res.render('notes/edit', {note: req.note});
-});
-
-router.post('/notes/:id/edit', helpers.loginRequired, function(req, res) {
- req.note.save(req.body, function(err) {
- if (err) {
- res.locals.errors = helpers.formatModelErrors(err);
- res.render('notes/edit', {note: req.note});
- } else {
- req.flash(
- 'success',
- 'Note is successfully updated'
- );
- res.redirect('/notes/' + req.note.id);
- }
- });
-});
-
-// Delete note
-router.get('/notes/:id/delete', helpers.loginRequired, function(req, res) {
- res.render('notes/delete', {note: req.note});
-});
-
-router.post('/notes/:id/delete', helpers.loginRequired, function(req, res) {
- req.note.remove(function(err) {
- req.flash(
- 'success',
- 'Note is successfully deleted'
- );
- res.redirect('/');
- });
-});
-
-module.exports = router;
diff --git a/express/notejam/routes/pads.js b/express/notejam/routes/pads.js
deleted file mode 100644
index c9d1ceee4..000000000
--- a/express/notejam/routes/pads.js
+++ /dev/null
@@ -1,93 +0,0 @@
-var express = require('express');
-var router = express.Router();
-var orm = require('orm');
-
-var helpers = require('../helpers')
-
-// Create new pad
-router.get('/pads/create', helpers.loginRequired, function(req, res) {
- res.render('pads/create');
-});
-
-router.post('/pads/create', helpers.loginRequired, function(req, res) {
- var data = req.body;
- data['user_id'] = req.user.id;
- req.models.Pad.create(data, function(err, message) {
- if (err) {
- res.locals.errors = helpers.formatModelErrors(err);
- } else {
- req.flash(
- 'success',
- 'Pad is successfully created'
- );
- return res.redirect('/');
- }
- res.render('pads/create');
- });
-});
-
-// Inject pad in request
-router.use('/pads/:id', function(req, res, next) {
- if (req.user) {
- req.models.Pad.one(
- {id: req.param('id'), user_id: req.user.id},
- function(err, pad) {
- if (pad == null) {
- res.send(404);
- return;
- };
- req.pad = pad;
- next();
- });
- } else {
- next();
- }
-});
-
-// Pad notes
-router.get('/pads/:id', helpers.loginRequired, function(req, res) {
- req.pad.getNotes(req.param("order", "-updated_at"), function(i, notes) {
- res.render(
- 'pads/list',
- {title: req.pad.name + ' (' + notes.length + ')',
- pad: req.pad, notes: notes}
- );
- });
-});
-
-// Edit pad
-router.get('/pads/:id/edit', helpers.loginRequired, function(req, res) {
- res.render('pads/edit', {pad: req.pad});
-});
-
-router.post('/pads/:id/edit', helpers.loginRequired, function(req, res) {
- req.pad.save({name: req.param('name')}, function(err) {
- if (err) {
- res.locals.errors = helpers.formatModelErrors(err);
- res.render('pads/edit', {pad: req.pad});
- } else {
- req.flash(
- 'success',
- 'Pad is successfully updated'
- );
- res.redirect('/');
- }
- });
-});
-
-// Delete pad
-router.get('/pads/:id/delete', helpers.loginRequired, function(req, res) {
- res.render('pads/delete', {pad: req.pad});
-});
-
-router.post('/pads/:id/delete', helpers.loginRequired, function(req, res) {
- req.pad.remove(function(err) {
- req.flash(
- 'success',
- 'Pad is successfully deleted'
- );
- res.redirect('/');
- });
-});
-
-module.exports = router;
diff --git a/express/notejam/routes/users.js b/express/notejam/routes/users.js
deleted file mode 100644
index e1e72dc06..000000000
--- a/express/notejam/routes/users.js
+++ /dev/null
@@ -1,230 +0,0 @@
-var express = require('express');
-var router = express.Router();
-var debug = require('debug')('http')
-var orm = require('orm');
-var passport = require('passport');
-var LocalStrategy = require('passport-local').Strategy;
-var bcrypt = require('bcrypt');
-var nodemailer = require('nodemailer');
-var stubTransport = require('nodemailer-stub-transport');
-
-var helpers = require('../helpers')
-var settings = require('../settings');
-
-// Sign Up
-router.get('/signup', function(req, res) {
- res.render('users/signup');
-});
-
-router.post('/signup', function(req, res) {
- var data = req.body;
- if (data['password']) {
- data['password'] = generateHash(data['password']);
- };
- req.models.User.create(data, function(err, message) {
- if (err) {
- res.locals.errors = helpers.formatModelErrors(err);
- } else {
- req.flash(
- 'success',
- 'User is successfully created. Now you can sign in.'
- );
- return res.redirect('/signin');
- }
- res.render('users/signup');
- });
-});
-
-// Sign In
-router.get('/signin', function(req, res) {
- res.render('users/signin');
-});
-
-router.post('/signin', function(req, res, next) {
- req.checkBody('email', 'Email is required').notEmpty();
- req.checkBody('password', 'Password is required').notEmpty();
- if (req.validationErrors()) {
- var errors = helpers.formatFormErrors(req.validationErrors());
- }
-
- if (!errors) {
- passport.authenticate('local', function(err, user, info) {
- if (err) { return next(err) }
- if (!user) {
- req.flash('error', info.message);
- return res.redirect('/signin')
- }
- req.logIn(user, function(err) {
- if (err) { return next(err); }
- return res.redirect('/');
- });
- })(req, res, next);
- } else {
- res.locals.errors = errors;
- res.render('users/signin');
- }
-});
-
-// Account settings
-router.get('/settings', helpers.loginRequired, function(req, res) {
- res.render('users/settings');
-});
-
-router.post('/settings', function(req, res, next) {
- req.checkBody('password', 'Password is required').notEmpty();
- req.checkBody('new_password', 'New password is required').notEmpty();
- req.checkBody('confirm_new_password', 'Passwords do not match').equals(
- req.body.new_password
- );
- if (req.validationErrors()) {
- var errors = helpers.formatFormErrors(req.validationErrors());
- }
-
- if (!errors) {
- if (!checkPassword(req.user, req.param('password'))) {
- req.flash(
- 'error',
- 'Current password is not correct'
- );
- return res.redirect('/settings');
- }
- var hash = generateHash(req.param('password'));
- req.user.save({password: hash}, function(err) {
- req.flash(
- 'success',
- 'Password is successfully changed'
- );
- return res.redirect('/');
- })
- } else {
- res.locals.errors = errors;
- res.render('users/settings');
- }
-});
-
-// Forgot password
-router.get('/forgot-password', function(req, res) {
- res.render('users/forgot-password');
-});
-
-router.post('/forgot-password', function(req, res) {
- req.checkBody('email', 'Email is required').notEmpty();
- if (req.validationErrors()) {
- res.locals.errors = helpers.formatFormErrors(req.validationErrors());
- res.render('users/forgot-password');
- return;
- }
- if (req.models.User.one({email: req.param('email')}, function(err, user) {
- if (user) {
- var password = generateRandomPassword();
- var hash = generateHash(password);
- user.save({password: hash}, function() {
- sendNewPassword(user, password);
- req.flash(
- 'success',
- 'New password sent to your inbox'
- );
- return res.redirect('/signin');
- });
- } else {
- req.flash(
- 'error',
- 'No user with given email found'
- );
- return res.redirect('/forgot-password');
- }
- }));
-});
-
-// Sign Out
-router.get('/signout', function(req, res) {
- req.logout();
- res.redirect('/signin');
-});
-
-
-// Helper user functions
-// Auth settings
-passport.serializeUser(function(user, done) {
- done(null, user.id);
-});
-
-passport.deserializeUser(function(id, done) {
- findById(id, function (err, user) {
- done(err, user);
- });
-});
-
-passport.use(new LocalStrategy(
- {usernameField: 'email', passwordField: 'password'},
- function(username, password, done) {
- findByUsername(username, function(err, user) {
- if (err) {
- return done(err);
- }
- if (!user) {
- return done(null, false, { message: 'Unknown user ' + username });
- }
- if (!checkPassword(user, password)) {
- return done(null, false, { message: 'Invalid password' });
- }
- return done(null, user);
- })
- }
-));
-
-function findByUsername(username, fn) {
- orm.connect(settings.dsn, function(err, db) {
- db.load("../models", function (err) {
- var User = db.models.users;
- db.models.users.find({email: username}, function (err, users) {
- if (users.length) {
- return fn(null, users[0]);
- } else {
- return fn(null, null);
- }
- });
- });
- });
-}
-
-function findById(id, fn) {
- orm.connect(settings.dsn, function(err, db) {
- db.load("../models", function (err) {
- var User = db.models.users;
- User.get(id, function (err, user) {
- if (err) {
- fn(new Error('User ' + id + ' does not exist'));
- }
- return fn(null, user);
- });
- });
- });
-}
-
-function generateHash(password) {
- return bcrypt.hashSync(password, bcrypt.genSaltSync(10));
-}
-
-function checkPassword(user, password) {
- return bcrypt.compareSync(password, user.password);
-}
-
-function generateRandomPassword() {
- return Math.random().toString(36).replace(/[^a-z]+/g, '');
-}
-
-function sendNewPassword(user, password) {
- var mailer = nodemailer.createTransport(stubTransport());
- mailer.sendMail({
- from: 'norepy@notejamapp.com',
- to: user.email,
- subject: 'New notejam password',
- text: 'Your new password: ' + password
- }, function(err, info) {
- // sent mail to console output
- console.log(info.response.toString());
- });
-}
-
-module.exports = router;
diff --git a/express/notejam/settings.js b/express/notejam/settings.js
deleted file mode 100644
index 0350717b8..000000000
--- a/express/notejam/settings.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var settings = {
- development: {
- db: "notejam.db",
- dsn: "sqlite://notejam.db"
- },
- test: {
- db: "notejam_test.db",
- dsn: "sqlite://notejam_test.db"
- }
-};
-
-
-var env = process.env.NODE_ENV
-if (!env) {
- env = 'development'
-};
-module.exports = settings[env];
diff --git a/express/notejam/tests/config.js b/express/notejam/tests/config.js
deleted file mode 100644
index dfd5a09c9..000000000
--- a/express/notejam/tests/config.js
+++ /dev/null
@@ -1,25 +0,0 @@
-module.exports = {
- host: 'http://localhost',
- port: 3000,
-
- // build absolute url
- url: function(url) {
- return this.host + ":" + this.port + url;
- },
-
- // sign in user/agent
- signInUser: function (agent, user) {
- var self = this;
- return function(done) {
- agent
- .post(self.url('/signin'))
- .send(user)
- .end(onResponse);
-
- function onResponse(err, res) {
- res.should.have.status(200);
- return done();
- }
- };
- }
-}
diff --git a/express/notejam/tests/notes.js b/express/notejam/tests/notes.js
deleted file mode 100644
index da60c9aac..000000000
--- a/express/notejam/tests/notes.js
+++ /dev/null
@@ -1,141 +0,0 @@
-// Enable test environment
-process.env.NODE_ENV = 'test';
-
-var request = require('superagent');
-var should = require('should');
-require('should-http');
-
-var db = require('../db');
-var config = require('./config')
-var app = require('../app');
-
-app.listen(config.port);
-
-before(function(done) {
- db.createTables(function() {
- db.applyFixtures(done);
- });
-});
-
-describe('Note', function() {
-
- var agent = request.agent();
- before(
- config.signInUser(
- agent, {email: 'user1@example.com', password: 'password'}
- )
- );
-
- describe('can be', function() {
- it('successfully created', function(done) {
- agent
- .post(config.url('/notes/create'))
- .send({name: 'New note', text: 'text', pad_id: 1})
- .end(function(error, res){
- res.redirects.should.eql([config.url('/')]);
- res.text.should.containEql('Note is successfully created');
- done();
- });
- });
-
- it('successfully edited', function(done) {
- agent
- .post(config.url('/notes/1/edit'))
- .send({name: 'New name', text: 'New text'})
- .end(function(error, res){
- res.redirects.should.eql([config.url('/notes/1')]);
- res.text.should.containEql('Note is successfully updated');
- done();
- });
- });
-
- it('successfully deleted', function(done) {
- agent
- .post(config.url('/notes/2/delete'))
- .end(function(error, res){
- res.redirects.should.eql([config.url('/')]);
- res.text.should.containEql('Note is successfully deleted');
- done();
- });
- });
-
- it('successfully viewed', function(done) {
- agent
- .get(config.url('/notes/1'))
- .end(function(error, res){
- res.should.have.status(200);
- done();
- });
- });
- });
-
- describe('can not be', function() {
- it('created if required fields are missing', function(done) {
- agent
- .post(config.url('/notes/create'))
- .send({name: '', text: ''})
- .end(function(error, res){
- res.text.should.containEql('Name is required');
- res.text.should.containEql('Text is required');
- done();
- });
- });
-
- it('edited if required fields are missing', function(done) {
- agent
- .post(config.url('/notes/1/edit'))
- .send({name: '', text: ''})
- .end(function(error, res){
- res.text.should.containEql('Name is required');
- res.text.should.containEql('Text is required');
- done();
- });
- });
-
- it('edited by not an owner', function(done) {
- var agent = request.agent();
- var signed = config.signInUser(
- agent, {email: 'user2@example.com', password: 'password'}
- );
- signed(function() {
- agent
- .post(config.url('/notes/1/edit'))
- .send({name: 'new name', text: 'new text'})
- .end(function(error, res){
- res.should.have.status(404);
- done();
- });
- })
- });
-
- it('deleted by not an owner', function(done) {
- var agent = request.agent();
- var signed = config.signInUser(
- agent, {email: 'user2@example.com', password: 'password'}
- );
- signed(function() {
- agent
- .post(config.url('/notes/1/delete'))
- .end(function(error, res){
- res.should.have.status(404);
- done();
- });
- })
- });
-
- it('viewed by not an owner', function(done) {
- var agent = request.agent();
- var signed = config.signInUser(
- agent, {email: 'user2@example.com', password: 'password'}
- );
- signed(function() {
- agent
- .get(config.url('/notes/1'))
- .end(function(error, res){
- res.should.have.status(404);
- done();
- });
- })
- });
- });
-});
diff --git a/express/notejam/tests/pads.js b/express/notejam/tests/pads.js
deleted file mode 100644
index 00f1dab2c..000000000
--- a/express/notejam/tests/pads.js
+++ /dev/null
@@ -1,138 +0,0 @@
-// Enable test environment
-process.env.NODE_ENV = 'test';
-
-var request = require('superagent');
-var should = require('should');
-require('should-http');
-
-var db = require('../db');
-var config = require('./config');
-var app = require('../app');
-
-app.listen(3000);
-
-before(function(done) {
- db.createTables(function() {
- db.applyFixtures(done);
- });
-});
-
-describe('Pad', function() {
-
- var agent = request.agent();
- before(
- config.signInUser(agent, {email: 'user1@example.com', password: 'password'})
- );
-
- describe('can be', function() {
- it('successfully created', function(done) {
- agent
- .post(config.url('/pads/create'))
- .send({name: 'New pad'})
- .end(function(error, res){
- res.redirects.should.eql([config.url('/')]);
- res.text.should.containEql('Pad is successfully created');
- done();
- });
- });
-
- it('successfully edited', function(done) {
- agent
- .post(config.url('/pads/1/edit'))
- .send({name: 'New pad name'})
- .end(function(error, res){
- res.redirects.should.eql([config.url('/')]);
- res.text.should.containEql('Pad is successfully updated');
- done();
- });
- });
-
- it('successfully deleted', function(done) {
- agent
- .post(config.url('/pads/2/delete'))
- .end(function(error, res){
- res.redirects.should.eql([config.url('/')]);
- res.text.should.containEql('Pad is successfully deleted');
- done();
- });
- });
-
- it('successfully viewed', function(done) {
- agent
- .get(config.url('/pads/1'))
- .end(function(error, res){
- res.should.have.status(200);
- res.text.should.containEql('Pad settings');
- done();
- });
- });
- });
-
- describe('can not be', function() {
- it('created if required fields are missing', function(done) {
- agent
- .post(config.url('/pads/create'))
- .send({name: ''})
- .end(function(error, res){
- res.text.should.containEql('Name is required');
- done();
- });
- });
-
- it('edited if required fields are missing', function(done) {
- agent
- .post(config.url('/pads/1/edit'))
- .send({name: ''})
- .end(function(error, res){
- res.text.should.containEql('Name is required');
- done();
- });
- });
-
- it('edited by not an owner', function(done) {
- var agent = request.agent();
- var signed = config.signInUser(
- agent, {email: 'user2@example.com', password: 'password'}
- );
- signed(function() {
- agent
- .post(config.url('/pads/1/edit'))
- .send({name: 'new name'})
- .end(function(error, res){
- res.should.have.status(404);
- done();
- });
- })
- });
-
- it('deleted by not an owner', function(done) {
- var agent = request.agent();
- var signed = config.signInUser(
- agent, {email: 'user2@example.com', password: 'password'}
- );
- signed(function() {
- agent
- .post(config.url('/pads/1/delete'))
- .end(function(error, res){
- res.should.have.status(404);
- done();
- });
- })
- });
-
- it('viewed by not an owner', function(done) {
- var agent = request.agent();
- var signed = config.signInUser(
- agent, {email: 'user2@example.com', password: 'password'}
- );
- signed(function() {
- agent
- .get(config.url('/pads/1'))
- .end(function(error, res){
- res.should.have.status(404);
- done();
- });
- })
- });
- });
-});
diff --git a/express/notejam/tests/users.js b/express/notejam/tests/users.js
deleted file mode 100644
index 958f6caaa..000000000
--- a/express/notejam/tests/users.js
+++ /dev/null
@@ -1,106 +0,0 @@
-// Enable test environment
-process.env.NODE_ENV = 'test';
-
-var request = require('superagent');
-var should = require('should');
-require('should-http');
-
-var db = require('../db');
-var config = require('./config');
-var app = require('../app');
-
-app.listen(3000);
-
-before(function(done) {
- db.createTables(function() {
- db.applyFixtures(done);
- });
-});
-
-describe('User', function(){
-
- it('can successfully sign in', function(done){
- var agent = request.agent();
- agent
- .post(config.url('/signin'))
- .send({email: 'user1@example.com', password: 'password' })
- .end(function(error, res){
- res.redirects.should.eql([config.url('/')]);
- done();
- });
- });
-
- describe('cant sign in', function() {
- it('with wrong credentials', function(done) {
- var agent = request.agent();
- agent
- .post(config.url('/signin'))
- .send({email: 'unknown@email.com', password: 'unknown' })
- .end(function(error, res){
- res.text.should.containEql('Unknown user');
- done();
- });
- });
-
- it('if required fields are missing', function(done){
- var agent = request.agent();
- agent
- .post(config.url('/signin'))
- .send({email: '', password: '' })
- .end(function(error, res){
- res.text.should.containEql('Email is required');
- res.text.should.containEql('Password is required');
- done();
- });
- });
- });
-
- it('can successfully sign up', function(done) {
- var agent = request.agent();
- agent
- .post(config.url('/signup'))
- .send({email: 'usersadfasdf@example.com', password: 'password'})
- .end(function(error, res){
- res.redirects.should.eql([config.url('/signin')]);
- done();
- });
- });
-
- describe('cant signup', function() {
- it('if email is invalid', function(done) {
- var agent = request.agent();
- agent
- .post(config.url('/signup'))
- .send({email: 'invalid', password: 'password' })
- .end(function(error, res){
- res.text.should.containEql('Invalid email');
- done();
- });
- });
-
- it('if required fields are missing', function(done) {
- var agent = request.agent();
- agent
- .post(config.url('/signup'))
- .send({email: '', password: '' })
- .end(function(error, res){
- res.text.should.containEql('Invalid email');
- res.text.should.containEql('Password is required');
- done();
- });
- });
-
- it('if user already exists', function(done) {
- var agent = request.agent();
- agent
- .post(config.url('/signup'))
- .send({email: 'user1@example.com', password: 'password' })
- .end(function(error, res){
- res.text.should.containEql('User with given email already exists');
- done();
- });
- });
-
- // @TODO implement "if passwords do not match" case
- });
-})
diff --git a/express/notejam/views/error.jade b/express/notejam/views/error.jade
deleted file mode 100644
index db0601f24..000000000
--- a/express/notejam/views/error.jade
+++ /dev/null
@@ -1,6 +0,0 @@
-extends layout
-
-block content_area
- h1= message
- h2= error.status
- pre #{error.stack}
diff --git a/express/notejam/views/layout.jade b/express/notejam/views/layout.jade
deleted file mode 100644
index f94fa8bcb..000000000
--- a/express/notejam/views/layout.jade
+++ /dev/null
@@ -1,44 +0,0 @@
-include mixins.jade
-
-doctype html
-html(lang='en')
- meta(charset='utf-8')
- title
- block title
- meta(name='description', content='Notejam: Unified sample app')
- meta(name='author', content='Notejam')
- meta(name='viewport', content='width=device-width, initial-scale=1, maximum-scale=1')
- link(rel='stylesheet', href='http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/base.min.css')
- link(rel='stylesheet', href='http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/skeleton.min.css')
- link(rel='stylesheet', href='http://cdnjs.cloudflare.com/ajax/libs/skeleton/1.2/layout.css')
- link(rel='stylesheet', href='/stylesheets/style.css')
- body
- .container
- .sixteen.columns
- .sign-in-out-block
- if req.isAuthenticated()
- | #{req.user.email}:
- a(href='/settings') Account settings
- |
- a(href='/signout') Sign out
- else
- a(href='/signup') Sign up
- |
- a(href='/signin') Sign in
- .sixteen.columns
- h1.bold-header
- a.header(href="/")
- | note
- span.jam
- | jam:
- span
- block title
- block content_area
- hr.footer
- .footer
- div
- | Notejam: Express application
- div
- Github, Twitter, created by Serhii Komar
- a(href='https://github.com/komarserjio/notejam')
- img(style='position: absolute; top: 0; right: 0; border: 0;', src='https://s3.amazonaws.com/github/ribbons/forkme_right_gray_6d6d6d.png', alt='Fork me on GitHub')
diff --git a/express/notejam/views/main.jade b/express/notejam/views/main.jade
deleted file mode 100644
index 2441f8ff2..000000000
--- a/express/notejam/views/main.jade
+++ /dev/null
@@ -1,18 +0,0 @@
-extends layout
-
-block content_area
- .three.columns
- h4#logo My pads
- nav
- if pads.length
- ul
- each pad in pads
- li
- a(href='/pads/#{pad.id}') #{pad.name}
- else
- p.empty= 'No pads yet'
- hr
- a(href='/pads/create') New pad
- .thirteen.columns.content-area
- +render_flash_messages(flash_messages)
- block content
diff --git a/express/notejam/views/mixins.jade b/express/notejam/views/mixins.jade
deleted file mode 100644
index acfb1a12d..000000000
--- a/express/notejam/views/mixins.jade
+++ /dev/null
@@ -1,13 +0,0 @@
-mixin error(field, errors)
- if errors && (field in errors)
- ul.errors
- li= errors[field]
-
-// render flash messages
-mixin render_flash_messages(messages)
- if messages.success.length || messages.error.length
- div.alert-area
- each message in messages.success
- div.alert.alert-success= message
- each message in messages.error
- div.alert.alert-error= message
diff --git a/express/notejam/views/notes/create.jade b/express/notejam/views/notes/create.jade
deleted file mode 100644
index 8a3dd27f4..000000000
--- a/express/notejam/views/notes/create.jade
+++ /dev/null
@@ -1,19 +0,0 @@
-extends ../main
-
-block title
- | New note
-
-block content
- form.note(method='POST')
- label(for='name') Name
- input#name(type='text', name='name')
- +error('name', errors)
- label(for='text') Text
- textarea(name='text')
- +error('text', errors)
- label(for='pad_id') Pad
- select(name='pad_id')
- option --------------
- each pad in req.user.pads
- option(value=pad.id, selected=pad.id == padId) #{pad.name}
- input(type='submit', value='Save')
diff --git a/express/notejam/views/notes/delete.jade b/express/notejam/views/notes/delete.jade
deleted file mode 100644
index 61224f24d..000000000
--- a/express/notejam/views/notes/delete.jade
+++ /dev/null
@@ -1,12 +0,0 @@
-extends ../main
-
-block title
- | #{note.name}
-
-block content
- p Are you sure you want to delete the note?
- form(method='post')
- input(type='submit', class="red", value='Yes, delete I want to delete this note')
- |
- a(href='/notes/#{note.id}') Cancel
-
diff --git a/express/notejam/views/notes/edit.jade b/express/notejam/views/notes/edit.jade
deleted file mode 100644
index 95b1233e6..000000000
--- a/express/notejam/views/notes/edit.jade
+++ /dev/null
@@ -1,20 +0,0 @@
-extends ../main
-
-block title
- | #{note.name}
-
-block content
- form.note(method='POST')
- label(for='name') Name
- input#name(type='text', name='name', value='#{note.name}')
- +error('name', errors)
- label(for='text') Text
- textarea(name='text') #{note.text}
- +error('text', errors)
- label(for='pad_id') Pad
- select(name='pad_id')
- option ----------
- each pad in req.user.pads
- option(value=pad.id, selected=pad.id == note.pad_id) #{pad.name}
- input(type='submit', value='Save')
-
diff --git a/express/notejam/views/notes/list.jade b/express/notejam/views/notes/list.jade
deleted file mode 100644
index 868dfa47b..000000000
--- a/express/notejam/views/notes/list.jade
+++ /dev/null
@@ -1,33 +0,0 @@
-extends ../main
-
-block title
- | #{title}
-
-block content
- if notes.length
- table.notes
- tr
- th.note
- | Note
- a.sort_arrow(href='/?order=-name') ↑
- a.sort_arrow(href='/?order=name') ↓
- th
- | Pad
- th.date
- | Last modified
- a.sort_arrow(href='/?order=-updated_at') ↑
- a.sort_arrow(href='/?order=updated_at') ↓
- each note in notes
- tr
- td
- a(href='/notes/#{note.id}') #{note.name}
- td.pad
- if note.pad
- a(href='/pads/#{note.pad.id}') #{note.pad.name}
- else
- | No pad
- td.hidden-text.date #{note.updatedAt()}
- else
- p.empty Create your first note
- a.button(href='/notes/create') New note
-
diff --git a/express/notejam/views/notes/view.jade b/express/notejam/views/notes/view.jade
deleted file mode 100644
index 79a7c933a..000000000
--- a/express/notejam/views/notes/view.jade
+++ /dev/null
@@ -1,12 +0,0 @@
-extends ../main
-
-block title
- | #{note.name}
-
-block content
- p.hidden-text Last edited #{note.updatedAt()}
- div.note
- p #{note.text}
-
- a.button(href='/notes/#{note.id}/edit') Edit
- a.delete-note(href='/notes/#{note.id}/delete') Delete it
diff --git a/express/notejam/views/pads/create.jade b/express/notejam/views/pads/create.jade
deleted file mode 100644
index 416c94bce..000000000
--- a/express/notejam/views/pads/create.jade
+++ /dev/null
@@ -1,11 +0,0 @@
-extends ../main
-
-block title
- | New pad
-
-block content
- form(method='POST')
- label(for='name') Name
- input#name(type='text', name='name')
- +error('name', errors)
- input(type='submit', value='Save')
diff --git a/express/notejam/views/pads/delete.jade b/express/notejam/views/pads/delete.jade
deleted file mode 100644
index 09597cc8e..000000000
--- a/express/notejam/views/pads/delete.jade
+++ /dev/null
@@ -1,11 +0,0 @@
-extends ../main
-
-block title
- | #{pad.name}
-
-block content
- p Are you sure you want to delete the pad?
- form(method='post')
- input(type='submit', class="red", value='Yes, delete I want to delete this pad')
- |
- a(href="/pads/#{pad.id}/edit") Cancel
diff --git a/express/notejam/views/pads/edit.jade b/express/notejam/views/pads/edit.jade
deleted file mode 100644
index 0d6b013b0..000000000
--- a/express/notejam/views/pads/edit.jade
+++ /dev/null
@@ -1,14 +0,0 @@
-extends ../main
-
-block title
- | #{pad.name}
-
-block content
- form(method='POST')
- label(for='name') Name
- input#name(type='text', name='name', value='#{pad.name}')
- +error('name', errors)
- input(type='submit', value='Save')
- div
- a.red(href="/pads/#{pad.id}/delete") Delete pad
-
diff --git a/express/notejam/views/pads/list.jade b/express/notejam/views/pads/list.jade
deleted file mode 100644
index 95f248233..000000000
--- a/express/notejam/views/pads/list.jade
+++ /dev/null
@@ -1,27 +0,0 @@
-extends ../main
-
-block title
- | #{title}
-
-block content
- if notes.length
- table.notes
- tr
- th.note
- | Note
- a.sort_arrow(href='/pads/#{pad.id}/?order=-name') ↑
- a.sort_arrow(href='/pads/#{pad.id}/?order=name') ↓
- th.date
- | Last modified
- a.sort_arrow(href='/pads/#{pad.id}/?order=-updated_at') ↑
- a.sort_arrow(href='/pads/#{pad.id}/?order=updated_at') ↓
- each note in notes
- tr
- td
- a(href='/notes/#{note.id}') #{note.name}
- td.hidden-text.date #{note.updatedAt()}
- else
- p.empty Create your first note in the pad
- a.button(href='/notes/create?pad=#{pad.id}') New note
- |
- a(href="/pads/#{pad.id}/edit") Pad settings
diff --git a/express/notejam/views/user.jade b/express/notejam/views/user.jade
deleted file mode 100644
index f6c3513d2..000000000
--- a/express/notejam/views/user.jade
+++ /dev/null
@@ -1,6 +0,0 @@
-extends layout
-
-block content_area
- .sixteen.columns.content-area
- +render_flash_messages(flash_messages)
- block content
diff --git a/express/notejam/views/users/forgot-password.jade b/express/notejam/views/users/forgot-password.jade
deleted file mode 100644
index 70a856e3d..000000000
--- a/express/notejam/views/users/forgot-password.jade
+++ /dev/null
@@ -1,11 +0,0 @@
-extends ../user
-
-block title
- | Forgot password?
-
-block content
- form.offset-by-six.sign-in(method='POST')
- label(for='email') Email
- input#email(type='text', name='email')
- +error('email', errors)
- input(type='submit', value='Get new password')
diff --git a/express/notejam/views/users/settings.jade b/express/notejam/views/users/settings.jade
deleted file mode 100644
index bda9ec5f3..000000000
--- a/express/notejam/views/users/settings.jade
+++ /dev/null
@@ -1,18 +0,0 @@
-extends ../user
-
-block title
- | Account settings
-
-block content
- form.offset-by-six.sign-in(method='POST')
- label(for='password') Current password
- input#email(type='password', name='password')
- +error('password', errors)
- label(for='new_password') New Password
- input#password(type='password', name='new_password')
- +error('new_password', errors)
- label(for='confirm_new_password') Confirm New Password
- input#confirm_password(type='password', name='confirm_new_password')
- +error('confirm_new_password', errors)
- input(type='submit', value='Change password')
-
diff --git a/express/notejam/views/users/signin.jade b/express/notejam/views/users/signin.jade
deleted file mode 100644
index dcd13b36f..000000000
--- a/express/notejam/views/users/signin.jade
+++ /dev/null
@@ -1,18 +0,0 @@
-extends ../user
-
-block title
- | Sign In
-
-block content
- form.offset-by-six.sign-in(method='POST')
- label(for='email') Email
- input#email(type='text', name='email')
- +error('email', errors)
- label(for='password') Password
- input#password(type='password', name='password')
- +error('password', errors)
- input(type='submit', value='Sign In')
- | or Sign Up
- hr
- p
- a.small-red(href='/forgot-password') Forgot password?
diff --git a/express/notejam/views/users/signup.jade b/express/notejam/views/users/signup.jade
deleted file mode 100644
index c7e487d80..000000000
--- a/express/notejam/views/users/signup.jade
+++ /dev/null
@@ -1,22 +0,0 @@
-extends ../user
-
-block title
- | Sign Up
-
-block content
- form.offset-by-six.sign-in(method='POST')
- label(for='email') Email
- input#email(type='text', name='email')
- +error('email', errors)
- label(for='password') Password
- input#password(type='password', name='password')
- +error('password', errors)
- label(for='confirm_password') Confirm Password
- input#confirm_password(type='password', name='confirm_password')
- +error('confirm_password', errors)
- input(type='submit', value='Sign Up')
- | or Sign In
- hr
- p
- a.small-red(href='#forgot-password') Forgot password?
-
diff --git a/flask/README.rst b/flask/README.rst
deleted file mode 100644
index f9924f074..000000000
--- a/flask/README.rst
+++ /dev/null
@@ -1,89 +0,0 @@
-**************
-Notejam: Flask
-**************
-
-Notejam application implemented using `Flask `_ microframework.
-
-Flask version: 1.1.1
-
-Flask extension used:
-
-* Flask-Login
-* Flask-Mail
-* Flask-SQLAlchemy
-* Flask-Testing
-* Flask-WTF
-
-==========================
-Installation and launching
-==========================
-
------
-Clone
------
-
-Clone the repo:
-
-.. code-block:: bash
-
- $ git clone git@github.com:nordcloud/notejam.git YOUR_PROJECT_DIR/
-
--------
-Install
--------
-Use `virtualenv `_ or `virtualenvwrapper `_
-for `environment management `_.
-
-Install dependencies:
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/flask/
- $ pip install -r requirements.txt
-
-Create database schema:
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/flask/
- $ python db.py
-
-------
-Launch
-------
-
-Start flask web server:
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/flask/
- $ python runserver.py
-
-Go to http://127.0.0.1:5000/ in your browser
-
----------
-Run tests
----------
-
-Run functional and unit tests:
-
-.. code-block:: bash
-
- $ cd YOUR_PROJECT_DIR/flask/
- $ python tests.py
-
-
-============
-Contribution
-============
-
-Do you have python/flask experience? Help the app to follow python and flask best practices.
-
-Please send your pull requests in the ``master`` branch.
-Always prepend your commits with framework name:
-
-.. code-block:: bash
-
- Flask: Implemented sign in functionality
-
-Read `contribution guide `_ for details.
diff --git a/flask/db.py b/flask/db.py
deleted file mode 100644
index 4190c769a..000000000
--- a/flask/db.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from notejam import db
-
-# Create db schema
-db.create_all()
diff --git a/flask/notejam/__init__.py b/flask/notejam/__init__.py
deleted file mode 100644
index 4257505a3..000000000
--- a/flask/notejam/__init__.py
+++ /dev/null
@@ -1,19 +0,0 @@
-from flask import Flask
-from flask_sqlalchemy import SQLAlchemy
-from flask_login import LoginManager
-from flask_mail import Mail
-
-# @TODO use application factory approach
-app = Flask(__name__)
-app.config.from_object('notejam.config.Config')
-app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
-db = SQLAlchemy(app)
-
-login_manager = LoginManager()
-login_manager.login_view = "signin"
-login_manager.init_app(app)
-
-mail = Mail()
-mail.init_app(app)
-
-from notejam import views
diff --git a/flask/notejam/config.py b/flask/notejam/config.py
deleted file mode 100644
index de9c901fd..000000000
--- a/flask/notejam/config.py
+++ /dev/null
@@ -1,24 +0,0 @@
-import os
-basedir = os.path.abspath(os.path.dirname(__file__))
-
-class Config(object):
- DEBUG = False
- TESTING = False
- SECRET_KEY = 'notejam-flask-secret-key'
- WTF_CSRF_ENABLED = True
- CSRF_SESSION_KEY = 'notejam-flask-secret-key'
- SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'notejam.db')
-
-
-class ProductionConfig(Config):
- DEBUG = False
-
-
-class DevelopmentConfig(Config):
- DEVELOPMENT = True
- DEBUG = True
-
-
-class TestingConfig(Config):
- TESTING = True
- WTF_CSRF_ENABLED = False
diff --git a/flask/notejam/forms.py b/flask/notejam/forms.py
deleted file mode 100644
index 6b13bc53a..000000000
--- a/flask/notejam/forms.py
+++ /dev/null
@@ -1,84 +0,0 @@
-from flask_wtf import FlaskForm
-from wtforms import StringField, PasswordField, SelectField, TextAreaField
-from wtforms.validators import Required, Email, EqualTo, ValidationError
-
-from notejam.models import User, Pad
-
-
-class SigninForm(FlaskForm):
- email = StringField('Email', validators=[Required(), Email()])
- password = PasswordField('Password', validators=[Required()])
-
-
-class SignupForm(FlaskForm):
- email = StringField('Email', validators=[Required(), Email()])
- password = PasswordField('Password', validators=[Required()])
- repeat_password = PasswordField(
- 'Repeat Password',
- validators=[
- Required(), EqualTo(
- 'password', message="Your passwords do not match"
- )
- ]
- )
-
- def validate_email(self, field):
- if User.query.filter_by(email=field.data).count():
- raise ValidationError(
- 'User with this email is already signed up'
- )
-
-
-class NoteForm(FlaskForm):
- name = StringField('Name', validators=[Required()])
- text = TextAreaField('Note', validators=[Required()])
- pad = SelectField('Pad', choices=[], coerce=int)
-
- # @TODO use wtforms.ext.sqlalchemy.fields.QuerySelectField?
- def __init__(self, user=None, **kwargs):
- super(NoteForm, self).__init__(**kwargs)
- self.pad.choices = [(0, '---------')] + [
- (p.id, p.name) for p in Pad.query.filter_by(user=user)
- ]
-
-
-class PadForm(FlaskForm):
- name = StringField('Name', validators=[Required()])
-
-
-# dummy form
-class DeleteForm(FlaskForm):
- pass
-
-
-class ChangePasswordForm(FlaskForm):
- old_password = PasswordField('Old Password', validators=[Required()])
- new_password = PasswordField('New Password', validators=[Required()])
- repeat_new_password = PasswordField(
- 'Repeat New Password',
- validators=[
- Required(), EqualTo(
- 'new_password', message="Your passwords don't match"
- )
- ]
- )
-
- def __init__(self, **kwargs):
- super(ChangePasswordForm, self).__init__(**kwargs)
- self.user = kwargs['user']
-
- def validate_old_password(self, field):
- if not self.user.check_password(field.data):
- raise ValidationError(
- 'Incorrect old password'
- )
-
-
-class ForgotPasswordForm(FlaskForm):
- email = StringField('Email', validators=[Required(), Email()])
-
- def validate_email(self, field):
- if not User.query.filter_by(email=field.data).count():
- raise ValidationError(
- 'No user with given email found'
- )
diff --git a/flask/notejam/models.py b/flask/notejam/models.py
deleted file mode 100755
index fa717ffba..000000000
--- a/flask/notejam/models.py
+++ /dev/null
@@ -1,66 +0,0 @@
-import datetime
-
-from werkzeug.security import (generate_password_hash,
-check_password_hash)
-from flask_login import UserMixin
-
-from notejam import db
-
-
-class User(db.Model, UserMixin):
- id = db.Column(db.Integer, primary_key=True)
- email = db.Column(db.String(120), unique=True)
- password = db.Column(db.String(100))
-
- @staticmethod
- def authenticate(email, password):
- user = User.query.filter_by(email=email).first()
- if user and user.check_password(password):
- return user
-
- def set_password(self, password):
- self.password = generate_password_hash(password)
-
- def check_password(self, password):
- return check_password_hash(self.password, password)
-
- def __repr__(self):
- return '' % self.email
-
-
-class Note(db.Model):
- id = db.Column(db.Integer, primary_key=True)
- name = db.Column(db.String(100))
- text = db.Column(db.Text)
- created_at = db.Column(db.DateTime, default=datetime.datetime.now)
- updated_at = db.Column(
- db.DateTime,
- default=datetime.datetime.now,
- onupdate=datetime.datetime.now
- )
-
- user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
- user = db.relationship('User', backref=db.backref('notes', lazy='dynamic'))
-
- pad_id = db.Column(db.Integer, db.ForeignKey('pad.id'))
- pad = db.relationship(
- 'Pad',
- backref=db.backref('notes', lazy='dynamic', cascade='all')
- )
-
- def __repr__(self):
- return '' % self.name
-
-
-class Pad(db.Model):
- id = db.Column(db.Integer, primary_key=True)
- name = db.Column(db.String(100))
-
- user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
- user = db.relationship(
- 'User',
- backref=db.backref('pads', lazy='dynamic', cascade='all')
- )
-
- def __repr__(self):
- return '' % self.name
diff --git a/flask/notejam/static/css/style.css b/flask/notejam/static/css/style.css
deleted file mode 100644
index b800e615d..000000000
--- a/flask/notejam/static/css/style.css
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
-* Skeleton V1.0.3
-* Copyright 2011, Dave Gamache
-* www.getskeleton.com
-* Free to use under the MIT license.
-* http://www.opensource.org/licenses/mit-license.php
-* 7/17/2011
-*/
-
-
-/* Documentation Styles
-================================================== */
- div.container {
- padding-top: 40px; }
-
- /* Doc nav */
- nav {
- width: 160px; }
- #logo, .bold-header {
- margin-bottom: 30px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- letter-spacing: -1px;
- color: #555;
- font-weight: bold; }
- .bold-header span {
- font-weight: normal;
- font-size: 23px;
- }
- .bold-header a.header {
- text-decoration: none;
- color: inherit;
- }
- .bold-header span.jam {
- font-size: 46px;
- line-height: 50px;
- }
- nav ul {
- float: left; }
- nav ul li {
- display: block;
- margin-bottom: 10px; }
- nav ul li a,
- nav ul li a:visited,
- nav ul li a:active {
- font-size: 14px;
- color: #555;
- text-decoration: none;
- font-weight: bold; }
- nav ul li a:hover,
- nav ul li a:focus {
- color: #222; }
- header h1 {
- font-size: 52px;
- line-height: 61px;
- letter-spacing: -1px;
- font-weight: normal;
- font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; }
- hr.large {
- border: none;
- height: 8px;
- background: #ebebeb;
- margin: 50px 0; }
- div.doc-section {
- margin: 30px 0; }
-
- #whatAndWhy .row {
- padding: 30px 0 0; }
-
- #typography blockquote {
- margin-top: 20px; }
-
- .hidden-code a {
- font-size: 12px;
- color: #999; }
- .hidden-code>div {
- display: none; }
-
-
- /* Grid */
- #grid .column,
- #grid .columns {
- background: #ddd;
- height: 25px;
- line-height: 25px;
- margin-bottom: 10px;
- text-align: center;
- text-transform: uppercase;
- color: #555;
- font-size: 12px;
- font-weight: bold;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border-radius: 2px; }
- #grid .column:hover,
- #grid .columns:hover {
- background: #bbb;
- color: #333; }
- #grid .example-grid { overflow: hidden; }
-
- .post-button-note,
- .post-button-note a {
- font-size: 11px;
- color: #999; }
-
- #examples .four.columns a {
- text-decoration: none;
- }
- #examples .four.columns a:hover {
- text-decoration: underline;
- }
-
-
- .resize {
- position: fixed;
- bottom: 0;
- right: 0;
- height: 80px;
- width: 80px;
- background: url(images/resize.png); }
-
-
- img {
- max-width: 100%;
- height: auto; }
-
- .gist-meta { display: none !important;}
-
- ul ul ul li { margin-bottom: 3px; }
-
- .twitter-share-button { margin-bottom: -18px; }
-
-.carbonad,
-.carbonad-image,
-.carbonad-text,
-.carbonad-tag {
- background: none !important;
- border: none !important;
- margin-left: 0 !important;
-}
-.carbonad-tag {
- margin-top: 6px !important;
- padding-top: 0 !important;
-}
-.carbonad-text {
- height: auto !important;
-}
-.carbonad-image {
- margin-top: 0 !important;
-}
-
-.hidden-text {
- font-size: 12px;
- color: #999;
-}
-
-td.date, th.date {
- text-align: right;
-}
-
-td.date {
- font-style: italic;
-}
-
-form.note input[type="text"], form.note textarea {
- width: 100%;
-}
-
-form hr {
- width: 218px;
- margin: 10px 0px;
-}
-
-form.note textarea {
- height: 250px;
-}
-
-div.content-area {
- min-height: 600px;
-}
-
-hr.footer {
- margin-bottom: 10px;
-}
-
-div.footer {
- margin-bottom: 10px;
- text-align: center;
- font-size: 12px;
-}
-
-form.sign-in {
- margin: 50px 0 0 0;
-}
-
-.sort_arrow {
- text-decoration: none;
-}
-
-.sort_arrow:hover {
- text-decoration: none;
- color: red;
-}
-
-div.sign-in-out-block {
- position: absolute;
- right: 14px;
- top: 8px;
- font-size: 12px;
-}
-
-div.sign-in-out-block a {
- /*text-decoration: none;*/
-}
-
-a.small-red {
- color: red;
- font-size: 12px;
-}
-
-table.notes {
- margin: 0 0 20px 0;
-}
-
-table.notes th.note {
- width: 72%;
-}
-
-table.notes td.pad {
- color: grey;
-}
-
-table.notes td.pad a {
- color: grey;
- text-decoration: underline;
- font-style: normal;
-}
-
-
-table.notes td.pad a:hover {
- color: black;
-}
-
-p.empty {
- color: grey;
- font-style: italic;
-}
-
-a.delete-note {
- float: right;
- font-size: 12px;
- color: red;
-}
-
-.red, input.red {
- color: red !important;
-}
-
-ul.errorlist, ul.errors {
- margin: -18px 0 0 0;
-}
-
-ul.errorlist li, ul.errors li {
- color: red;
-}
-
-.alert-area {
- text-align: center;
-}
-
-.alert {
- padding: 5px 8px;
- margin: 0 0 12px 0;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border-radius: 2px;
-}
-
-.alert-success {
- color: #468847;
- background-color: #dff0d8;
- border: 1px solid #d6e9c6;
-}
-
-.alert-error {
- color: #b94a48;
- background-color: #f2dede;
- border: 1px solid #eed3d7;
-}
-
- /* Mobile */
- @media only screen and (max-width: 767px) {
- header h1 { font-size: 34px; line-height: 37px; }
- nav { position: relative; }
- nav ul,
- .carbonad {
- display: none;
- }
- #logo { text-align: left; }
- #examples .four.columns {
- padding-top: 30px;
- }
- }
-
- /* Mobile Landscape */
- @media only screen and (min-width: 480px) and (max-width: 767px) {
- nav ul {
- display: none;
- }
- }
-
- /* Non 960 */
- @media only screen and (max-width: 959px) {
- #logo {
- font-size: 21px;
- margin-bottom: 15px; }
- nav .button {
- padding: 9px 20px 11px; }
- }
-
- /* iPad Portrait/Browser */
- @media only screen and (min-width: 768px) and (max-width: 959px) {
- nav {
- width: 124px; }
- }
-
- /* Mobile/Browser */
- @media only screen and (max-width: 767px) {}
-
- /* Mobile Landscape/Browser */
- @media only screen and (min-width: 480px) and (max-width: 767px) {}
-
- /* Anything smaller than standard 960 */
- @media only screen and (max-width: 959px) {}
-
-
- /* iPad Portrait Only */
- @media only screen and (min-width: 768px) and (max-width: 959px) and (max-device-width: 1000px) {}
-
- /* Mobile Only */
- @media only screen and (max-width: 767px) and (max-device-width: 1000px) {}
-
- /* Mobile Landscape Only */
- @media only screen and (min-width: 480px) and (max-width: 767px) and (max-device-width: 1000px) {}
-
- /* Anything smaller than standard 960 on a device */
- @media only screen and (max-width: 959px) and (max-device-width: 1000px) {
- .resize { display: none; }
- }
-
-
diff --git a/flask/notejam/static/css/tables.css b/flask/notejam/static/css/tables.css
deleted file mode 100644
index fb4441935..000000000
--- a/flask/notejam/static/css/tables.css
+++ /dev/null
@@ -1,45 +0,0 @@
-table {
- width: 100%;
- border-collapse: collapse;
-}
-
-table th, table td {
- padding: 10px 10px 9px;
- font-size: 13px;
- line-height: 18px;
- text-align: left;
-}
-
-table td {
- vertical-align: top;
- border-top: solid 1px #ddd;
-}
-
-table th {
- padding-top: 9px;
- font-weight: bold;
- vertical-align: middle;
-}
-
-table.condensed th, table.condensed td {
- padding: 5px 5px 4px;
-}
-
-table.bordered {
- border-collapse: separate;
- border: solid 1px #ddd;
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- border-radius: 2px;
-}
-
-table.bordered th + th,
-table.bordered th + td,
-table.bordered td + td {
- border-left: solid 1px #ddd;
-}
-
-.zebra-striped tbody tr:nth-child(odd) td,
-.zebra-striped tbody tr:nth-child(odd) th {
- background: #f5f5f5;
-}
diff --git a/flask/notejam/templates/_helpers.html b/flask/notejam/templates/_helpers.html
deleted file mode 100644
index bea460a16..000000000
--- a/flask/notejam/templates/_helpers.html
+++ /dev/null
@@ -1,11 +0,0 @@
-{% macro render_field(field) %}
-
- {{ field }}
- {% if field.errors %}
-
- {% for error in field.errors %}
- - {{ error }}
- {% endfor %}
-
- {% endif %}
-{% endmacro %}
diff --git a/flask/notejam/templates/base.html b/flask/notejam/templates/base.html
deleted file mode 100644
index 5a061688b..000000000
--- a/flask/notejam/templates/base.html
+++ /dev/null
@@ -1,95 +0,0 @@
-
-
-
-
-
-
-
-
-
- {% block title %}Notejam{% endblock %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {% block extrahead %}{% endblock %}
-
-
-
-
-
-
-
- {% block pads %}
-
-
My pads
-
-
-
-
- {% endblock %}
-
- {% with messages = get_flashed_messages(with_categories=true) %}
- {% if messages %}
-
- {% for category, message in messages %}
- {{ message }}
- {% endfor %}
-
- {% endif %}
- {% endwith %}
- {% block content %}
- {% endblock %}
-
-
-
-
-
-
-
-
diff --git a/flask/notejam/templates/notes/create.html b/flask/notejam/templates/notes/create.html
deleted file mode 100644
index 2a83b0914..000000000
--- a/flask/notejam/templates/notes/create.html
+++ /dev/null
@@ -1,10 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}New note{% endblock %}
-{% block page_title %}New note{% endblock %}
-
-{% block content %}
- {% include "notes/form.html" %}
-{% endblock %}
-
-
diff --git a/flask/notejam/templates/notes/delete.html b/flask/notejam/templates/notes/delete.html
deleted file mode 100644
index c52cf550f..000000000
--- a/flask/notejam/templates/notes/delete.html
+++ /dev/null
@@ -1,13 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}{{ note.name }}{% endblock %}
-{% block page_title %}{{ note.name }}{% endblock %}
-
-{% block content %}
- Are you sure you want to delete {{ note.name }}?
-
-{% endblock %}
diff --git a/flask/notejam/templates/notes/edit.html b/flask/notejam/templates/notes/edit.html
deleted file mode 100644
index 292ce8f97..000000000
--- a/flask/notejam/templates/notes/edit.html
+++ /dev/null
@@ -1,11 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}{{ form.name.data }}{% endblock %}
-{% block page_title %}{{ form.name.data }}{% endblock %}
-
-{% block content %}
- {% include "notes/form.html" %}
-{% endblock %}
-
-
-
diff --git a/flask/notejam/templates/notes/form.html b/flask/notejam/templates/notes/form.html
deleted file mode 100644
index b83c5f9e7..000000000
--- a/flask/notejam/templates/notes/form.html
+++ /dev/null
@@ -1,10 +0,0 @@
-{% from "_helpers.html" import render_field %}
-
-
-
diff --git a/flask/notejam/templates/notes/list.html b/flask/notejam/templates/notes/list.html
deleted file mode 100644
index fffc9f61f..000000000
--- a/flask/notejam/templates/notes/list.html
+++ /dev/null
@@ -1,34 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}All notes ({{ notes|length }}){% endblock %}
-{% block page_title %} All notes ({{ notes|length }}) {% endblock %}
-
-{% block content %}
- {% if notes %}
-
-
- | Note ↓↑ |
- Pad |
- Last modified ↓↑ |
-
- {% for note in notes %}
-
- | {{ note.name }} |
-
- {% if note.pad %}
- {{ note.pad.name }}
- {% else %}
- No pad
- {% endif %}
- |
- {{ note.updated_at|smart_date }} |
-
- {% endfor %}
-
- {% else %}
- Create your first note.
- {% endif %}
- New note
-{% endblock %}
-
-
diff --git a/flask/notejam/templates/notes/view.html b/flask/notejam/templates/notes/view.html
deleted file mode 100644
index f73a5fe81..000000000
--- a/flask/notejam/templates/notes/view.html
+++ /dev/null
@@ -1,14 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}{{ note.name }}{% endblock %}
-{% block page_title %}{{ note.name }}{% endblock %}
-
-{% block content %}
- Last edited at {{ note.updated_at|smart_date }}
-
- {{ note.text }}
-
- Edit
- Delete it
-{% endblock %}
-
diff --git a/flask/notejam/templates/pads/create.html b/flask/notejam/templates/pads/create.html
deleted file mode 100644
index e43ed38b1..000000000
--- a/flask/notejam/templates/pads/create.html
+++ /dev/null
@@ -1,11 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}New pad{% endblock %}
-{% block page_title %}New pad{% endblock %}
-
-{% block content %}
- {% include "pads/form.html" %}
-{% endblock %}
-
-
-
diff --git a/flask/notejam/templates/pads/delete.html b/flask/notejam/templates/pads/delete.html
deleted file mode 100644
index d93d979b7..000000000
--- a/flask/notejam/templates/pads/delete.html
+++ /dev/null
@@ -1,17 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}{{ pad.name }}{% endblock %}
-{% block page_title %}{{ pad.name }}{% endblock %}
-
-{% block content %}
- Are you sure you want to delete {{ pad.name }}?
-
-{% endblock %}
-
-
-
-
diff --git a/flask/notejam/templates/pads/edit.html b/flask/notejam/templates/pads/edit.html
deleted file mode 100644
index 56b30dddd..000000000
--- a/flask/notejam/templates/pads/edit.html
+++ /dev/null
@@ -1,13 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}{{ pad.name }}{% endblock %}
-{% block page_title %}{{ pad.name }}{% endblock %}
-
-{% block content %}
- {% include "pads/form.html" %}
- Delete pad
-{% endblock %}
-
-
-
-
diff --git a/flask/notejam/templates/pads/form.html b/flask/notejam/templates/pads/form.html
deleted file mode 100644
index d6895e3bc..000000000
--- a/flask/notejam/templates/pads/form.html
+++ /dev/null
@@ -1,9 +0,0 @@
-{% from "_helpers.html" import render_field %}
-
-
-
-
diff --git a/flask/notejam/templates/pads/note_list.html b/flask/notejam/templates/pads/note_list.html
deleted file mode 100644
index 31bd5fb41..000000000
--- a/flask/notejam/templates/pads/note_list.html
+++ /dev/null
@@ -1,26 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}{{ pad.name }} ({{ pad.notes.count() }}){% endblock %}
-{% block page_title %}{{ pad.name }} ({{ pad.notes.count() }}){% endblock %}
-
-{% block content %}
- {% if notes %}
-
-
- | Note
- ↓↑ |
- Last modified ↓↑ |
-
- {% for note in notes %}
-
- | {{ note.name }} |
- {{ note.updated_at|smart_date }} |
-
- {% endfor %}
-
- {% else %}
- Create first note in the pad.
- {% endif %}
- New note
- Pad settings
-{% endblock %}
diff --git a/flask/notejam/templates/user.html b/flask/notejam/templates/user.html
deleted file mode 100644
index 8e556e310..000000000
--- a/flask/notejam/templates/user.html
+++ /dev/null
@@ -1,4 +0,0 @@
-{% extends "base.html" %}
-
-{% block pads %}{% endblock %}
-{% block content_class %}sixteen columns content-area{% endblock %}
diff --git a/flask/notejam/templates/users/forgot_password.html b/flask/notejam/templates/users/forgot_password.html
deleted file mode 100644
index 0635ad68a..000000000
--- a/flask/notejam/templates/users/forgot_password.html
+++ /dev/null
@@ -1,14 +0,0 @@
-{% extends "user.html" %}
-{% from "_helpers.html" import render_field %}
-
-{% block title %}Forgot Password?{% endblock %}
-{% block page_title %}Forgot Password?{% endblock %}
-
-{% block content %}
-
-{% endblock %}
-
diff --git a/flask/notejam/templates/users/settings.html b/flask/notejam/templates/users/settings.html
deleted file mode 100644
index 0de132d2f..000000000
--- a/flask/notejam/templates/users/settings.html
+++ /dev/null
@@ -1,16 +0,0 @@
-{% extends "user.html" %}
-{% from "_helpers.html" import render_field %}
-
-{% block title %}Account Settings{% endblock %}
-{% block page_title %}Account Settings{% endblock %}
-
-{% block content %}
-
-{% endblock %}
-
diff --git a/flask/notejam/templates/users/signin.html b/flask/notejam/templates/users/signin.html
deleted file mode 100644
index 58c5e494c..000000000
--- a/flask/notejam/templates/users/signin.html
+++ /dev/null
@@ -1,16 +0,0 @@
-{% extends "user.html" %}
-{% from "_helpers.html" import render_field %}
-
-{% block title %}Sign In{% endblock %}
-{% block page_title %}Sign In{% endblock %}
-
-{% block content %}
-
-{% endblock %}
diff --git a/flask/notejam/templates/users/signup.html b/flask/notejam/templates/users/signup.html
deleted file mode 100644
index 19ae825ac..000000000
--- a/flask/notejam/templates/users/signup.html
+++ /dev/null
@@ -1,16 +0,0 @@
-{% extends "user.html" %}
-{% from "_helpers.html" import render_field %}
-
-{% block title %}Sign Up{% endblock %}
-{% block page_title %}Sign Up{% endblock %}
-
-{% block content %}
-
-{% endblock %}
-
diff --git a/flask/notejam/views.py b/flask/notejam/views.py
deleted file mode 100644
index 0064053b8..000000000
--- a/flask/notejam/views.py
+++ /dev/null
@@ -1,264 +0,0 @@
-from datetime import date
-import hashlib
-
-from flask import render_template, flash, request, redirect, url_for, abort
-from flask_login import (login_user, login_required, logout_user,
-current_user)
-from flask_mail import Message
-
-from notejam import app, db, login_manager, mail
-from notejam.models import User, Note, Pad
-from notejam.forms import (SigninForm, SignupForm, NoteForm, PadForm,
-DeleteForm, ChangePasswordForm, ForgotPasswordForm)
-
-
-@login_manager.user_loader
-def load_user(user_id):
- return User.query.get(user_id)
-
-
-@app.route('/')
-@login_required
-def home():
- notes = (Note.query
- .filter_by(user=current_user)
- .order_by(_get_order_by(request.args.get('order')))
- .all())
- return render_template('notes/list.html', notes=notes)
-
-
-@app.route('/notes/create/', methods=['GET', 'POST'])
-@login_required
-def create_note():
- note_form = NoteForm(user=current_user, pad=request.args.get('pad'))
- if note_form.validate_on_submit():
- note = Note(
- name=note_form.name.data,
- text=note_form.text.data,
- pad_id=note_form.pad.data,
- user=current_user
- )
- db.session.add(note)
- db.session.commit()
- flash('Note is successfully created', 'success')
- return redirect(_get_note_success_url(note))
- return render_template('notes/create.html', form=note_form)
-
-
-@app.route('/notes//edit/', methods=['GET', 'POST'])
-@login_required
-def edit_note(note_id):
- note = _get_user_object_or_404(Note, note_id, current_user)
- note_form = NoteForm(user=current_user, obj=note)
- if note_form.validate_on_submit():
- note.name = note_form.name.data
- note.text = note_form.text.data
- note.pad_id = note_form.pad.data
-
- db.session.commit()
- flash('Note is successfully updated', 'success')
- return redirect(_get_note_success_url(note))
- if note.pad:
- note_form.pad.data = note.pad.id # XXX ?
- return render_template('notes/edit.html', form=note_form)
-
-
-@app.route('/notes//')
-@login_required
-def view_note(note_id):
- note = _get_user_object_or_404(Note, note_id, current_user)
- return render_template('notes/view.html', note=note)
-
-
-@app.route('/notes//delete/', methods=['GET', 'POST'])
-@login_required
-def delete_note(note_id):
- note = _get_user_object_or_404(Note, note_id, current_user)
- delete_form = DeleteForm()
- if request.method == 'POST':
- db.session.delete(note)
- db.session.commit()
- flash('Note is successfully deleted', 'success')
- return redirect(url_for('home'))
- return render_template('notes/delete.html', note=note, form=delete_form)
-
-
-@app.route('/pads/create/', methods=['GET', 'POST'])
-@login_required
-def create_pad():
- pad_form = PadForm()
- if pad_form.validate_on_submit():
- pad = Pad(
- name=pad_form.name.data,
- user=current_user
- )
- db.session.add(pad)
- db.session.commit()
- flash('Pad is successfully created', 'success')
- return redirect(url_for('home'))
- return render_template('pads/create.html', form=pad_form)
-
-
-@app.route('/pads//edit/', methods=['GET', 'POST'])
-@login_required
-def edit_pad(pad_id):
- pad = _get_user_object_or_404(Pad, pad_id, current_user)
- pad_form = PadForm(obj=pad)
- if pad_form.validate_on_submit():
- pad.name = pad_form.name.data
- db.session.commit()
- flash('Pad is successfully updated', 'success')
- return redirect(url_for('pad_notes', pad_id=pad.id))
- return render_template('pads/edit.html', form=pad_form, pad=pad)
-
-
-@app.route('/pads//')
-@login_required
-def pad_notes(pad_id):
- pad = _get_user_object_or_404(Pad, pad_id, current_user)
- notes = (Note.query
- .filter_by(user=current_user, pad=pad)
- .order_by(_get_order_by(request.args.get('order')))
- .all())
- return render_template('pads/note_list.html', pad=pad, notes=notes)
-
-
-@app.route('/pads//delete/', methods=['GET', 'POST'])
-@login_required
-def delete_pad(pad_id):
- pad = _get_user_object_or_404(Pad, pad_id, current_user)
- delete_form = DeleteForm()
- if request.method == 'POST':
- db.session.delete(pad)
- db.session.commit()
- flash('Note is successfully deleted', 'success')
- return redirect(url_for('home'))
- return render_template('pads/delete.html', pad=pad, form=delete_form)
-
-
-# @TODO use macro for form fields in template
-@app.route('/signin/', methods=['GET', 'POST'])
-def signin():
- form = SigninForm()
- if form.validate_on_submit():
- auth_user = User.authenticate(form.email.data, form.password.data)
- if auth_user:
- login_user(auth_user)
- flash('You are signed in!', 'success')
- return redirect(url_for('home'))
- else:
- flash('Wrong email or password', 'error')
- return render_template('users/signin.html', form=form)
-
-
-@app.route('/signout/')
-def signout():
- logout_user()
- return redirect(url_for('signin'))
-
-
-@app.route('/signup/', methods=['GET', 'POST'])
-def signup():
- form = SignupForm()
- if form.validate_on_submit():
- user = User(email=form.email.data)
- user.set_password(form.password.data)
- db.session.add(user)
- db.session.commit()
- flash('Account is created. Now you can sign in.', 'success')
- return redirect(url_for('signin'))
- return render_template('users/signup.html', form=form)
-
-
-@app.route('/settings/', methods=['GET', 'POST'])
-@login_required
-def account_settings():
- form = ChangePasswordForm(user=current_user)
- if form.validate_on_submit():
- current_user.set_password(form.new_password.data)
- db.session.commit()
- flash("Your password is successfully changed.", 'success')
- return redirect(url_for('home'))
- return render_template('users/settings.html', form=form)
-
-
-@app.route('/forgot-password/', methods=['GET', 'POST'])
-def forgot_password():
- form = ForgotPasswordForm()
- if form.validate_on_submit():
- user = User.query.filter_by(email=form.email.data).first()
- new_password = _generate_password(user)
- user.set_password(new_password)
-
- message = Message(
- subject="Notejam password",
- body="Your new password is {}".format(new_password),
- sender="from@notejamapp.com",
- recipients=[user.email]
- )
- mail.send(message)
-
- db.session.commit()
- flash("Find new password in your inbox", 'success')
- return redirect(url_for('home'))
- return render_template('users/forgot_password.html', form=form)
-
-
-# context processors and filters
-@app.context_processor
-def inject_user_pads():
- ''' inject list of user pads in template context '''
- if not current_user.is_anonymous:
- return dict(pads=current_user.pads.all())
- return dict(pads=[])
-
-
-@app.template_filter('smart_date')
-def smart_date_filter(updated_at):
- delta = date.today() - updated_at.date()
- if delta.days == 0:
- return 'Today at {}'.format(updated_at.strftime("%H:%M"))
- elif delta.days == 1:
- return 'Yesterday at {}'.format(updated_at.strftime("%H:%M"))
- elif 1 > delta.days > 4:
- return '{} days ago'.format(abs(delta.days))
- else:
- return updated_at.date()
-
-
-# helper functions, @TODO move to helpers.py?
-def _get_note_success_url(note):
- ''' get note success redirect url depends on note's pad '''
- if note.pad is None:
- return url_for('home')
- else:
- return url_for('pad_notes', pad_id=note.pad.id)
-
-
-def _get_user_object_or_404(model, object_id, user, code=404):
- ''' get an object by id and owner user or raise an abort '''
- result = model.query.filter_by(id=object_id, user=user).first()
- return result or abort(code)
-
-
-def _get_order_by(param='-updated_at'):
- ''' get model order param by string description '''
- return {
- 'name': Note.name.asc(),
- '-name': Note.name.desc(),
- 'updated_at': Note.updated_at.asc(),
- '-updated_at': Note.updated_at.desc(),
- }.get(param, Note.updated_at.desc())
-
-
-def _generate_password(user):
- ''' generate new user password '''
- m = hashlib.md5()
- m.update(
- "{email}{secret}{date}".format(
- email=user.email,
- secret=app.secret_key,
- date=str(date.today())
- )
- )
- return m.hexdigest()[:8]
diff --git a/flask/notejam/wsgi.py b/flask/notejam/wsgi.py
deleted file mode 100644
index 83370f350..000000000
--- a/flask/notejam/wsgi.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from notejam import app as application
-from notejam.config import DevelopmentConfig
-
-application.config.from_object(DevelopmentConfig)
-
-if __name__ == '__main__':
- application.run()
diff --git a/flask/requirements.txt b/flask/requirements.txt
deleted file mode 100644
index 55908cf95..000000000
--- a/flask/requirements.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-Flask==1.1.1
-Flask-Login==0.4.1
-Flask-Mail==0.9.1
-Flask-SQLAlchemy==2.4.1
-Flask-Testing==0.6.1
-Flask-WTF==0.14.2
-Jinja2==2.10.3
-SQLAlchemy==1.3.10
-Tempita==0.5.2
-WTForms==2.2.1
-Werkzeug==0.16.0
-blinker==1.4
-decorator==4.4.1
-ipython==5.8.0
-sqlalchemy-migrate==0.13.0
diff --git a/flask/runserver.py b/flask/runserver.py
deleted file mode 100755
index 6cb3c5663..000000000
--- a/flask/runserver.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from notejam import app
-from notejam.config import DevelopmentConfig
-
-app.config.from_object(DevelopmentConfig)
-
-if __name__ == '__main__':
- app.run()
diff --git a/flask/tests.py b/flask/tests.py
deleted file mode 100644
index b5fcf6aef..000000000
--- a/flask/tests.py
+++ /dev/null
@@ -1,336 +0,0 @@
-import os
-import tempfile
-import unittest
-import urllib.parse
-
-from contextlib import contextmanager
-
-from flask import url_for
-from flask_testing import TestCase
-
-from notejam import app, db
-from notejam.config import TestingConfig
-from notejam.models import User, Pad, Note
-
-app.config.from_object(TestingConfig)
-
-
-class NotejamBaseTestCase(TestCase):
- def setUp(self):
- db.create_all()
-
- def tearDown(self):
- db.session.remove()
- db.drop_all()
- os.close(self.fd)
- os.unlink(self.db)
-
- def create_app(self):
- self.fd, self.db = tempfile.mkstemp()
- test_app = app
- test_app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///" + self.db
- test_app.config['TESTING'] = True
- test_app.config['CSRF_ENABLED'] = False
- return test_app
-
- def create_user(self, **kwargs):
- user = User(email=kwargs['email'])
- user.set_password(kwargs['password'])
- db.session.add(user)
- db.session.commit()
- return user
-
- def create_pad(self, **kwargs):
- pad = Pad(**kwargs)
- db.session.add(pad)
- db.session.commit()
- return pad
-
- def create_note(self, **kwargs):
- note = Note(**kwargs)
- db.session.add(note)
- db.session.commit()
- return note
-
-
-class SignupTestCase(NotejamBaseTestCase):
- def _get_user_data(self, **kwargs):
- user_data = {
- 'email': 'email@example.com',
- 'password': 'secure_password',
- 'repeat_password': 'secure_password'
- }
- user_data.update(**kwargs)
- return user_data
-
- def test_signup_success(self):
- response = self.client.post(
- url_for("signup"), data=self._get_user_data())
- self.assertRedirects(response, url_for('signin'))
- self.assertEqual(1, User.query.count())
-
- def test_signup_fail_required_fields(self):
- self.client.post(url_for("signup"), data={})
- self.assertEqual(
- set(self._get_user_data().keys()),
- set(self.get_context_variable('form').errors.keys())
- )
-
- def test_signup_fail_email_exists(self):
- data = self._get_user_data()
- self.create_user(**data)
-
- self.client.post(url_for("signup"), data=self._get_user_data())
- self.assertEqual(
- ['email'], list(self.get_context_variable('form').errors.keys()))
-
- def test_signup_fail_invalid_email(self):
- data = self._get_user_data()
- data['email'] = 'invalid email'
-
- self.client.post(url_for("signup"), data=data)
- self.assertEqual(
- ['email'], list(self.get_context_variable('form').errors.keys()))
-
- def test_signup_fail_passwords_dont_match(self):
- invalid_data = self._get_user_data(password='another pass')
- self.client.post(url_for('signup'), data=invalid_data)
- self.assertEqual(
- ['repeat_password'],
- list(self.get_context_variable('form').errors.keys())
- )
-
-
-class SigninTestCase(NotejamBaseTestCase):
- def _get_user_data(self, **kwargs):
- user_data = {
- 'email': 'email@example.com',
- 'password': 'secure_password'
- }
- user_data.update(**kwargs)
- return user_data
-
- def test_signin_success(self):
- data = self._get_user_data()
- self.create_user(**data)
-
- response = self.client.post(url_for('signin'), data=data)
- self.assertRedirects(response, url_for('home'))
-
- def test_signin_fail(self):
- response = self.client.post(
- url_for('signin'), data=self._get_user_data())
- self.assertIn('Wrong email or password', str(response.data))
-
- def test_signin_fail_required_fields(self):
- self.client.post(url_for("signin"), data={})
- self.assertEqual(
- set(self._get_user_data().keys()),
- set(self.get_context_variable('form').errors.keys())
- )
-
- def test_signup_fail_invalid_email(self):
- data = self._get_user_data()
- data['email'] = 'invalid email'
-
- self.client.post(url_for("signin"), data=data)
- self.assertEqual(
- ['email'], list(self.get_context_variable('form').errors.keys()))
-
-
-class PadTestCase(NotejamBaseTestCase):
-
- def test_create_success(self):
- user = self.create_user(email='email@example.com', password='password')
- with signed_in_user(user) as c:
- response = c.post(url_for('create_pad'), data={'name': 'pad'})
- self.assertRedirects(response, '/')
- self.assertEqual(1, Pad.query.count())
-
- def test_create_fail_required_name(self):
- user = self.create_user(email='email@example.com', password='password')
- with signed_in_user(user) as c:
- c.post(url_for('create_pad'), data={})
- self.assertEqual(
- ['name'], list(self.get_context_variable('form').errors.keys()))
-
- def test_create_fail_anonymous_user(self):
- response = self.client.post(
- url_for('create_pad'), data={'name': 'pad'})
- self.assertRedirects(
- response,
- "{signin}?next={redirect_to}".format(
- signin=url_for('signin'), redirect_to=urllib.parse.quote(
- url_for('create_pad'), ''))
- )
-
- def test_edit_success(self):
- user = self.create_user(email='email@example.com', password='password')
- pad = self.create_pad(name='pad', user=user)
- with signed_in_user(user) as c:
- new_name = 'new pad name'
- response = c.post(
- url_for('edit_pad', pad_id=pad.id), data={'name': new_name})
- self.assertRedirects(response, url_for('pad_notes', pad_id=pad.id))
- self.assertEqual(new_name, Pad.query.get(pad.id).name)
-
- def test_edit_fail_required_name(self):
- user = self.create_user(email='email@example.com', password='password')
- pad = self.create_pad(name='pad', user=user)
- with signed_in_user(user) as c:
- c.post(url_for('edit_pad', pad_id=pad.id), data={'name': ''})
- self.assertEqual(
- ['name'], list(self.get_context_variable('form').errors.keys()))
-
- def test_edit_fail_anothers_user(self):
- user = self.create_user(email='email@example.com', password='password')
- pad = self.create_pad(name='pad', user=user)
- another_user = self.create_user(
- email='another@example.com', password='password')
- with signed_in_user(another_user) as c:
- new_name = 'new pad name'
- response = c.post(
- url_for('edit_pad', pad_id=pad.id), data={'name': new_name})
- self.assertEqual(404, response.status_code)
-
- def test_delete_success(self):
- user = self.create_user(email='email@example.com', password='password')
- pad = self.create_pad(name='pad', user=user)
- with signed_in_user(user) as c:
- response = c.post(
- url_for('delete_pad', pad_id=pad.id))
- self.assertRedirects(response, url_for('home'))
- self.assertEqual(0, Pad.query.count())
-
- def test_delete_fail_anothers_user(self):
- user = self.create_user(email='email@example.com', password='password')
- pad = self.create_pad(name='pad', user=user)
- another_user = self.create_user(
- email='another@example.com', password='password')
- with signed_in_user(another_user) as c:
- response = c.post(
- url_for('delete_pad', pad_id=pad.id))
- self.assertEqual(404, response.status_code)
-
-
-class NoteTestCase(NotejamBaseTestCase):
- def _get_note_data(self, **kwargs):
- note_data = {
- 'name': 'note', 'pad': 0, 'text': 'text'
- }
- note_data.update(**kwargs)
- return note_data
-
- def test_create_success(self):
- user = self.create_user(email='email@example.com', password='password')
- with signed_in_user(user) as c:
- response = c.post(
- url_for('create_note'), data=self._get_note_data())
- self.assertRedirects(response, '/')
- self.assertEqual(1, Note.query.count())
-
- def test_create_fail_required_fields(self):
- user = self.create_user(email='email@example.com', password='password')
- with signed_in_user(user) as c:
- c.post(url_for('create_note'), data={})
- self.assertEqual(
- set(self._get_note_data().keys()),
- set(self.get_context_variable('form').errors.keys())
- )
-
- def test_create_fail_anothers_pad(self):
- user = self.create_user(email='email@example.com', password='password')
- another_user = self.create_user(
- email='another@example.com', password='password')
- pad = self.create_pad(name='pad', user=another_user)
- with signed_in_user(user) as c:
- c.post(
- url_for('create_note'), data=self._get_note_data(pad=pad.id))
- self.assertEqual(
- ['pad'], list(self.get_context_variable('form').errors.keys())
- )
-
- def test_create_fail_anonymous_user(self):
- response = self.client.post(
- url_for('create_note'), data=self._get_note_data())
- self.assertRedirects(
- response,
- "{signin}?next={redirect_to}".format(
- signin=url_for('signin'), redirect_to=urllib.parse.quote(
- url_for('create_note'), ''))
- )
-
- def test_edit_success(self):
- user = self.create_user(email='email@example.com', password='password')
- note_data = {'name': 'note', 'text': 'text', 'user': user}
- note = self.create_note(**note_data)
- with signed_in_user(user) as c:
- new_name = 'new pad name'
- c.post(
- url_for('edit_note', note_id=note.id),
- data=self._get_note_data(name=new_name)
- )
- self.assertEqual(new_name, Note.query.get(note.id).name)
-
- def test_edit_fail_required_fields(self):
- user = self.create_user(email='email@example.com', password='password')
- note_data = {'name': 'note', 'text': 'text', 'user': user}
- note = self.create_note(**note_data)
- with signed_in_user(user) as c:
- c.post(
- url_for('edit_note', note_id=note.id),
- data={'pad': '', 'name': '', 'text': ''}
- )
- self.assertEqual(
- set(self._get_note_data().keys()),
- set(self.get_context_variable('form').errors.keys())
- )
-
- def test_edit_fail_anothers_user(self):
- user = self.create_user(email='email@example.com', password='password')
- note_data = {'name': 'note', 'text': 'text', 'user': user}
- note = self.create_note(**note_data)
- another_user = self.create_user(
- email='another@example.com', password='password')
- with signed_in_user(another_user) as c:
- response = c.post(
- url_for('edit_note', note_id=note.id), data={})
- self.assertEqual(404, response.status_code)
-
- def test_delete_success(self):
- user = self.create_user(email='email@example.com', password='password')
- note = self.create_note(name='note', text='text', user=user)
- with signed_in_user(user) as c:
- response = c.post(
- url_for('delete_note', note_id=note.id))
- self.assertRedirects(response, url_for('home'))
- self.assertEqual(0, Note.query.count())
-
- def test_delete_fail_anothers_user(self):
- user = self.create_user(email='email@example.com', password='password')
- note = self.create_note(name='note', text='text', user=user)
- another_user = self.create_user(
- email='another@example.com', password='password')
- with signed_in_user(another_user) as c:
- response = c.post(
- url_for('delete_note', note_id=note.id))
- self.assertEqual(404, response.status_code)
-
-
-@contextmanager
-def signed_in_user(user):
- '''
- Signed in user context
- Usage:
- user = get_user()
- with signed_in_user(user) as c:
- response = c.get(...)
- '''
- with app.test_client() as c:
- with c.session_transaction() as sess:
- sess['user_id'] = user.id
- sess['_fresh'] = True
- yield c
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/html/account-settings.html b/html/account-settings.html
deleted file mode 100644
index f4c90b375..000000000
--- a/html/account-settings.html
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
-
-
-
-
-
- Notejam: Account Settings
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/html/alerts-and-errors.html b/html/alerts-and-errors.html
deleted file mode 100644
index ffd621420..000000000
--- a/html/alerts-and-errors.html
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
- Notejam: Alerts and errors
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Everything is OK
-
Something is wrong
-
-
-
-
-
-
-
-
-
diff --git a/html/create-pad.html b/html/create-pad.html
deleted file mode 100644
index 431ea2a9d..000000000
--- a/html/create-pad.html
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
-
-
- Notejam: New pad
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/html/create.html b/html/create.html
deleted file mode 100644
index 71ed1af73..000000000
--- a/html/create.html
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
-
-
-
-
-
-
-
- Notejam: New note
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/html/css/style.css b/html/css/style.css
deleted file mode 100644
index 76326fc39..000000000
--- a/html/css/style.css
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
-* Skeleton V1.0.3
-* Copyright 2011, Dave Gamache
-* www.getskeleton.com
-* Free to use under the MIT license.
-* http://www.opensource.org/licenses/mit-license.php
-* 7/17/2011
-*/
-
-
-/* Documentation Styles
-================================================== */
- div.container {
- padding-top: 40px; }
-
- /* Doc nav */
- nav {
- width: 160px; }
- #logo, .bold-header {
- margin-bottom: 30px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- letter-spacing: -1px;
- color: #555;
- font-weight: bold; }
- .bold-header span {
- font-weight: normal;
- font-size: 23px;
- }
- .bold-header a.header {
- text-decoration: none;
- color: inherit;
- }
- .bold-header span.jam {
- font-size: 46px;
- line-height: 50px;
- }
- nav ul {
- float: left; }
- nav ul li {
- display: block;
- margin-bottom: 10px; }
- nav ul li a,
- nav ul li a:visited,
- nav ul li a:active {
- font-size: 14px;
- color: #555;
- text-decoration: none;
- font-weight: bold; }
- nav ul li a:hover,
- nav ul li a:focus {
- color: #222; }
- header h1 {
- font-size: 52px;
- line-height: 61px;
- letter-spacing: -1px;
- font-weight: normal;
- font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; }
- hr.large {
- border: none;
- height: 8px;
- background: #ebebeb;
- margin: 50px 0; }
- div.doc-section {
- margin: 30px 0; }
-
- #whatAndWhy .row {
- padding: 30px 0 0; }
-
- #typography blockquote {
- margin-top: 20px; }
-
- .hidden-code a {
- font-size: 12px;
- color: #999; }
- .hidden-code>div {
- display: none; }
-
-
- /* Grid */
- #grid .column,
- #grid .columns {
- background: #ddd;
- height: 25px;
- line-height: 25px;
- margin-bottom: 10px;
- text-align: center;
- text-transform: uppercase;
- color: #555;
- font-size: 12px;
- font-weight: bold;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border-radius: 2px; }
- #grid .column:hover,
- #grid .columns:hover {
- background: #bbb;
- color: #333; }
- #grid .example-grid { overflow: hidden; }
-
- .post-button-note,
- .post-button-note a {
- font-size: 11px;
- color: #999; }
-
- #examples .four.columns a {
- text-decoration: none;
- }
- #examples .four.columns a:hover {
- text-decoration: underline;
- }
-
-
- .resize {
- position: fixed;
- bottom: 0;
- right: 0;
- height: 80px;
- width: 80px;
- background: url(images/resize.png); }
-
-
- img {
- max-width: 100%;
- height: auto; }
-
- .gist-meta { display: none !important;}
-
- ul ul ul li { margin-bottom: 3px; }
-
- .twitter-share-button { margin-bottom: -18px; }
-
- /* Table stylesheets */
- table {
- width: 100%;
- border-collapse: collapse;
- }
-
- table th, table td {
- padding: 10px 10px 9px;
- font-size: 13px;
- line-height: 18px;
- text-align: left;
- }
-
- table td {
- vertical-align: top;
- border-top: solid 1px #ddd;
- }
-
- table th {
- padding-top: 9px;
- font-weight: bold;
- vertical-align: middle;
- }
-
- table.condensed th, table.condensed td {
- padding: 5px 5px 4px;
- }
-
- table.bordered {
- border-collapse: separate;
- border: solid 1px #ddd;
- -webkit-border-radius: 2px;
- -moz-border-radius: 2px;
- border-radius: 2px;
- }
-
- table.bordered th + th,
- table.bordered th + td,
- table.bordered td + td {
- border-left: solid 1px #ddd;
- }
-
- .zebra-striped tbody tr:nth-child(odd) td,
- .zebra-striped tbody tr:nth-child(odd) th {
- background: #f5f5f5;
- }
-
-.carbonad,
-.carbonad-image,
-.carbonad-text,
-.carbonad-tag {
- background: none !important;
- border: none !important;
- margin-left: 0 !important;
-}
-.carbonad-tag {
- margin-top: 6px !important;
- padding-top: 0 !important;
-}
-.carbonad-text {
- height: auto !important;
-}
-.carbonad-image {
- margin-top: 0 !important;
-}
-
-.hidden-text {
- font-size: 12px;
- color: #999;
-}
-
-td.date, th.date {
- text-align: right;
-}
-
-td.date {
- font-style: italic;
-}
-
-form.note input[type="text"], form.note textarea {
- width: 100%;
-}
-
-form hr {
- width: 218px;
- margin: 10px 0px;
-}
-
-form.note textarea {
- height: 250px;
-}
-
-div.content-area {
- min-height: 600px;
-}
-
-hr.footer {
- margin-bottom: 10px;
-}
-
-div.footer {
- margin-bottom: 10px;
- text-align: center;
- font-size: 12px;
-}
-
-form.sign-in {
- margin: 50px 0 0 0;
-}
-
-.sort_arrow {
- text-decoration: none;
-}
-
-.sort_arrow:hover {
- text-decoration: none;
- color: red;
-}
-
-div.sign-in-out-block {
- position: absolute;
- right: 14px;
- top: 8px;
- font-size: 12px;
-}
-
-div.sign-in-out-block a {
- /*text-decoration: none;*/
-}
-
-a.small-red {
- color: red;
- font-size: 12px;
-}
-
-table.notes {
- margin: 0 0 20px 0;
-}
-
-table.notes th.note {
- width: 72%;
-}
-
-table.notes td.pad {
- color: grey;
-}
-
-table.notes td.pad a {
- color: grey;
- text-decoration: underline;
- font-style: normal;
-}
-
-
-table.notes td.pad a:hover {
- color: black;
-}
-
-p.empty {
- color: grey;
- font-style: italic;
-}
-
-a.delete-note {
- float: right;
- font-size: 12px;
- color: red;
-}
-
-.red, input.red {
- color: red !important;
-}
-
-ul.errorlist, ul.errors {
- margin: -18px 0 0 0;
-}
-
-ul.errorlist li, ul.errors li {
- color: red;
-}
-
-.alert-area {
- text-align: center;
-}
-
-.alert {
- padding: 5px 8px;
- margin: 0 0 12px 0;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
- border-radius: 2px;
-}
-
-.alert-success {
- color: #468847;
- background-color: #dff0d8;
- border: 1px solid #d6e9c6;
-}
-
-.alert-error {
- color: #b94a48;
- background-color: #f2dede;
- border: 1px solid #eed3d7;
-}
-
-.pagination {
- text-align: center;
-}
-
- /* Mobile */
- @media only screen and (max-width: 767px) {
- header h1 { font-size: 34px; line-height: 37px; }
- nav { position: relative; }
- nav ul,
- .carbonad {
- display: none;
- }
- #logo { text-align: left; }
- #examples .four.columns {
- padding-top: 30px;
- }
- }
-
- /* Mobile Landscape */
- @media only screen and (min-width: 480px) and (max-width: 767px) {
- nav ul {
- display: none;
- }
- }
-
- /* Non 960 */
- @media only screen and (max-width: 959px) {
- #logo {
- font-size: 21px;
- margin-bottom: 15px; }
- nav .button {
- padding: 9px 20px 11px; }
- }
-
- /* iPad Portrait/Browser */
- @media only screen and (min-width: 768px) and (max-width: 959px) {
- nav {
- width: 124px; }
- }
-
- /* Mobile/Browser */
- @media only screen and (max-width: 767px) {}
-
- /* Mobile Landscape/Browser */
- @media only screen and (min-width: 480px) and (max-width: 767px) {}
-
- /* Anything smaller than standard 960 */
- @media only screen and (max-width: 959px) {}
-
-
- /* iPad Portrait Only */
- @media only screen and (min-width: 768px) and (max-width: 959px) and (max-device-width: 1000px) {}
-
- /* Mobile Only */
- @media only screen and (max-width: 767px) and (max-device-width: 1000px) {}
-
- /* Mobile Landscape Only */
- @media only screen and (min-width: 480px) and (max-width: 767px) and (max-device-width: 1000px) {}
-
- /* Anything smaller than standard 960 on a device */
- @media only screen and (max-width: 959px) and (max-device-width: 1000px) {
- .resize { display: none; }
- }
-
diff --git a/html/delete.html b/html/delete.html
deleted file mode 100644
index 44a00fbf8..000000000
--- a/html/delete.html
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
-
-
-
-
-
- Notejam
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/html/edit.html b/html/edit.html
deleted file mode 100644
index b24216c88..000000000
--- a/html/edit.html
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
-
-
-
-
-
- Notejam: My sport
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/html/empty-list.html b/html/empty-list.html
deleted file mode 100644
index d522c16e4..000000000
--- a/html/empty-list.html
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
-
-
- Notejam
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
My pads
-
-
-
-
Create your first note.
-
New note
-
-
-
-
-
-
-
-
diff --git a/html/forgot-password.html b/html/forgot-password.html
deleted file mode 100644
index 95da65c85..000000000
--- a/html/forgot-password.html
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
-
-
-
-
-
- Notejam: Forgot password?
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/html/index.html b/html/index.html
deleted file mode 100644
index 821b25f47..000000000
--- a/html/index.html
+++ /dev/null
@@ -1,121 +0,0 @@
-
-
-
-
-
-
-
-
-
- Notejam
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/html/pad-notes.html b/html/pad-notes.html
deleted file mode 100644
index 280cf518b..000000000
--- a/html/pad-notes.html
+++ /dev/null
@@ -1,117 +0,0 @@
-
-
-
-
-
-
-
-
-
- Notejam: Business (8 notes)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/html/screenshots/1.png b/html/screenshots/1.png
deleted file mode 100644
index b927f5e20a9451037974d3cfff5fec78e3f59026..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 62464
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°7*m4xylb`p;eZS6irtArUp~^z+D?~X`g$5r^
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