├── .coveragerc
├── .editorconfig
├── .gitattributes
├── .gitignore
├── .travis.yml
├── CONTRIBUTING.md
├── CONTRIBUTORS.txt
├── LICENSE
├── Procfile
├── README.md
├── app.json
├── bin
├── post_compile
└── regenerate.sh
├── docs
├── setup.md
└── testing.md
├── gulpfile.js
├── manage.py
├── package.json
├── requirements.txt
├── requirements
├── base.txt
└── dev.txt
├── settings
├── __init__.py
├── common.py
├── dev.sample.py
├── heroku.py
└── testing.py
├── setup.cfg
├── template_certificate.pdf
├── tests
├── __init__.py
├── base.py
├── conftest.py
├── factories.py
├── fixtures.py
├── functional
│ ├── __init__.py
│ ├── student_list_format.xlsx
│ ├── test_add_org_member_flow.py
│ ├── test_contact_page.py
│ ├── test_edit_profile.py
│ ├── test_forgot_password_flow.py
│ ├── test_organsisation_flow.py
│ ├── test_partner_page.py
│ ├── test_regional_lead_flow.py
│ ├── test_reports.py
│ ├── test_student_flow.py
│ ├── test_user_flow.py
│ └── workshop
│ │ ├── test_create_workshop.py
│ │ ├── test_workshop_celery_tasks.py
│ │ ├── test_workshop_flow.py
│ │ └── test_workshop_list.py
├── integration
│ ├── __init__.py
│ └── test_allowed_pages.py
├── unit
│ ├── __init__.py
│ ├── required_asterisk.py
│ └── test_signup_mobile_validation.py
└── utils.py
├── uwsgi.ini
└── wye
├── __init__.py
├── base
├── __init__.py
├── constants.py
├── context_processors.py
├── emailer.py
├── emailer_html.py
├── management
│ ├── __init__.py
│ └── commands
│ │ ├── __init__.py
│ │ └── sample_data.py
├── migrations
│ └── __init__.py
├── models.py
├── views.py
└── widgets.py
├── media
└── images
│ └── newuser.png
├── organisations
├── __init__.py
├── admin.py
├── forms.py
├── migrations
│ ├── 0001_initial.py
│ ├── 0002_auto_20160716_1939.py
│ ├── 0003_auto_20160815_0955.py
│ ├── 0004_organisation_students.py
│ ├── 0005_auto_20171116_1428.py
│ └── __init__.py
├── models.py
├── urls.py
└── views.py
├── profiles
├── __init__.py
├── admin.py
├── forms.py
├── migrations
│ ├── 0001_initial.py
│ ├── 0002_remove_profile_slug.py
│ ├── 0003_auto_20151030_2048.py
│ ├── 0004_auto_20151101_1553.py
│ ├── 0005_auto_20160716_1939.py
│ ├── 0006_auto_20161002_0952.py
│ ├── 0007_auto_20161003_2241.py
│ ├── 0008_auto_20161004_0709.py
│ ├── 0009_auto_20170722_2205.py
│ ├── 0010_auto_20170907_0003.py
│ ├── 0011_auto_20171030_1708.py
│ └── __init__.py
├── models.py
├── urls.py
└── views.py
├── regions
├── __init__.py
├── admin.py
├── forms.py
├── migrations
│ ├── 0001_initial.py
│ └── __init__.py
├── models.py
├── urls.py
└── views.py
├── reports
├── __init__.py
├── admin.py
├── migrations
│ └── __init__.py
├── models.py
├── urls.py
└── views.py
├── social
├── __init__.py
├── migrations
│ └── __init__.py
└── sites
│ ├── __init__.py
│ └── twitter.py
├── static
├── autocomplete.js
├── certificate
│ └── student_list_format.xlsx
├── css
│ ├── app.css
│ ├── fonts
│ │ ├── glyphicons-halflings-regular.eot
│ │ ├── glyphicons-halflings-regular.svg
│ │ ├── glyphicons-halflings-regular.ttf
│ │ ├── glyphicons-halflings-regular.woff
│ │ └── glyphicons-halflings-regular.woff2
│ └── libs
│ │ ├── bootstrap.min.css
│ │ ├── datepicker.css
│ │ ├── justifiedGallery.min.css
│ │ └── nv.d3.min.css
├── datepicker.less
├── img
│ ├── favicon.ico
│ ├── home
│ │ ├── banner.jpg
│ │ ├── host.svg
│ │ ├── partner.svg
│ │ ├── student.svg
│ │ └── teacher.svg
│ ├── logo_python_express.png
│ ├── logo_python_express_monochrome.png
│ ├── supporter
│ │ ├── fsmk.png
│ │ ├── psf-logo-372x84-alpha.png
│ │ └── psf-logo-narrow-256x84-alpha.png
│ └── wye
│ │ ├── favicon.ico
│ │ ├── logo.png
│ │ ├── python_express_logo.pdf
│ │ └── python_express_logo.svg
├── js
│ └── libs
│ │ ├── bootstrap-datepicker.js
│ │ ├── bootstrap.min.js
│ │ ├── d3.min.js
│ │ ├── jquery-2.1.4.min.js
│ │ ├── jquery.justifiedGallery.min.js
│ │ └── nv.d3.min.js
├── lead_create_form.js
└── sass
│ ├── _custom.scss
│ ├── _forms.scss
│ ├── _layout.scss
│ ├── _theme.scss
│ ├── _typography.scss
│ ├── _utils.scss
│ ├── _vars.scss
│ ├── app.scss
│ ├── components
│ ├── _box.scss
│ ├── _button.scss
│ └── _card.scss
│ └── pages
│ ├── _faq.scss
│ └── _home.scss
├── templates
├── 403.html
├── 404.html
├── 500.html
├── about.html
├── account
│ ├── account_inactive.html
│ ├── base.html
│ ├── email.html
│ ├── email
│ │ ├── email_confirmation_message.txt
│ │ ├── email_confirmation_signup_message.txt
│ │ ├── email_confirmation_signup_subject.txt
│ │ ├── email_confirmation_subject.txt
│ │ ├── password_reset_key_message.txt
│ │ └── password_reset_key_subject.txt
│ ├── email_confirm.html
│ ├── email_confirmed.html
│ ├── login.html
│ ├── logout.html
│ ├── messages
│ │ ├── cannot_delete_primary_email.txt
│ │ ├── email_confirmation_sent.txt
│ │ ├── email_confirmed.txt
│ │ ├── email_deleted.txt
│ │ ├── logged_in.txt
│ │ ├── logged_out.txt
│ │ ├── password_changed.txt
│ │ ├── password_set.txt
│ │ ├── primary_email_set.txt
│ │ └── unverified_primary_email.txt
│ ├── password_change.html
│ ├── password_reset.html
│ ├── password_reset_done.html
│ ├── password_reset_from_key.html
│ ├── password_reset_from_key_done.html
│ ├── password_set.html
│ ├── signup.html
│ ├── signup_closed.html
│ ├── snippets
│ │ └── already_logged_in.html
│ ├── verification_sent.html
│ └── verified_email_required.html
├── auth
│ ├── login.html
│ ├── logout.html
│ └── signup.html
├── base.html
├── contact.html
├── email_messages
│ ├── contactus
│ │ ├── message.html
│ │ ├── message.txt
│ │ ├── message_user.html
│ │ └── message_user.txt
│ ├── layout.html
│ ├── organisation
│ │ ├── deactivate_request.html
│ │ ├── deactivate_request.txt
│ │ ├── member_addition_to_user.html
│ │ ├── member_addition_to_user.txt
│ │ ├── new.html
│ │ ├── new.txt
│ │ ├── org_member_addition.html
│ │ └── org_member_addition.txt
│ ├── partner
│ │ ├── message_user.html
│ │ ├── message_user.txt
│ │ ├── partner_message.html
│ │ └── partner_message.txt
│ ├── user
│ │ └── new_user_signup.txt
│ └── workshop
│ │ ├── assign_me
│ │ ├── message.html
│ │ ├── message.txt
│ │ └── subject.txt
│ │ ├── create_workshop
│ │ ├── message.html
│ │ └── message.txt
│ │ ├── feedback_email.html
│ │ ├── feedback_email.txt
│ │ ├── new_workshop.txt
│ │ ├── remainder.html
│ │ ├── remainder.txt
│ │ ├── students
│ │ ├── certificate_created.html
│ │ ├── certificate_created.txt
│ │ ├── welcome.html
│ │ └── welcome.txt
│ │ ├── workshop_intro_email.html
│ │ └── workshop_intro_email.txt
├── error.html
├── faq.html
├── index.html
├── openid
│ ├── base.html
│ └── login.html
├── organisation
│ ├── create.html
│ ├── detail.html
│ ├── edit.html
│ ├── list.html
│ ├── member-add.html
│ └── register_form.html
├── partner.html
├── profile
│ ├── details.html
│ ├── index.html
│ ├── profile_create.html
│ └── update.html
├── regions
│ ├── index.html
│ ├── lead
│ │ ├── create.html
│ │ └── edit.html
│ ├── location
│ │ ├── create.html
│ │ └── edit.html
│ └── state
│ │ ├── create.html
│ │ └── edit.html
├── reports
│ ├── index.html
│ └── workshop_details.html
├── socialaccount
│ ├── authentication_error.html
│ ├── base.html
│ ├── connections.html
│ ├── login_cancelled.html
│ ├── messages
│ │ ├── account_connected.txt
│ │ ├── account_connected_other.txt
│ │ └── account_disconnected.txt
│ ├── signup.html
│ └── snippets
│ │ ├── login_extra.html
│ │ └── provider_list.html
├── supporters.html
├── upcoming.html
├── workshops
│ ├── students
│ │ ├── email_certificate.html
│ │ └── register.html
│ ├── workshop_create.html
│ ├── workshop_detail.html
│ ├── workshop_display.html
│ ├── workshop_feedback.html
│ ├── workshop_list.html
│ └── workshop_update.html
└── workshops_info.html
├── urls.py
├── workshops
├── __init__.py
├── admin.py
├── decorators.py
├── forms.py
├── migrations
│ ├── 0001_initial.py
│ ├── 0002_auto_20151024_1441.py
│ ├── 0003_auto_20151025_0818.py
│ ├── 0004_auto_20151025_1331.py
│ ├── 0005_auto_20151025_1338.py
│ ├── 0006_remove_workshopratingvalues_value.py
│ ├── 0007_auto_20151028_0048.py
│ ├── 0008_auto_20160716_1939.py
│ ├── 0009_auto_20161017_0059.py
│ ├── 0009_workshopratingvalues_feedback_type.py
│ ├── 0010_auto_20161022_1056.py
│ ├── 0011_merge.py
│ ├── 0012_auto_20170212_1701.py
│ ├── 0013_auto_20170617_1409.py
│ ├── 0014_workshop_target_audience.py
│ ├── 0015_auto_20170907_0003.py
│ ├── 0016_auto_20171030_1708.py
│ └── __init__.py
├── mixins.py
├── models.py
├── student_views.py
├── tasks.py
├── templatetags
│ ├── __init__.py
│ ├── workshop_action_button.py
│ └── workshop_display.py
├── urls.py
├── utils.py
└── views.py
└── wsgi.py
/.coveragerc:
--------------------------------------------------------------------------------
1 | [run]
2 | omit = '*tests/*,*commands*,*migrations*,*admin*,*wsgi*'
3 | source = wye/
4 |
5 | [report]
6 | skip_covered = True
7 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://editorconfig.org
2 |
3 | root = true
4 |
5 | [*]
6 | charset = utf-8
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.{py,rst,ini}]
12 | indent_style = space
13 | indent_size = 4
14 |
15 | [*.py]
16 | # https://github.com/timothycrosley/isort/wiki/isort-Settings
17 | line_length=120
18 | known_first_party=wye
19 | multi_line_output=3
20 | default_section=THIRDPARTY
21 |
22 | [*.yml]
23 | indent_style = space
24 | indent_size = 2
25 |
26 | [*.md]
27 | trim_trailing_whitespace = false
28 |
29 | [Makefile]
30 | indent_style = tab
31 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 |
5 | # C extensions
6 | *.so
7 |
8 | # pagedown static files
9 | /wye/assets/collected-static/*
10 |
11 | # local settings
12 | dev.py
13 |
14 | # Distribution / packaging
15 | .Python
16 | env/
17 | venv/
18 | build/
19 | develop-eggs/
20 | dist/
21 | downloads/
22 | eggs/
23 | lib/
24 | lib64/
25 | parts/
26 | sdist/
27 | var/
28 | *.egg-info/
29 | .installed.cfg
30 | *.egg
31 |
32 | # PyInstaller
33 | # Usually these files are written by a python script from a template
34 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
35 | *.manifest
36 | *.spec
37 |
38 | # Installer logs
39 | pip-log.txt
40 | pip-delete-this-directory.txt
41 |
42 | # Unit test / coverage reports
43 | htmlcov/
44 | .tox/
45 | .coverage
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 |
50 | # Splinter Screenshots
51 | tests.*
52 |
53 | # Translations
54 | *.mo
55 | *.pot
56 |
57 | # Django stuff:
58 | *.log
59 |
60 | # Sphinx documentation
61 | docs/_build/
62 |
63 | # PyBuilder
64 | target/
65 |
66 | # PyDev
67 | .metadata
68 | .settings
69 | .project
70 | .pydevproject
71 |
72 | # SQLite DB
73 | db.sqlite3
74 |
75 | # Logs
76 | debug.log
77 |
78 | # Local Media Files
79 | .media/
80 |
81 | #npm dependencies
82 | node_modules/
83 |
84 | #Sourcemap files
85 | *.map
86 |
87 | # VIM
88 | [._]*.s[a-w][a-z]
89 | [._]s[a-w][a-z]
90 | *.un~
91 | Session.vim
92 | .netrwhist
93 | *~
94 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: python
2 | sudo: false
3 | python:
4 | - '3.5'
5 |
6 | addons:
7 | postgresql: "9.4"
8 |
9 | cache:
10 | directories:
11 | - $HOME/.cache/pip
12 |
13 |
14 | install:
15 | - pip install pip==9.0.1
16 | - pip install -r requirements/dev.txt
17 | - pip install coveralls
18 |
19 | env:
20 | - DJANGO_SETTINGS_MODULE="settings.testing"
21 |
22 | script:
23 | - flake8
24 | - py.test --splinter-webdriver=phantomjs --cov -v --tb=native
25 | - coverage report -m
26 |
27 | after_success:
28 | coveralls
29 |
30 |
31 | notifications:
32 | email:
33 | on_success: change # [always|never|change]
34 | on_failure: always # [always|never|change]
35 |
36 | services:
37 | - redis-server
38 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | All contributions are much welcome and greatly appreciated! Expect to be credited for your effort.
4 |
5 |
6 | ## General
7 |
8 | Generally try to limit the scope of any Pull Request to an atomic update if possible. This way, it's much easier to assess and review your changes.
9 |
10 | You should expect a considerably faster turn around if you submit two or more PRs instead of baking them all into one major PR.
11 |
12 |
13 | ## Pull Request Guidelines
14 |
15 | Before you submit a pull request, check that it meets these guidelines:
16 |
17 | 1. All the pull requests are made against `master` branch.
18 |
19 | 2. The pull request should include tests.
20 | 3. The pull request should include description about test cases.
21 | 4. If the pull request adds functionality, the docs should be updated. Put your new functionality into a function with a docstring, and add the feature to the list in README.md.
22 | 5. The pull request containing UI changes should have screen shots.
23 | 6. If you are already not added to `CONTRIBUTORS.txt`, please add yourself in :)
24 |
25 | ## Conventions
26 |
27 | - Read and pay attention to current code in the repository
28 | - For the Python part, we follow pep8 in most cases. We use [`flake8`](http://flake8.readthedocs.org/en/latest/) to check for linting errors. Once you're ready to commit changes, check your code with `flake8` with this command -
29 |
30 | flake8 --max-complexity=24 --statistics --benchmark --ignore=E5,F4 /
31 |
32 | If there is any error, fix it and then commit.
33 |
34 | - For the Django part, we follow standard [Django coding style](https://docs.djangoproject.com/en/1.8/internals/contributing/writing-code/coding-style/).
35 |
36 | - If you are changing/creating any model, use `./manage.py makemigrations ` to generate the migrations. Send PR. Let other's review the models.
37 |
38 | - And always remember the Zen.
39 |
--------------------------------------------------------------------------------
/CONTRIBUTORS.txt:
--------------------------------------------------------------------------------
1 | Code Contributors
2 | =================
3 |
4 | Vijay Bung (gh:vnbang2003 / @vnbang2003) *
5 | Deshraj Yadav (gh:DESHRAJ )
6 | shanki (gh:shankig )
7 | Saurabh Kumar (gh:theskumar)*
8 | Kracekumar Ramaraj (gh: kracekumar)*
9 | Haris Ibrahim K. V. (gh: harisibrahimkv)
10 |
11 |
12 | * Possesses commit rights
13 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014-15 Python Software Society of India
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: uwsgi uwsgi.ini
2 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Wye",
3 | "description": "Wye is a platform to help organisations(Colleges/FOSS) connect to experienced tutors.",
4 | "repository": "https://github.com/pythonindia/wye/",
5 | "keywords": ["python", "django", "teaching", "colleges"],
6 | "scripts": {
7 | "postdeploy": "python manage.py migrate"
8 | },
9 | "addons": [
10 | "heroku-postgresql"
11 | ],
12 | "buildpacks": [
13 | {
14 | "url": "https://github.com/heroku/heroku-buildpack-python"
15 | }
16 | ]
17 | }
18 |
--------------------------------------------------------------------------------
/bin/post_compile:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Run Django migrations.
4 | ./manage.py migrate
5 |
--------------------------------------------------------------------------------
/bin/regenerate.sh:
--------------------------------------------------------------------------------
1 | echo "-> Drop Database"
2 | dropdb wye
3 |
4 | echo "-> Create Database"
5 | createdb wye
6 |
7 | echo "-> Run migrations"
8 | python manage.py migrate
9 |
10 | echo "-> Add sample data"
11 | python manage.py sample_data
12 |
--------------------------------------------------------------------------------
/docs/setup.md:
--------------------------------------------------------------------------------
1 | # Step-by-Step Guide
2 |
3 | Follow this guide to setup your development machine.
4 |
5 | 1. Install [git], [postgresql] and [virtualenv], in your computer, if you don't have it already.
6 | 2. Ensure that python3-dev and libpq are installed on your system.
7 |
8 | ```shell
9 | # if you are using a debian based os for development run:
10 | sudo apt-get install -y python3-dev python3-pip libpq-dev libjpeg-dev
11 | ```
12 |
13 | 3. Get the source code on your machine via git.
14 |
15 | ```shell
16 | git clone https://github.com/pythonindia/wye.git
17 | ```
18 |
19 | 4. Create an isolated python 3 environment and install python dependencies.
20 |
21 | ```shell
22 | cd wye
23 | virtualenv -p $(which python3) venv
24 | source venv/bin/activate # run this command everytime before working on project
25 | pip install -r requirements/dev.txt
26 | ```
27 |
28 | 5. Copy over `settings/dev.sample.py` to `settings/dev.py`.
29 |
30 | ```
31 | cp settings/dev.sample.py settings/dev.py
32 | ```
33 |
34 | 6. Change credential in setting/dev.py
35 |
36 | ```
37 | nano settings/dev.py
38 | ```
39 | For new postgresql user
40 |
41 | USER: "postgres";PASSWORD: ""
42 |
43 | 7. Create an empty postgres database and run database migration.
44 |
45 | ```
46 | createdb wye
47 | python manage.py migrate
48 | python manage.py sample_data
49 | ```
50 |
51 | 8. That's it. Now you can run development server and open the site admin at http://localhost:8000/django-admin/ (initial creds: admin / 123123)
52 |
53 | ```
54 | python manage.py runserver
55 | ```
56 |
57 |
58 | [git]: https://git-scm.com/downloads
59 | [virtualenv]: https://virtualenv.pypa.io/
60 | [postgresql]: http://www.postgresql.org/download/
61 |
--------------------------------------------------------------------------------
/docs/testing.md:
--------------------------------------------------------------------------------
1 | # Testing
2 |
3 | - Read existing tests inside `/tests/` folder to get an idea of how the tests are organized.
4 | - Get yourself familiar with `[fixtures]` & `[factories]`. They are your friend.
5 | - Read https://splinter.readthedocs.org/en/latest/api/driver-and-element-api.html to get your self with all the methods available with `browser` fixture. You must include `base_url` fixture, in your test cases to start a Live Test Server.
6 |
7 | [fixtures]: https://pytest.org/latest/fixture.html
8 | [factories]: https://factoryboy.readthedocs.org
9 |
10 | ## Run tests partially
11 |
12 | ```shell
13 | py.test tests/unit # Will only the tests inside tests/unit folder
14 | py.test tests/unit/tests/app_model.py # Will only test inside app_model.py
15 | ```
16 |
17 | This approach will reduce your testing time, while you are writing a new feature or fixing a bug. Once your sure, the test in a particular section is passing you can run all the test with `py.test`.
18 |
19 |
20 | ## Run test with html coverage report
21 |
22 | ```
23 | py.test --cov-report=html --cov
24 | ```
25 |
26 | Open `htmlcov/index.html` in your browser to see all the lines that are not getting covered during testing. Try to increase the overall percentage of test coverage in the project.
27 |
28 | ## Faster browser test with headless browser
29 |
30 | ```
31 | py.test --splinter-webdriver=phantomjs
32 | ```
33 |
34 | Functional test with selenium using Firefox can be quiet time consuming. You can install [phantomjs](http://phantomjs.org/download.html) and use `--splinter-webdriver=phantomjs` parameter with `py.test`. Checkout all the parameters available at https://github.com/pytest-dev/pytest-splinter#command-line-options
35 |
36 |
37 | ## Use `pdb` while testing
38 |
39 | ```
40 | py.test --pdb
41 | ```
42 |
43 | Whenever a test fails, it will drop you into into a interactive python debugger where you can inspect the local variable and step into codebase.
44 |
45 | Always obey the testing goat!
46 |
--------------------------------------------------------------------------------
/gulpfile.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | var gulp = require('gulp');
3 | var sass = require('gulp-sass');
4 | var minifycss = require('gulp-minify-css');
5 | var autoprefixer = require('gulp-autoprefixer');
6 | var sourcemaps = require('gulp-sourcemaps');
7 |
8 | var paths = {
9 | sass: 'wye/static/sass/**/*.scss',
10 | css: 'wye/static/css'
11 | };
12 |
13 | gulp.task('css', function() {
14 | return gulp.src(paths.sass)
15 | .pipe(sourcemaps.init())
16 | .pipe(sass()
17 | .on('error', sass.logError))
18 | .pipe(autoprefixer({
19 | browsers: ['> 1%']
20 | }))
21 | .pipe(minifycss({
22 | debug: true
23 | }))
24 | .pipe(sourcemaps.write('.'))
25 | .pipe(gulp.dest(paths.css));
26 | });
27 |
28 | gulp.task('watch', function() {
29 | gulp.watch(paths.sass, ['css']);
30 | });
31 |
32 | gulp.task('default', ['watch']);
33 |
--------------------------------------------------------------------------------
/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | import os
3 | import sys
4 |
5 | if __name__ == "__main__":
6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
7 |
8 | from django.core.management import execute_from_command_line
9 |
10 | execute_from_command_line(sys.argv)
11 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "wye",
3 | "version": "0.0.1",
4 | "description": "wye is the platform to help organisations(Colleges/FOSS) connect to expereinced tutors which will benefit number of students to learn Python and real time use of Python in different domains.",
5 | "directories": {
6 | "doc": "docs"
7 | },
8 | "repository": {
9 | "type": "git",
10 | "url": "git+https://github.com/pythonindia/wye.git"
11 | },
12 | "author": "pythonindia",
13 | "license": "MIT",
14 | "bugs": {
15 | "url": "https://github.com/pythonindia/wye/issues"
16 | },
17 | "homepage": "https://github.com/pythonindia/wye#readme",
18 | "devDependencies": {
19 | "gulp": "^3.9.0",
20 | "gulp-autoprefixer": "^3.1.0",
21 | "gulp-minify-css": "^1.2.1",
22 | "gulp-sass": "^2.0.4",
23 | "gulp-sourcemaps": "^1.6.0"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | # Import from base.txt
2 | -r requirements/base.txt
3 |
4 | # For server.
5 | # -------------------------------
6 | uwsgi==2.0.*
7 | dj-database-url==0.3.*
8 |
9 | # this file in this path is required for python buildpack.
10 |
--------------------------------------------------------------------------------
/requirements/base.txt:
--------------------------------------------------------------------------------
1 | # python==3.5.0
2 | Django==1.8.11
3 | django-braces==1.8.1
4 |
5 | # Utilities
6 | # --------------------------------------
7 | unicode-slugify==0.1.3
8 |
9 | # Persistent Store
10 | # --------------------------------------
11 | psycopg2==2.7.3
12 |
13 | # Rest FrameWork
14 | #---------------------------------------
15 | djangorestframework==3.2.4
16 | django-filter==0.13.0
17 | django-allauth==0.25.2
18 |
19 | # MarkDown Support
20 | # ---------------------------------------
21 | Markdown==2.6.5
22 |
23 | # Sample Data
24 | # -----------------------------------------
25 | fake-factory==0.5.7
26 |
27 | # Twitter Connect
28 | # ---------------------------------------
29 | twython==3.3.0
30 |
31 | #AutoComplete
32 | #------------------------------------------
33 | django-autocomplete-light==3.1.3
34 |
35 | # Image
36 | # ----------------------------------------
37 | Pillow==3.1.1
38 |
39 | # Dateutils
40 | #-----------------------------------------
41 | python-dateutil==2.5.0
42 |
43 | # Captcha
44 | #-----------------------------------------
45 | django-simple-math-captcha==1.0.7
46 |
47 | # Celery
48 | # --------------------------------------------------
49 | celery==3.1.23
50 | django-celery==3.1.17
51 | redis==2.10.5
52 |
53 | # Pdf
54 | # --------------------------------------------------
55 | xlrd==1.1.0
56 | reportlab==3.4.0
57 | PyPDF2==1.26.0
58 | # --------------------------------------------------
59 | # Graph
60 | django-pandas==0.4.5
61 | pandas==0.20.3
62 |
--------------------------------------------------------------------------------
/requirements/dev.txt:
--------------------------------------------------------------------------------
1 | # Import from base.txt
2 | -r base.txt
3 |
4 | # Debugging
5 | # -------------------------------------------------
6 | django-extensions==1.5.2
7 | ipython==4.0.0
8 |
9 |
10 | # Testing
11 | # -------------------------------------------------
12 | pytest-django==2.9.*
13 | pytest-cov==2.2.*
14 | pytest-splinter==1.7.*
15 | factory_boy==2.5.*
16 | pdbpp==0.8.*
17 | fancycompleter==0.4
18 |
19 | coverage==4.*
20 | flake8==2.4.*
21 |
--------------------------------------------------------------------------------
/settings/__init__.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | import sys
3 |
4 | if "test" in sys.argv:
5 | print("\033[1;91mNo django tests.\033[0m")
6 | print("Try: \033[1;33mpy.test\033[0m")
7 | sys.exit(0)
8 |
9 | from .common import * # noqa
10 |
11 | try:
12 | from .dev import * # noqa
13 | except ImportError:
14 | pass
15 |
16 | try:
17 | from .prod import * # noqa
18 | except ImportError:
19 | pass
20 |
21 | # heroku
22 | if 'DYNO' in os.environ:
23 | from .heroku import * # noqa
24 |
--------------------------------------------------------------------------------
/settings/dev.sample.py:
--------------------------------------------------------------------------------
1 | # Database
2 | # https://docs.djangoproject.com/en/1.8/ref/settings/#databases
3 |
4 | DEBUG = True
5 |
6 | DATABASES = {
7 | 'default': {
8 | 'ENGINE': 'django.db.backends.postgresql_psycopg2',
9 | 'NAME': "wye",
10 | 'USER': "",
11 | 'PASSWORD': "",
12 | 'HOST': "localhost",
13 | 'PORT': "5432",
14 | }
15 | }
16 |
17 | # E-Mail Settings
18 | EMAIL_HOST = 'localhost'
19 | EMAIL_PORT = 1025
20 | EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
21 |
22 | ACCOUNT_DEFAULT_HTTP_PROTOCOL = 'http'
23 |
--------------------------------------------------------------------------------
/settings/heroku.py:
--------------------------------------------------------------------------------
1 | import dj_database_url
2 |
3 | DATABASES = {
4 | 'default': dj_database_url.config()
5 | }
6 |
7 | ALLOWED_HOSTS = ['.herokuapp.com']
8 |
--------------------------------------------------------------------------------
/settings/testing.py:
--------------------------------------------------------------------------------
1 | from .common import * # noqa
2 |
3 | DEBUG = True
4 |
5 | SECRET_KEY = 'changeme!!'
6 |
7 | DATABASES = {
8 | 'default': {
9 | 'ENGINE': 'django.db.backends.postgresql_psycopg2',
10 | 'NAME': "wye",
11 | 'USER': "",
12 | 'PASSWORD': "",
13 | 'HOST': "localhost",
14 | 'PORT': "5432",
15 | }
16 | }
17 |
18 | # E-Mail Settings
19 | EMAIL_HOST = 'localhost'
20 | EMAIL_PORT = 1025
21 | EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
22 |
23 | ACCOUNT_DEFAULT_HTTP_PROTOCOL = 'http'
24 |
--------------------------------------------------------------------------------
/setup.cfg:
--------------------------------------------------------------------------------
1 | [flake8]
2 | max-line-length = 120
3 | exclude = .tox,.git,*/migrations/*,*/static/CACHE/*,docs,venv
4 |
5 | [pytest]
6 | DJANGO_SETTINGS_MODULE = settings.testing
7 | addopts = --reuse-db
8 | norecursedirs = .tox .git */migrations/* */static/* docs venv
9 |
10 | [coverage:run]
11 | source = junction/
12 | omit =
13 | *tests*
14 | *commands*
15 | *migrations*
16 | *admin*
17 | *wsgi*
18 | *conftest*
19 | *venv*
20 |
21 | [coverage:report]
22 | show_missing = False
23 | skip_covered = True
--------------------------------------------------------------------------------
/template_certificate.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/template_certificate.pdf
--------------------------------------------------------------------------------
/tests/__init__.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
--------------------------------------------------------------------------------
/tests/conftest.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | # Standard Library
3 | import os
4 |
5 | # Third Party Stuff
6 | import django
7 | import pytest
8 |
9 | from .fixtures import * # noqa
10 |
11 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.testing")
12 |
13 |
14 | def pytest_addoption(parser):
15 | parser.addoption("--runslow", action="store_true", help="run slow tests")
16 |
17 |
18 | def pytest_runtest_setup(item):
19 | if "slow" in item.keywords and not item.config.getoption("--runslow"):
20 | pytest.skip("need --runslow option to run")
21 |
22 |
23 | def pytest_configure(config):
24 | django.setup()
25 |
--------------------------------------------------------------------------------
/tests/fixtures.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | # Standard Library
3 | import functools
4 |
5 | # Third Party Stuff
6 | from unittest import mock
7 | import pytest
8 |
9 |
10 | class PartialMethodCaller:
11 | def __init__(self, obj, **partial_params):
12 | self.obj = obj
13 | self.partial_params = partial_params
14 |
15 | def __getattr__(self, name):
16 | return functools.partial(
17 | getattr(self.obj, name), **self.partial_params)
18 |
19 |
20 | @pytest.fixture
21 | def client():
22 | '''Overrides default client fixture adding a mocked
23 | up login method and a json() helper
24 | '''
25 | from django.test.client import Client
26 |
27 | class _Client(Client):
28 | def login(
29 | self, user=None,
30 | backend="django.contrib.auth.backends.ModelBackend",
31 | **credentials):
32 | if user is None:
33 | return super(_Client, self).login(**credentials)
34 |
35 | with mock.patch('django.contrib.auth.authenticate') as authenticate:
36 | user.backend = backend
37 | authenticate.return_value = user
38 | return super(_Client, self).login(**credentials)
39 |
40 | @property
41 | def json(self):
42 | return PartialMethodCaller(
43 | obj=self, content_type='application/json;charset="utf-8"')
44 |
45 | return _Client()
46 |
47 |
48 | @pytest.fixture
49 | def base_url(live_server):
50 | return live_server.url
51 |
52 |
53 | @pytest.fixture
54 | def outbox():
55 | from django.core import mail
56 |
57 | return mail.outbox
58 |
--------------------------------------------------------------------------------
/tests/functional/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/tests/functional/__init__.py
--------------------------------------------------------------------------------
/tests/functional/student_list_format.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/tests/functional/student_list_format.xlsx
--------------------------------------------------------------------------------
/tests/functional/test_forgot_password_flow.py:
--------------------------------------------------------------------------------
1 | import re
2 | from .. import factories as f
3 |
4 |
5 | def test_forgot_password_flow(base_url, browser, outbox):
6 | f.create_usertype(slug='tutor', display_name='tutor')
7 | user = f.UserFactory()
8 |
9 | # Forgot password link must be present on login page
10 | url = base_url + '/accounts/login/'
11 | browser.visit(url)
12 | forgot_pass_link = browser.find_by_text('Forgot Password?')[0]
13 | assert forgot_pass_link
14 |
15 | # When clicking on the link it should open a page and prompt for email
16 | forgot_pass_link.click()
17 | assert 'Password Reset' in browser.title
18 | browser.fill('email', 'no-existent-email@email.com')
19 | browser.find_by_css('[type=submit]')[0].click()
20 | assert browser.is_text_present(
21 | 'The e-mail address is not assigned to any user account')
22 | assert len(outbox) == 0
23 |
24 | # Now, enter a valid email
25 | browser.fill('email', user.email)
26 | browser.find_by_css('button[type=submit]')[0].click()
27 | assert browser.is_text_present('We have sent you an e-mail.')
28 | assert len(outbox) == 1
29 | mail = outbox[0]
30 | reset_link = re.findall(r'http.*/reset/.*/', mail.body)
31 | assert reset_link
32 |
33 | browser.visit(reset_link[0])
34 | assert "Change Password" in browser.title
35 | assert browser.is_text_present('Change Password')
36 | browser.fill('password1', 'mynewpassword')
37 | browser.fill('password2', 'mynewpassword_wrong')
38 | browser.find_by_css('[type=submit]')[0].click()
39 | assert browser.is_text_present(
40 | 'You must type the same password each time.')
41 | browser.fill('password1', 'mynewpassword')
42 | browser.fill('password2', 'mynewpassword')
43 | browser.find_by_css('[type=submit]')[0].click()
44 | assert browser.is_text_present('Your password is now changed.')
45 |
--------------------------------------------------------------------------------
/tests/functional/test_partner_page.py:
--------------------------------------------------------------------------------
1 | import re
2 | # from .. import factories as f
3 |
4 |
5 | def get_captcha_value(html_body):
6 | captcha_text = re.split(r'What is', html_body)[1]
7 | main_text = re.split(r'\?', captcha_text)
8 | a = main_text[0].strip().split(' ')
9 | if a[1] == '+':
10 | return int(a[0]) + int(a[2])
11 | if a[1] == '-':
12 | return int(a[0]) - int(a[2])
13 | if a[1] in ['*', '×']:
14 | return int(a[0]) * int(a[2])
15 |
16 |
17 | def test_partner_page(base_url, browser, outbox):
18 |
19 | url = base_url + '/partner/'
20 | browser.visit(url)
21 | browser.fill('name', 'Full Name')
22 | browser.fill('email', 'test@test.org')
23 | browser.fill('comments', 'test@test.org')
24 | browser.select('partner_type', 'profit')
25 | browser.fill('contact_number', 999911)
26 | browser.find_by_css('[type=submit]')[0].click()
27 | assert browser.is_text_present('This field is required.')
28 |
29 | browser.visit(url)
30 | browser.fill('org_name', 'Org Name')
31 | browser.fill('org_url', 'https://github.com/')
32 | browser.fill('name', 'Full Name')
33 | browser.fill('email', 'test@test.org')
34 | browser.fill('comments', 'test@test.org')
35 | browser.select('partner_type', 'profit')
36 | browser.fill('contact_number', 999911)
37 | captcha_value = get_captcha_value(browser.html)
38 | browser.fill('captcha_0', captcha_value)
39 | browser.find_by_css('[type=submit]')[0].click()
40 | assert browser.is_text_present('Contact Number should be of 10 digits')
41 |
42 | browser.visit(url)
43 | browser.fill('org_name', 'Org Name')
44 | browser.fill('org_url', 'https://github.com/')
45 | browser.fill('name', 'Full Name')
46 | browser.fill('email', 'test@test.org')
47 | browser.fill('comments', 'test@test.org')
48 | browser.select('partner_type', 'profit')
49 | browser.fill('contact_number', 9999111111)
50 | browser.fill('description', 'description')
51 | browser.fill('python_use', 'python_use')
52 | captcha_value = get_captcha_value(browser.html)
53 | browser.fill('captcha_0', captcha_value)
54 | browser.find_by_css('[type=submit]')[0].click()
55 | assert browser.is_text_present('Thank')
56 |
--------------------------------------------------------------------------------
/tests/functional/workshop/test_create_workshop.py:
--------------------------------------------------------------------------------
1 | from tests import base
2 | from tests import factories as f
3 |
4 | outbox_len = 0
5 | password = '123123'
6 |
7 |
8 | def test_workshop_create(base_url, browser, outbox):
9 | """
10 | """
11 | f.create_usertype(slug='tutor', display_name='tutor')
12 | poc_type = f.create_usertype(slug='poc', display_name='poc')
13 | state = f.create_state()
14 | user = base.create_user(password)
15 | url = base_url + '/workshop/'
16 | base.login_and_confirm(browser, url, outbox, user, password)
17 | user.save()
18 | location = f.create_locaiton(name='location1')
19 | section1 = f.create_workshop_section(name='section1')
20 |
21 | user.profile.location = location
22 | user.profile.usertype.clear()
23 | user.profile.usertype.add(poc_type)
24 | user.profile.interested_states.add(state)
25 | user.profile.mobile = '1234567890'
26 | # browser.select('usertype', poc_type.id)
27 | user.profile.interested_sections.add(section1)
28 | user.profile.occupation = 'occupation'
29 | user.profile.work_location = 'work_location'
30 |
31 | user.profile.save()
32 |
33 | url = base_url + '/workshop/'
34 | base.login(browser, url, user, password)
35 |
36 | # validate if user belongs to organisation
37 | url = base_url + '/workshop/create/'
38 | browser.visit(url)
39 | assert browser.is_text_present("create organisaiton.")
40 | # Create org
41 | org = f.create_organisation(location=location)
42 | org.user.add(user)
43 | user.profile.interested_locations.add(org.location)
44 | # user.profile.location = org.location
45 | # user.profile.save()
46 | org.save()
47 | # section1 = f.create_workshop_section(name='section1')
48 |
49 | # invalid form
50 | url = base_url + '/workshop/create/'
51 | browser.visit(url)
52 | browser.select('no_of_participants', 10)
53 | browser.fill('expected_date', '11/12/2018')
54 | browser.find_by_css('[type=submit]')[0].click()
55 | assert browser.is_text_present('This field is required.')
56 | # valid form
57 | url = base_url + '/workshop/create/'
58 | base.workshop_create(browser, url, org, section1)
59 |
--------------------------------------------------------------------------------
/tests/functional/workshop/test_workshop_celery_tasks.py:
--------------------------------------------------------------------------------
1 | from datetime import datetime, timedelta
2 |
3 | from tests import base
4 | from tests import factories as f
5 | from wye.base.constants import WorkshopStatus, WorkshopLevel
6 | from wye.workshops.tasks import workshop_reminder
7 |
8 | outbox_len = 0
9 | password = '123123'
10 |
11 |
12 | def test_workshop_celery_task(base_url, browser, outbox):
13 | """
14 | """
15 |
16 | # Create usertypes
17 | f.create_usertype(
18 | slug='lead', display_name='regional lead')
19 | f.create_usertype(slug='tutor', display_name='tutor')
20 | poc_type = f.create_usertype(slug='poc', display_name='poc')
21 | state = f.create_state()
22 | # Testcase with usertyep poc
23 | user = base.create_user(password)
24 | url = base_url + '/workshop/'
25 | base.login_and_confirm(browser, url, outbox, user, password)
26 | user.profile.usertype.clear()
27 | user.profile.usertype.add(poc_type)
28 | user.profile.interested_states.add(state)
29 | user.profile.save()
30 | user.save()
31 |
32 | # Create org
33 | location = f.create_locaiton(state=state)
34 | org = f.create_organisation(location=location)
35 | org.user.add(user)
36 | user.profile.interested_locations.add(location)
37 | user.profile.location = org.location
38 | user.profile.save()
39 | org.save()
40 |
41 | # Create workshop
42 | workshop = f.create_workshop(requester=org)
43 | workshop.expected_date = datetime.now() + timedelta(days=1)
44 | workshop.status = WorkshopStatus.REQUESTED
45 | workshop.level = WorkshopLevel.BEGINNER
46 | workshop.location = org.location
47 | workshop.presenter.add(user)
48 | workshop.save()
49 |
50 | rst = workshop_reminder.apply(args=(1, 1, None)).get()
51 | assert rst
52 |
53 | rst = workshop_reminder.apply(args=(1, 0, None)).get()
54 | assert rst
55 |
56 | workshop.expected_date = datetime.now() + timedelta(days=2)
57 | workshop.save()
58 | rst = workshop_reminder.apply(args=(1, None, 1)).get()
59 | assert rst
60 |
--------------------------------------------------------------------------------
/tests/integration/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/tests/integration/__init__.py
--------------------------------------------------------------------------------
/tests/unit/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/tests/unit/__init__.py
--------------------------------------------------------------------------------
/tests/unit/required_asterisk.py:
--------------------------------------------------------------------------------
1 | from wye.profiles.forms import UserProfileForm
2 | from wye.profiles.forms import SignupForm
3 |
4 |
5 | def test_edit_profile():
6 | userprofileform = UserProfileForm(auto_id=False)
7 | for field in userprofileform.fields.values():
8 | if (field.required):
9 | assert field.label.endswith("*")
10 |
11 |
12 | def test_signup_form():
13 | signupform = SignupForm(auto_id=False)
14 | for field in signupform.fields.values():
15 | if (field.required):
16 | assert field.label.endswith("*")
17 |
--------------------------------------------------------------------------------
/tests/unit/test_signup_mobile_validation.py:
--------------------------------------------------------------------------------
1 | from wye.profiles.forms import SignupForm
2 |
3 |
4 | def test_invalid_mobile_number1():
5 | mobile = SignupForm({'mobile': '123$%78@0j'})
6 | mobile.is_valid()
7 | assert "Contact Number should only consist digits" in (
8 | mobile.errors['mobile'])
9 |
10 |
11 | def test_invalid_mobile_number2():
12 | mobile = SignupForm({'mobile': '12345'})
13 | mobile.is_valid()
14 | assert "Contact Number should be of 10 digits" in (mobile.errors['mobile'])
15 |
--------------------------------------------------------------------------------
/tests/utils.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # Third Party Stuff
4 | from django.db.models import signals
5 | import re
6 | from . import factories as f
7 |
8 |
9 | def signals_switch():
10 | pre_save = signals.pre_save.receivers
11 | post_save = signals.post_save.receivers
12 |
13 | def disconnect():
14 | signals.pre_save.receivers = []
15 | signals.post_save.receivers = []
16 |
17 | def reconnect():
18 | signals.pre_save.receivers = pre_save
19 | signals.post_save.receivers = post_save
20 |
21 | return disconnect, reconnect
22 |
23 | disconnect_signals, reconnect_signals = signals_switch()
24 |
25 |
26 | def create_user_verify_login(base_url, browser, outbox):
27 | user = f.create_user()
28 | user.set_password('123123')
29 | user.save()
30 | url = base_url + '/accounts/login/'
31 | browser.visit(url)
32 | browser.fill('login', user.email)
33 | browser.fill('password', '123123')
34 | browser.find_by_css('[type=submit]')[0].click()
35 | assert len(outbox) != 0
36 | mail = outbox[-1]
37 | confirm_link = re.findall(r'http.*/accounts/.*/', mail.body)
38 | assert confirm_link
39 | browser.visit(confirm_link[0])
40 | assert browser.title, "Confirm E-mail Address"
41 | browser.find_by_css('[type=submit]')[0].click()
42 | return user
43 |
--------------------------------------------------------------------------------
/uwsgi.ini:
--------------------------------------------------------------------------------
1 | [uwsgi]
2 | http-socket = :$(PORT)
3 | master = true
4 | processes = 4
5 | die-on-term = true
6 | module = wye.wsgi:application
7 | memory-report = true
8 | offload-threads = 4
9 | static-map = /static=wye/assets/collected-static
10 |
--------------------------------------------------------------------------------
/wye/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/__init__.py
--------------------------------------------------------------------------------
/wye/base/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/base/__init__.py
--------------------------------------------------------------------------------
/wye/base/context_processors.py:
--------------------------------------------------------------------------------
1 | from django.conf import settings
2 |
3 |
4 | def site_info(request):
5 | return {
6 | 'SITE_INFO': settings.SITE_VARIABLES,
7 | 'GOOGLE_MAP_API': settings.GOOGLE_MAP_API
8 | }
9 |
--------------------------------------------------------------------------------
/wye/base/emailer.py:
--------------------------------------------------------------------------------
1 | import os
2 | from django.conf import settings
3 | from django.core import mail
4 | from django.template.loader import render_to_string
5 |
6 |
7 | def to_str(context, template_file, template_dir=None):
8 | return render_to_string(
9 | os.path.join(template_dir, template_file), context).strip()
10 |
11 |
12 | def send_mail(to, context, template_dir=None):
13 | """
14 | Utility to send mail.
15 | param to: recipient email list.
16 | param context: dict containing parameter, that will be passed
17 | to message templates.
18 | param template_dir: Path to directory, where required files for
19 | email exists. such as subject.txt, message.txt etc.
20 | """
21 |
22 | # to_str = lambda x: render_to_string(
23 | # os.path.join(template_dir, x), context).strip()
24 | subject = to_str(context, 'subject.txt', template_dir)
25 | from_email = settings.DEFAULT_FROM_EMAIL
26 | text_message = to_str(context, 'message.txt', template_dir)
27 | html_message = to_str(context, 'message.html', template_dir)
28 | recipient_list = to
29 | return mail.send_mail(subject, text_message, from_email,
30 | recipient_list, html_message=html_message)
31 |
--------------------------------------------------------------------------------
/wye/base/management/__init__.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | __version__ = '0.1.0'
3 |
--------------------------------------------------------------------------------
/wye/base/management/commands/__init__.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | __version__ = '0.1.0'
3 |
--------------------------------------------------------------------------------
/wye/base/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/base/migrations/__init__.py
--------------------------------------------------------------------------------
/wye/base/models.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # Third Party Stuff
4 | from django.contrib.auth.models import User
5 | from django.db import models
6 |
7 |
8 | class TimeAuditModel(models.Model):
9 |
10 | """ To track when the record was created and last modified """
11 | created_at = models.DateTimeField(
12 | auto_now_add=True, verbose_name="Created At",)
13 | modified_at = models.DateTimeField(
14 | auto_now=True, verbose_name="Last Modified At")
15 |
16 | class Meta:
17 | abstract = True
18 |
19 |
20 | class UserAuditModel(models.Model):
21 |
22 | """ To track who created and last modified the record """
23 | created_by = models.ForeignKey(User, related_name='created_%(class)s_set',
24 | null=True, blank=True,
25 | verbose_name="Created By")
26 | modified_by = models.ForeignKey(User, related_name='updated_%(class)s_set',
27 | null=True, blank=True,
28 | verbose_name="Modified By")
29 |
30 | class Meta:
31 | abstract = True
32 |
33 |
34 | class AuditModel(TimeAuditModel, UserAuditModel):
35 |
36 | class Meta:
37 | abstract = True
38 |
--------------------------------------------------------------------------------
/wye/base/widgets.py:
--------------------------------------------------------------------------------
1 | import datetime
2 |
3 | from django import forms
4 | from django.utils.safestring import mark_safe
5 |
6 |
7 | class CalendarWidget(forms.TextInput):
8 | """
9 | Calender widget: It will set bootstrap datepicker for
10 | the specified field.
11 | """
12 |
13 | def render(self, name, value, attrs=None):
14 | if value is not None and value != "":
15 | value = self.format_date(value)
16 |
17 | render_str = '''
18 |
26 | ''' % {'name': name}
27 | rendered_input = super(CalendarWidget, self).render(name, value, attrs)
28 | return mark_safe(rendered_input + render_str)
29 |
30 | def format_date(self, date):
31 | if type(date) == datetime.date:
32 | return date.strftime('%d/%m/%Y')
33 | return date
34 |
35 | class Media:
36 | css = {
37 | 'all': ('css/libs/datepicker.css',)
38 | }
39 | js = ('js/libs/jquery-2.1.4.min.js', 'js/libs/bootstrap-datepicker.js',)
40 |
--------------------------------------------------------------------------------
/wye/media/images/newuser.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/media/images/newuser.png
--------------------------------------------------------------------------------
/wye/organisations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/organisations/__init__.py
--------------------------------------------------------------------------------
/wye/organisations/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | from .models import Organisation
4 |
5 |
6 | class OrganisationAdmin(admin.ModelAdmin):
7 | list_per_page = 10
8 | list_display = (
9 | 'organisation_type',
10 | 'name',
11 | 'location')
12 | search_fields = (
13 | 'organisation_type',
14 | 'name')
15 | list_filter = (
16 | 'active',
17 | 'organisation_type',
18 | 'name',
19 | 'location')
20 |
21 |
22 | admin.site.register(Organisation, OrganisationAdmin)
23 |
--------------------------------------------------------------------------------
/wye/organisations/forms.py:
--------------------------------------------------------------------------------
1 | from django import forms
2 | from .models import Organisation, User
3 |
4 |
5 | class OrganisationForm(forms.ModelForm):
6 |
7 | def __init__(self, *args, **kwargs):
8 | super(OrganisationForm, self).__init__(*args, **kwargs)
9 |
10 | class Meta:
11 | model = Organisation
12 | exclude = ('user', 'created_at', 'modified_at',
13 | 'active', 'created_by', 'modified_by',
14 | 'students')
15 |
16 |
17 | class OrganisationMemberAddForm(forms.ModelForm):
18 |
19 | def __init__(self, *args, **kwargs):
20 | super(OrganisationMemberAddForm, self).__init__(*args, **kwargs)
21 |
22 | class Meta:
23 | model = Organisation
24 | exclude = ('user', 'created_at', 'modified_at',
25 | 'name', 'organisation_type', 'description',
26 | 'location', 'organisation_role',
27 | 'active', 'created_by', 'modified_by',
28 | 'students')
29 |
30 | existing_user = forms.ModelChoiceField(
31 | queryset=User.objects.all(), required=False)
32 | new_user = forms.EmailField(label='Invite New User', required=False)
33 |
34 | def clean(self):
35 | user = self.cleaned_data.get('existing_user')
36 | new_user = self.cleaned_data['new_user']
37 |
38 | if not (user or new_user):
39 | raise forms.ValidationError(
40 | 'Please choose existing user or add new user')
41 | return self.cleaned_data
42 |
43 |
44 | class UserRegistrationForm(forms.ModelForm):
45 | """
46 | Form class for completing a user's registration and activating the
47 | User.
48 |
49 | The class operates on a user model which is assumed to have the required
50 | fields of a BaseUserModel
51 | """
52 | first_name = forms.CharField(max_length=30)
53 | last_name = forms.CharField(max_length=30)
54 | password = forms.CharField(max_length=30, widget=forms.PasswordInput)
55 | password_confirm = forms.CharField(max_length=30,
56 | widget=forms.PasswordInput)
57 |
58 | def __init__(self, *args, **kwargs):
59 | super(UserRegistrationForm, self).__init__(*args, **kwargs)
60 | self.initial['username'] = ''
61 |
62 | class Meta:
63 | model = User
64 | exclude = ('is_staff', 'is_superuser', 'is_active', 'last_login',
65 | 'date_joined', 'groups', 'user_permissions')
66 |
--------------------------------------------------------------------------------
/wye/organisations/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 | from django.conf import settings
6 |
7 |
8 | class Migration(migrations.Migration):
9 |
10 | dependencies = [
11 | ('regions', '0001_initial'),
12 | migrations.swappable_dependency(settings.AUTH_USER_MODEL),
13 | ]
14 |
15 | operations = [
16 | migrations.CreateModel(
17 | name='Organisation',
18 | fields=[
19 | ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
20 | ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
21 | ('modified_at', models.DateTimeField(verbose_name='Last Modified At', auto_now=True)),
22 | ('organisation_type', models.PositiveSmallIntegerField(verbose_name='Organisation Type', choices=[(1, 'College'), (2, 'Free Software Organisation'), (4, 'Others'), (3, 'Student Group')])),
23 | ('name', models.CharField(max_length=300, unique=True)),
24 | ('description', models.TextField()),
25 | ('organisation_role', models.CharField(max_length=300)),
26 | ('active', models.BooleanField(default=True)),
27 | ('created_by', models.ForeignKey(related_name='created_organisation_set', blank=True, to=settings.AUTH_USER_MODEL, verbose_name='Created By', null=True)),
28 | ('location', models.ForeignKey(to='regions.Location')),
29 | ('modified_by', models.ForeignKey(related_name='updated_organisation_set', blank=True, to=settings.AUTH_USER_MODEL, verbose_name='Modified By', null=True)),
30 | ('user', models.ManyToManyField(related_name='organisation_users', to=settings.AUTH_USER_MODEL)),
31 | ],
32 | options={
33 | 'db_table': 'organisations',
34 | },
35 | ),
36 | ]
37 |
--------------------------------------------------------------------------------
/wye/organisations/migrations/0002_auto_20160716_1939.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('organisations', '0001_initial'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='organisation',
16 | name='organisation_role',
17 | field=models.CharField(verbose_name='Your position in organisation', max_length=300),
18 | ),
19 | migrations.AlterField(
20 | model_name='organisation',
21 | name='organisation_type',
22 | field=models.PositiveSmallIntegerField(choices=[(1, 'College'), (2, 'Free Software Organisation'), (4, 'Others'), (3, 'Student Group')], verbose_name='organisation type'),
23 | ),
24 | ]
25 |
--------------------------------------------------------------------------------
/wye/organisations/migrations/0003_auto_20160815_0955.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('organisations', '0002_auto_20160716_1939'),
11 | ]
12 |
13 | operations = [
14 | migrations.AddField(
15 | model_name='organisation',
16 | name='address_map_url',
17 | field=models.URLField(null=True, blank=True),
18 | ),
19 | migrations.AddField(
20 | model_name='organisation',
21 | name='full_address',
22 | field=models.TextField(null=True, blank=True),
23 | ),
24 | migrations.AddField(
25 | model_name='organisation',
26 | name='pincode',
27 | field=models.CharField(max_length=6, null=True, blank=True),
28 | ),
29 | ]
30 |
--------------------------------------------------------------------------------
/wye/organisations/migrations/0004_organisation_students.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 | from django.conf import settings
6 |
7 |
8 | class Migration(migrations.Migration):
9 |
10 | dependencies = [
11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL),
12 | ('organisations', '0003_auto_20160815_0955'),
13 | ]
14 |
15 | operations = [
16 | migrations.AddField(
17 | model_name='organisation',
18 | name='students',
19 | field=models.ManyToManyField(to=settings.AUTH_USER_MODEL, related_name='organisation_students'),
20 | ),
21 | ]
22 |
--------------------------------------------------------------------------------
/wye/organisations/migrations/0005_auto_20171116_1428.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 | from django.conf import settings
6 |
7 |
8 | class Migration(migrations.Migration):
9 |
10 | dependencies = [
11 | ('organisations', '0004_organisation_students'),
12 | ]
13 |
14 | operations = [
15 | migrations.AlterField(
16 | model_name='organisation',
17 | name='students',
18 | field=models.ManyToManyField(to=settings.AUTH_USER_MODEL, related_name='organisation_students', blank=True),
19 | ),
20 | ]
21 |
--------------------------------------------------------------------------------
/wye/organisations/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/organisations/migrations/__init__.py
--------------------------------------------------------------------------------
/wye/organisations/models.py:
--------------------------------------------------------------------------------
1 | from django.contrib.auth.models import User
2 | from django.db import models
3 |
4 | from wye.base.constants import OrganisationType
5 | from wye.base.models import AuditModel
6 | from wye.regions.models import Location
7 |
8 |
9 | class Organisation(AuditModel):
10 | organisation_type = models.PositiveSmallIntegerField(
11 | choices=OrganisationType.CHOICES, verbose_name="organisation type")
12 | name = models.CharField(max_length=300, unique=True)
13 | description = models.TextField()
14 | full_address = models.TextField(blank=True, null=True)
15 | location = models.ForeignKey(Location)
16 | pincode = models.CharField(max_length=6, blank=True, null=True)
17 | address_map_url = models.URLField(blank=True, null=True)
18 | organisation_role = models.CharField(
19 | max_length=300, verbose_name="Your position in organisation")
20 | user = models.ManyToManyField(User, related_name='organisation_users')
21 | active = models.BooleanField(default=True)
22 | students = models.ManyToManyField(
23 | User,
24 | related_name='organisation_students',
25 | blank=True)
26 |
27 | @classmethod
28 | def list_user_organisations(cls, user):
29 | return cls.objects.filter(user=user, active=True)
30 |
31 | @property
32 | def get_organisation_user_list(self):
33 | return self.user.all()
34 |
35 | def toggle_active(self, logged_user, **kwargs):
36 | """
37 | Helper method to toggle active flag for the model.
38 | """
39 |
40 | action_map = {'active': True, 'deactive': False}
41 | action = kwargs.get('action')
42 | # check if user is only poc for the organisation
43 | self.user.remove(logged_user)
44 | if not self.user.count():
45 | # if there are no more poc for this organisation disable it
46 | # else Organisation will be active
47 | self.active = action_map.get(action)
48 | self.save()
49 |
50 | return {
51 | 'status': True,
52 | 'msg': 'Organisation disabled'}
53 |
54 | class Meta:
55 | db_table = 'organisations'
56 |
57 | def __str__(self):
58 | return '{} , {}'.format(self.name, self.location)
59 |
--------------------------------------------------------------------------------
/wye/organisations/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import url
2 | from .views import (
3 | OrganisationCreate, OrganisationDetail,
4 | OrganisationUpdate, OrganisationList,
5 | OrganisationDeactive, OrganisationMemberAdd)
6 |
7 | urlpatterns = [
8 | url(r'^create/$', OrganisationCreate.as_view(),
9 | name="organisation_create"),
10 | url(r'^(?P\d+)/(?Pactive|deactive)/$',
11 | OrganisationDeactive.as_view(), name="organisation_delete"),
12 | url(r'^(?P\d+)/edit/$',
13 | OrganisationUpdate.as_view(), name="organisation_update"),
14 | url(r'^(?P\d+)/member-add/$',
15 | OrganisationMemberAdd.as_view(), name="organisation_member_add"),
16 | url(r'^(?P\d+)/$', OrganisationDetail.as_view(),
17 | name="organisation_details"),
18 | url(r'^$', OrganisationList.as_view(), name="organisation_list"),
19 |
20 | ]
21 |
--------------------------------------------------------------------------------
/wye/profiles/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/profiles/__init__.py
--------------------------------------------------------------------------------
/wye/profiles/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 | from .models import Profile, UserType
3 |
4 |
5 | class ProfileAdmin(admin.ModelAdmin):
6 | list_per_page = 10
7 | list_display = (
8 | 'user',
9 | 'mobile')
10 | search_fields = ('user__username', 'mobile')
11 | list_filter = (
12 | 'interested_locations',
13 | 'interested_sections')
14 |
15 |
16 | class UserTypeAdmin(admin.ModelAdmin):
17 | list_per_page = 10
18 | list_display = (
19 | 'display_name',
20 | 'active')
21 | search_fields = ('user__username', 'display_name')
22 | list_filter = (
23 | 'active',)
24 |
25 | admin.site.register(Profile, ProfileAdmin)
26 | admin.site.register(UserType, UserTypeAdmin)
27 |
--------------------------------------------------------------------------------
/wye/profiles/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 | from django.conf import settings
6 |
7 |
8 | class Migration(migrations.Migration):
9 |
10 | dependencies = [
11 | ('auth', '0006_require_contenttypes_0002'),
12 | ('regions', '0001_initial'),
13 | ('workshops', '0001_initial'),
14 | ]
15 |
16 | operations = [
17 | migrations.CreateModel(
18 | name='Profile',
19 | fields=[
20 | ('user', models.OneToOneField(primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL, related_name='profile')),
21 | ('slug', models.CharField(max_length=100, unique=True)),
22 | ('mobile', models.CharField(max_length=10)),
23 | ('interested_locations', models.ManyToManyField(to='regions.Location')),
24 | ('interested_sections', models.ManyToManyField(to='workshops.WorkshopSections')),
25 | ],
26 | options={
27 | 'db_table': 'user_profile',
28 | 'verbose_name': 'UserProfile',
29 | 'verbose_name_plural': 'UserProfiles',
30 | },
31 | ),
32 | migrations.CreateModel(
33 | name='UserType',
34 | fields=[
35 | ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
36 | ('slug', models.CharField(max_length=100, verbose_name='slug')),
37 | ('display_name', models.CharField(max_length=300, verbose_name='Display Name')),
38 | ('active', models.BooleanField(default=1)),
39 | ],
40 | options={
41 | 'db_table': 'users_type',
42 | 'ordering': ('-id',),
43 | 'verbose_name_plural': 'UserTypes',
44 | 'verbose_name': 'UserType',
45 | },
46 | ),
47 | migrations.AddField(
48 | model_name='profile',
49 | name='usertype',
50 | field=models.ManyToManyField(to='profiles.UserType'),
51 | ),
52 | ]
53 |
--------------------------------------------------------------------------------
/wye/profiles/migrations/0002_remove_profile_slug.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('profiles', '0001_initial'),
11 | ]
12 |
13 | operations = [
14 | migrations.RemoveField(
15 | model_name='profile',
16 | name='slug',
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/wye/profiles/migrations/0003_auto_20151030_2048.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('regions', '0001_initial'),
11 | ('profiles', '0002_remove_profile_slug'),
12 | ]
13 |
14 | operations = [
15 | migrations.AddField(
16 | model_name='profile',
17 | name='facebook',
18 | field=models.URLField(null=True, blank=True),
19 | ),
20 | migrations.AddField(
21 | model_name='profile',
22 | name='github',
23 | field=models.URLField(null=True, blank=True),
24 | ),
25 | migrations.AddField(
26 | model_name='profile',
27 | name='googleplus',
28 | field=models.URLField(null=True, blank=True),
29 | ),
30 | migrations.AddField(
31 | model_name='profile',
32 | name='linkedin',
33 | field=models.URLField(null=True, blank=True),
34 | ),
35 | migrations.AddField(
36 | model_name='profile',
37 | name='location',
38 | field=models.ForeignKey(null=True, related_name='user_location', to='regions.Location'),
39 | ),
40 | migrations.AddField(
41 | model_name='profile',
42 | name='picture',
43 | field=models.ImageField(default='images/newuser.png', upload_to='images/'),
44 | ),
45 | migrations.AddField(
46 | model_name='profile',
47 | name='slideshare',
48 | field=models.URLField(null=True, blank=True),
49 | ),
50 | migrations.AddField(
51 | model_name='profile',
52 | name='twitter',
53 | field=models.URLField(null=True, blank=True),
54 | ),
55 | migrations.AlterField(
56 | model_name='profile',
57 | name='mobile',
58 | field=models.CharField(max_length=10, null=True),
59 | ),
60 | ]
61 |
--------------------------------------------------------------------------------
/wye/profiles/migrations/0004_auto_20151101_1553.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('profiles', '0003_auto_20151030_2048'),
11 | ]
12 |
13 | operations = [
14 | migrations.AddField(
15 | model_name='profile',
16 | name='is_email_visible',
17 | field=models.BooleanField(default=True),
18 | ),
19 | migrations.AddField(
20 | model_name='profile',
21 | name='is_mobile_visible',
22 | field=models.BooleanField(default=True),
23 | ),
24 | ]
25 |
--------------------------------------------------------------------------------
/wye/profiles/migrations/0005_auto_20160716_1939.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('profiles', '0004_auto_20151101_1553'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='profile',
16 | name='is_email_visible',
17 | field=models.BooleanField(default=False),
18 | ),
19 | migrations.AlterField(
20 | model_name='profile',
21 | name='is_mobile_visible',
22 | field=models.BooleanField(default=False),
23 | ),
24 | migrations.AlterField(
25 | model_name='profile',
26 | name='usertype',
27 | field=models.ManyToManyField(null=True, to='profiles.UserType'),
28 | ),
29 | ]
30 |
--------------------------------------------------------------------------------
/wye/profiles/migrations/0006_auto_20161002_0952.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('regions', '0001_initial'),
11 | ('profiles', '0005_auto_20160716_1939'),
12 | ]
13 |
14 | operations = [
15 | migrations.AddField(
16 | model_name='profile',
17 | name='enable_notifications',
18 | field=models.BooleanField(default=True, verbose_name='Email Notification'),
19 | ),
20 | migrations.AddField(
21 | model_name='profile',
22 | name='interested_states',
23 | field=models.ManyToManyField(verbose_name='Interested State', null=True, to='regions.State', blank=True),
24 | ),
25 | migrations.AddField(
26 | model_name='profile',
27 | name='no_workshop',
28 | field=models.IntegerField(default=0, verbose_name='No. of Workshop conducted'),
29 | ),
30 | migrations.AddField(
31 | model_name='profile',
32 | name='work_experience',
33 | field=models.FloatField(verbose_name='Work Experience', null=True, blank=True),
34 | ),
35 | migrations.AddField(
36 | model_name='profile',
37 | name='work_location',
38 | field=models.TextField(verbose_name='Present Company', null=True, blank=True),
39 | ),
40 | migrations.AlterField(
41 | model_name='profile',
42 | name='interested_locations',
43 | field=models.ManyToManyField(null=True, to='regions.Location', blank=True),
44 | ),
45 | ]
46 |
--------------------------------------------------------------------------------
/wye/profiles/migrations/0007_auto_20161003_2241.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('profiles', '0006_auto_20161002_0952'),
11 | ]
12 |
13 | operations = [
14 | migrations.AddField(
15 | model_name='profile',
16 | name='interested_level',
17 | field=models.PositiveSmallIntegerField(default=1, verbose_name='Interested Workshop Level', choices=[(1, 'Beginner'), (2, 'Intermediate')]),
18 | preserve_default=False,
19 | ),
20 | migrations.AlterField(
21 | model_name='profile',
22 | name='interested_states',
23 | field=models.ManyToManyField(verbose_name='Interested State *', to='regions.State', null=True, blank=True),
24 | ),
25 | migrations.AlterField(
26 | model_name='profile',
27 | name='no_workshop',
28 | field=models.IntegerField(default=0, verbose_name='No. of Workshop conducted(apart from pythonexpress)'),
29 | ),
30 | ]
31 |
--------------------------------------------------------------------------------
/wye/profiles/migrations/0008_auto_20161004_0709.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('profiles', '0007_auto_20161003_2241'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='profile',
16 | name='interested_level',
17 | field=models.PositiveSmallIntegerField(blank=True, null=True, choices=[(1, 'Beginner'), (2, 'Intermediate')], verbose_name='Interested Workshop Level'),
18 | ),
19 | migrations.AlterField(
20 | model_name='profile',
21 | name='no_workshop',
22 | field=models.IntegerField(default=0, verbose_name='Workshop conducted(apart from pythonexpress)'),
23 | ),
24 | ]
25 |
--------------------------------------------------------------------------------
/wye/profiles/migrations/0009_auto_20170722_2205.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('profiles', '0008_auto_20161004_0709'),
11 | ]
12 |
13 | operations = [
14 | migrations.AddField(
15 | model_name='profile',
16 | name='occupation',
17 | field=models.CharField(max_length=300, blank=True, null=True, verbose_name='Occupation'),
18 | ),
19 | migrations.AlterField(
20 | model_name='profile',
21 | name='work_experience',
22 | field=models.FloatField(null=True, blank=True, verbose_name='Work Experience(If Any)'),
23 | ),
24 | migrations.AlterField(
25 | model_name='profile',
26 | name='work_location',
27 | field=models.CharField(max_length=500, blank=True, null=True, verbose_name='Organisaiton/Company'),
28 | ),
29 | ]
30 |
--------------------------------------------------------------------------------
/wye/profiles/migrations/0010_auto_20170907_0003.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('profiles', '0009_auto_20170722_2205'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='profile',
16 | name='interested_locations',
17 | field=models.ManyToManyField(to='regions.Location'),
18 | ),
19 | migrations.AlterField(
20 | model_name='profile',
21 | name='interested_states',
22 | field=models.ManyToManyField(to='regions.State', verbose_name='Interested State *'),
23 | ),
24 | migrations.AlterField(
25 | model_name='profile',
26 | name='usertype',
27 | field=models.ManyToManyField(to='profiles.UserType'),
28 | ),
29 | ]
30 |
--------------------------------------------------------------------------------
/wye/profiles/migrations/0011_auto_20171030_1708.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('profiles', '0010_auto_20170907_0003'),
11 | ]
12 |
13 | operations = [
14 | migrations.CreateModel(
15 | name='TutorBadges',
16 | fields=[
17 | ('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)),
18 | ],
19 | ),
20 | migrations.AlterField(
21 | model_name='profile',
22 | name='interested_level',
23 | field=models.PositiveSmallIntegerField(blank=True, verbose_name='Interested Workshop Level', choices=[(2, 'Advance'), (1, 'Beginner'), (2, 'Intermediate')], null=True),
24 | ),
25 | ]
26 |
--------------------------------------------------------------------------------
/wye/profiles/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/profiles/migrations/__init__.py
--------------------------------------------------------------------------------
/wye/profiles/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import url
2 | from . import views
3 |
4 | urlpatterns = [
5 | url(r'^(?P[a-zA-Z0-9@._-]+)/$',
6 | views.profile_view, name='profile-page'),
7 | url(r'^(?P[a-zA-Z0-9@._-]+)/edit/$',
8 | views.ProfileEditView.as_view(), name='profile-edit'),
9 | url(r'^(?P[a-zA-Z0-9@._-]+)/deactivate/$',
10 | views.account_deactivate, name='account_deactivate')
11 | ]
12 |
--------------------------------------------------------------------------------
/wye/regions/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/regions/__init__.py
--------------------------------------------------------------------------------
/wye/regions/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | from .models import Location, State, RegionalLead
4 |
5 |
6 | class LocationAdmin(admin.ModelAdmin):
7 | list_per_page = 10
8 | list_display = (
9 | 'name',
10 | 'state')
11 | search_fields = ('name',)
12 | list_filter = (
13 | 'name',
14 | 'state')
15 |
16 |
17 | class StateAdmin(admin.ModelAdmin):
18 | list_per_page = 10
19 | search_fields = ('name',)
20 |
21 | admin.site.register(Location, LocationAdmin)
22 | admin.site.register(State, StateAdmin)
23 | admin.site.register(RegionalLead)
24 |
--------------------------------------------------------------------------------
/wye/regions/forms.py:
--------------------------------------------------------------------------------
1 | from django import forms
2 | from django.core.exceptions import ValidationError
3 |
4 | from wye.profiles.models import UserType, Profile
5 |
6 | from . import models
7 |
8 |
9 | class RegionalLeadForm(forms.ModelForm):
10 |
11 | class Meta:
12 | model = models.RegionalLead
13 | exclude = ()
14 |
15 | def clean(self):
16 | error_message = []
17 | if (self.cleaned_data.get('location', '') and
18 | self.cleaned_data.get('leads', '')):
19 | location = self.cleaned_data['location']
20 | for u in self.cleaned_data['leads']:
21 | if not u.profile:
22 | error_message.append('Profile for user %s not found' % (u))
23 | elif u.profile.location != location:
24 | error_message.append(
25 | "User %s doesn't belong to region %s" % (u, location))
26 | if error_message:
27 | raise ValidationError(error_message)
28 |
29 | def save(self, force_insert=False, force_update=False, commit=True):
30 | m = super(RegionalLeadForm, self).save()
31 |
32 | # Removing old leads which are not selected currently
33 | current_region = self.instance.location.id
34 | lead_users = Profile.objects.filter(
35 | usertype=UserType.objects.get(slug='lead'),
36 | location=current_region)
37 | current_leads = self.instance.leads.values_list('id', flat=True)
38 | for lead in lead_users:
39 | if lead.user_id not in current_leads:
40 | lead.usertype.remove(UserType.objects.get(slug='lead'))
41 | lead.save()
42 |
43 | # Add currently selected leads
44 | for u in self.cleaned_data['leads']:
45 | u.profile.usertype.add(UserType.objects.get(slug='lead'))
46 | return m
47 |
48 |
49 | class LocationForm(forms.ModelForm):
50 |
51 | class Meta:
52 | model = models.Location
53 | exclude = ()
54 |
55 |
56 | class StateForm(forms.ModelForm):
57 |
58 | class Meta:
59 | model = models.State
60 | exclude = ()
61 |
--------------------------------------------------------------------------------
/wye/regions/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 | from django.conf import settings
6 |
7 |
8 | class Migration(migrations.Migration):
9 |
10 | dependencies = [
11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL),
12 | ]
13 |
14 | operations = [
15 | migrations.CreateModel(
16 | name='Location',
17 | fields=[
18 | ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
19 | ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
20 | ('modified_at', models.DateTimeField(verbose_name='Last Modified At', auto_now=True)),
21 | ('name', models.CharField(max_length=300, unique=True)),
22 | ],
23 | options={
24 | 'db_table': 'locations',
25 | },
26 | ),
27 | migrations.CreateModel(
28 | name='RegionalLead',
29 | fields=[
30 | ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
31 | ('leads', models.ManyToManyField(to=settings.AUTH_USER_MODEL)),
32 | ('location', models.ForeignKey(to='regions.Location')),
33 | ],
34 | options={
35 | 'db_table': 'regional_lead',
36 | 'verbose_name': 'RegionalLead',
37 | 'verbose_name_plural': 'RegionalLeads',
38 | },
39 | ),
40 | migrations.CreateModel(
41 | name='State',
42 | fields=[
43 | ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
44 | ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')),
45 | ('modified_at', models.DateTimeField(verbose_name='Last Modified At', auto_now=True)),
46 | ('name', models.CharField(max_length=300, unique=True)),
47 | ],
48 | options={
49 | 'db_table': 'states',
50 | },
51 | ),
52 | migrations.AddField(
53 | model_name='location',
54 | name='state',
55 | field=models.ForeignKey(to='regions.State'),
56 | ),
57 | ]
58 |
--------------------------------------------------------------------------------
/wye/regions/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/regions/migrations/__init__.py
--------------------------------------------------------------------------------
/wye/regions/models.py:
--------------------------------------------------------------------------------
1 | from django.contrib.auth.models import User
2 | from django.db import models
3 |
4 | from wye.base.models import TimeAuditModel
5 |
6 |
7 | class State(TimeAuditModel):
8 | '''
9 | '''
10 | name = models.CharField(max_length=300, unique=True)
11 |
12 | class Meta:
13 | db_table = 'states'
14 |
15 | def __str__(self):
16 | return '{}'.format(self.name)
17 |
18 |
19 | class Location(TimeAuditModel):
20 | '''
21 | '''
22 | name = models.CharField(max_length=300, unique=True)
23 | state = models.ForeignKey(State)
24 |
25 | class Meta:
26 | db_table = 'locations'
27 |
28 | def __str__(self):
29 | return '{}, {}'.format(self.name, self.state.name)
30 |
31 |
32 | class RegionalLead(models.Model):
33 | location = models.ForeignKey(Location)
34 | leads = models.ManyToManyField(User)
35 |
36 | class Meta:
37 | db_table = 'regional_lead'
38 | verbose_name = 'RegionalLead'
39 | verbose_name_plural = 'RegionalLeads'
40 |
41 | def __str__(self):
42 | return '{}'.format(self.location)
43 |
44 | # @property
45 | # def get_count_of_leads(self):
46 | # return self.leads.count()
47 |
48 | # @classmethod
49 | # def is_regional_lead(cls, user, location):
50 | # return cls.objects.filter(
51 | # leads=user, location=location).exists()
52 |
--------------------------------------------------------------------------------
/wye/regions/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import url
2 | from . import views
3 |
4 | urlpatterns = [
5 | url(r'^lead/create/$', views.RegionalLeadCreateView.as_view(),
6 | name="lead-create"),
7 | url(r'^lead/(?P\d+)/edit/$', views.RegionalLeadUpdateView.as_view(),
8 | name="lead-update"),
9 | url(r'^lead/get_leads/(?P\w+)/$', views.RegionalLeadCreateView().get_leads, name='get_leads'),
10 | url(r'^state/create/$', views.StateCreateView.as_view(),
11 | name="state-create"),
12 | url(r'^state/(?P\d+)/edit/$', views.StateEditView.as_view(),
13 | name="state-update"),
14 |
15 | url(r'^location/create/$', views.LocationCreateView.as_view(),
16 | name="location-create"),
17 | url(r'^location/(?P\d+)/edit/$', views.LocationUpdateView.as_view(),
18 | name="location-update"),
19 | url(r'^$', views.RegionalListView.as_view(), name="regions-home-page")
20 |
21 | ]
22 |
--------------------------------------------------------------------------------
/wye/reports/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/reports/__init__.py
--------------------------------------------------------------------------------
/wye/reports/admin.py:
--------------------------------------------------------------------------------
1 | # from django.contrib import admin
2 |
3 | # Register your models here.
4 |
--------------------------------------------------------------------------------
/wye/reports/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/reports/migrations/__init__.py
--------------------------------------------------------------------------------
/wye/reports/models.py:
--------------------------------------------------------------------------------
1 | # from django.db import models
2 |
3 | # Create your models here.
4 |
--------------------------------------------------------------------------------
/wye/reports/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import url
2 | from . import views
3 |
4 | urlpatterns = [
5 | url(r'^export_workshops/$', views.get_tutor_college_poc_csv,
6 | name="workshop-csv"),
7 | url(r'^export_users/$', views.get_all_user_info,
8 | name="workshop-csv"),
9 | url(r'^$', views.index, name="home"),
10 |
11 | ]
12 |
--------------------------------------------------------------------------------
/wye/social/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/social/__init__.py
--------------------------------------------------------------------------------
/wye/social/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/social/migrations/__init__.py
--------------------------------------------------------------------------------
/wye/social/sites/__init__.py:
--------------------------------------------------------------------------------
1 | from .twitter import init_twitter, send_tweet
2 |
3 | __all__ = ['init_twitter', 'send_tweet']
4 |
--------------------------------------------------------------------------------
/wye/social/sites/twitter.py:
--------------------------------------------------------------------------------
1 | from twython import Twython
2 |
3 | from django.conf import settings
4 |
5 |
6 | def init_twitter():
7 | try:
8 | twitter = Twython(
9 | settings.TWITTER_CONSUMER_KEY,
10 | settings.TWITTER_CONSUMER_SECRET,
11 | settings.TWITTER_ACCESS_TOKEN,
12 | settings.TWITTER_ACCESS_TOKEN_SECRET,
13 | )
14 | except:
15 | # Log this error: Authentication Error.
16 | twitter = None
17 |
18 | return twitter
19 |
20 |
21 | def send_tweet(context=None):
22 | twitter = init_twitter()
23 | if twitter:
24 | workshop = context.get('workshop', None)
25 | if workshop:
26 | try:
27 | twitter.update_status(status=workshop.get_tweet(context))
28 | except:
29 | # Log this error: Status Update error.
30 | pass
31 |
--------------------------------------------------------------------------------
/wye/static/certificate/student_list_format.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/certificate/student_list_format.xlsx
--------------------------------------------------------------------------------
/wye/static/css/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/css/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/wye/static/css/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/css/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/wye/static/css/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/css/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/wye/static/css/fonts/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/css/fonts/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/wye/static/css/libs/justifiedGallery.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Justified Gallery - v3.6.3
3 | * http://miromannino.github.io/Justified-Gallery/
4 | * Copyright (c) 2016 Miro Mannino
5 | * Licensed under the MIT license.
6 | */
7 | .justified-gallery{width:100%;position:relative;overflow:hidden}.justified-gallery>a,.justified-gallery>div{position:absolute;display:inline-block;overflow:hidden;filter:"alpha(opacity=10)";opacity:.1}.justified-gallery>a>img,.justified-gallery>div>img,.justified-gallery>a>a>img,.justified-gallery>div>a>img{position:absolute;top:50%;left:50%;margin:0;padding:0;border:0;filter:"alpha(opacity=0)";opacity:0}.justified-gallery>a>.caption,.justified-gallery>div>.caption{display:none;position:absolute;bottom:0;padding:5px;background-color:#000;left:0;right:0;margin:0;color:#fff;font-size:12px;font-weight:300;font-family:sans-serif}.justified-gallery>a>.caption.caption-visible,.justified-gallery>div>.caption.caption-visible{display:initial;filter:"alpha(opacity=70)";opacity:.7;-webkit-transition:opacity 500ms ease-in;-moz-transition:opacity 500ms ease-in;-o-transition:opacity 500ms ease-in;transition:opacity 500ms ease-in}.justified-gallery>.entry-visible{filter:"alpha(opacity=100)";opacity:1;background:0 0}.justified-gallery>.entry-visible>img,.justified-gallery>.entry-visible>a>img{filter:"alpha(opacity=100)";opacity:1;-webkit-transition:opacity 500ms ease-in;-moz-transition:opacity 500ms ease-in;-o-transition:opacity 500ms ease-in;transition:opacity 500ms ease-in}.justified-gallery>.jg-filtered{display:none}.justified-gallery>.spinner{position:absolute;bottom:0;margin-left:-24px;padding:10px 0;left:50%;filter:"alpha(opacity=100)";opacity:1;overflow:initial}.justified-gallery>.spinner>span{display:inline-block;filter:"alpha(opacity=0)";opacity:0;width:8px;height:8px;margin:0 4px;background-color:#000;border-radius:6px}
8 |
--------------------------------------------------------------------------------
/wye/static/datepicker.less:
--------------------------------------------------------------------------------
1 | /*!
2 | * Datepicker for Bootstrap
3 | *
4 | * Copyright 2012 Stefan Petre
5 | * Licensed under the Apache License v2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | */
9 |
10 | .datepicker {
11 | top: 0;
12 | left: 0;
13 | padding: 4px;
14 | margin-top: 1px;
15 | .border-radius(4px);
16 | &:before {
17 | content: '';
18 | display: inline-block;
19 | border-left: 7px solid transparent;
20 | border-right: 7px solid transparent;
21 | border-bottom: 7px solid #ccc;
22 | border-bottom-color: rgba(0,0,0,.2);
23 | position: absolute;
24 | top: -7px;
25 | left: 6px;
26 | }
27 | &:after {
28 | content: '';
29 | display: inline-block;
30 | border-left: 6px solid transparent;
31 | border-right: 6px solid transparent;
32 | border-bottom: 6px solid @white;
33 | position: absolute;
34 | top: -6px;
35 | left: 7px;
36 | }
37 | >div {
38 | display: none;
39 | }
40 | table{
41 | width: 100%;
42 | margin: 0;
43 | }
44 | td,
45 | th{
46 | text-align: center;
47 | width: 20px;
48 | height: 20px;
49 | .border-radius(4px);
50 | }
51 | td {
52 | &.day:hover {
53 | background: @grayLighter;
54 | cursor: pointer;
55 | }
56 | &.day.disabled {
57 | color: @grayLighter;
58 | }
59 | &.old,
60 | &.new {
61 | color: @grayLight;
62 | }
63 | &.active,
64 | &.active:hover {
65 | .buttonBackground(@btnPrimaryBackground, spin(@btnPrimaryBackground, 20));
66 | color: #fff;
67 | text-shadow: 0 -1px 0 rgba(0,0,0,.25);
68 | }
69 | span {
70 | display: block;
71 | width: 47px;
72 | height: 54px;
73 | line-height: 54px;
74 | float: left;
75 | margin: 2px;
76 | cursor: pointer;
77 | .border-radius(4px);
78 | &:hover {
79 | background: @grayLighter;
80 | }
81 | &.active {
82 | .buttonBackground(@btnPrimaryBackground, spin(@btnPrimaryBackground, 20));
83 | color: #fff;
84 | text-shadow: 0 -1px 0 rgba(0,0,0,.25);
85 | }
86 | &.old {
87 | color: @grayLight;
88 | }
89 | }
90 | }
91 |
92 | th {
93 | &.switch {
94 | width: 145px;
95 | }
96 | &.next,
97 | &.prev {
98 | font-size: @baseFontSize * 1.5;
99 | }
100 | }
101 |
102 | thead tr:first-child th {
103 | cursor: pointer;
104 | &:hover{
105 | background: @grayLighter;
106 | }
107 | }
108 | /*.dow {
109 | border-top: 1px solid #ddd !important;
110 | }*/
111 | }
112 | .input-append,
113 | .input-prepend {
114 | &.date {
115 | .add-on i {
116 | display: block;
117 | cursor: pointer;
118 | width: 16px;
119 | height: 16px;
120 | }
121 | }
122 | }
--------------------------------------------------------------------------------
/wye/static/img/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/img/favicon.ico
--------------------------------------------------------------------------------
/wye/static/img/home/banner.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/img/home/banner.jpg
--------------------------------------------------------------------------------
/wye/static/img/logo_python_express.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/img/logo_python_express.png
--------------------------------------------------------------------------------
/wye/static/img/logo_python_express_monochrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/img/logo_python_express_monochrome.png
--------------------------------------------------------------------------------
/wye/static/img/supporter/fsmk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/img/supporter/fsmk.png
--------------------------------------------------------------------------------
/wye/static/img/supporter/psf-logo-372x84-alpha.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/img/supporter/psf-logo-372x84-alpha.png
--------------------------------------------------------------------------------
/wye/static/img/supporter/psf-logo-narrow-256x84-alpha.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/img/supporter/psf-logo-narrow-256x84-alpha.png
--------------------------------------------------------------------------------
/wye/static/img/wye/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/img/wye/favicon.ico
--------------------------------------------------------------------------------
/wye/static/img/wye/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/img/wye/logo.png
--------------------------------------------------------------------------------
/wye/static/img/wye/python_express_logo.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/static/img/wye/python_express_logo.pdf
--------------------------------------------------------------------------------
/wye/static/lead_create_form.js:
--------------------------------------------------------------------------------
1 | $(document).ready(function(){
2 | $('#id_leads').html('');
3 | $('#id_location').change(function(){
4 | l_id =$(this).val();
5 | request_url = '/region/lead/get_leads/' + l_id + '/';
6 | $.ajax({
7 | url: request_url,
8 | success: function(data){
9 | data = $.parseJSON(data);
10 | $('#id_leads').html('');
11 | for(var i=0; i' + data[i][1] +'');
13 | }
14 | }
15 | })
16 | })
17 | })
18 |
--------------------------------------------------------------------------------
/wye/static/sass/_custom.scss:
--------------------------------------------------------------------------------
1 | .navbar, .navbar-nav {
2 | border-radius: 0;
3 | border: none;
4 | }
5 | .navbar-default {
6 | box-shadow: 0 1px 5px rgba(0,0,0,0.3);
7 | }
8 | .navbar-default .navbar-nav>li>a, .navbar-default .navbar-text {
9 | color: $dark;
10 | font-size: 1em;
11 | &:hover {
12 | color: $gray-text;
13 | }
14 | }
15 | .btn {
16 | font-weight: 200;
17 | }
18 |
19 | @media screen and (min-width: 768px) {
20 | .navbar-nav>li>a.nav-btn {
21 | background: $theme;
22 | border: 1px solid darken($theme, 6%);
23 | color: $dark;
24 | margin: 10px 0;
25 | border-radius: 0.2em;
26 | padding: 4px 15px;
27 | &:hover {
28 | background-color: darken($theme, 10%);
29 | border-color: darken($theme, 16%);
30 | color: $dark;
31 | }
32 | }
33 | .navbar-default .navbar-nav>li>a.active {
34 | border-bottom: 5px solid $theme;
35 | background-color: $color__bg--silver;
36 | padding-bottom: 10px;
37 | }
38 | .navbar-nav>li>a.user-dropdown {
39 | padding-top: 10px;
40 | padding-bottom: 10px;
41 | span, i {
42 | vertical-align: middle;
43 | }
44 | }
45 | }
46 | @media screen and (max-width: 768px) {
47 | .navbar-default {
48 | box-shadow: none;
49 | }
50 | .navbar-default .navbar-collapse {
51 | background: white;
52 | width: 20em;
53 | right: 0;
54 | float: right;
55 | z-index: 10;
56 | margin-right: 0;
57 | text-align: right;
58 | border-top-color: white;
59 | a {
60 | padding: 10px 2px;
61 | }
62 | ul {
63 | margin: 0;
64 | }
65 | }
66 | .navbar-nav .open .dropdown-menu>li>a {
67 | text-align: right;
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/wye/static/sass/_forms.scss:
--------------------------------------------------------------------------------
1 | form {
2 | p {
3 | overflow: hidden;
4 | clear: both;
5 | }
6 | input[type=text], input[type=url], input[type=email], input[type=password], input[type=number], input[type=file], textarea, select {
7 | background: $form-input-bg;
8 | border: none;
9 | line-height: 1.7;
10 | padding: 0 0.5em;
11 | border-radius: 0.2em;
12 | float: right;
13 | width: 70%;
14 | &:focus {
15 | outline: none;
16 | }
17 | }
18 | label {
19 | width: 30%;
20 | }
21 | }
22 | .errorlist {
23 | background-color: #f2dede;
24 | border: 1px solid #ebccd1;
25 | color: #a94442;
26 | padding: 0.5em 1em;
27 | border-radius: 4px;
28 | li {
29 | list-style-type: none;
30 | .errorlist {
31 | border: none;
32 | padding: 0;
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/wye/static/sass/_layout.scss:
--------------------------------------------------------------------------------
1 | @mixin genspacer($name, $value) {
2 | .space-#{$name}, .space-#{$name}-top {
3 | margin-top: #{$value};
4 | }
5 | .space-#{$name}, .space-#{$name}-bottom {
6 | margin-bottom: #{$value};
7 | }
8 | .push-#{$name}, .push-#{$name}-top {
9 | padding-top: #{$value};
10 | }
11 | .push-#{$name}, .push-#{$name}-bottom {
12 | padding-bottom: #{$value};
13 | }
14 | .gap-#{$name}, .gap-#{$name}-left {
15 | margin-left: #{$value};
16 | }
17 | .gap-#{$name}, .gap-#{$name}-right {
18 | margin-right: #{$value};
19 | }
20 | .pad-#{$name}, .pad-#{$name}-left {
21 | padding-left: #{$value};
22 | }
23 | .pad-#{$name}, .pad-#{$name}-right {
24 | padding-right: #{$value};
25 | }
26 | }
27 |
28 | @mixin genspacer_size($size, $name, $value) {
29 | .gap-#{$size}-#{$name}, .gap-#{$size}-#{$name}-left {
30 | margin-left: #{$value};
31 | }
32 | .gap-#{$size}-#{$name}, .gap-#{$size}-#{$name}-right {
33 | margin-right: #{$value};
34 | }
35 | .pad-#{$size}-#{$name}, .pad-#{$size}-#{$name}-left {
36 | padding-left: #{$value};
37 | }
38 | .pad-#{$size}-#{$name}, .pad-#{$size}-#{$name}-right {
39 | padding-right: #{$value};
40 | }
41 | }
42 |
43 | @for $i from 0 through 10 {
44 | @include genspacer($i, $i+em)
45 | }
46 |
47 | $extra-spacing-list: (
48 | 'q': 0.25,
49 | 'h': 0.5,
50 | '3q': 0.75,
51 | '1h': 1.5,
52 | '2h': 2.5
53 | );
54 |
55 | @each $name, $value in $extra-spacing-list {
56 | @include genspacer($name, $value+em)
57 | }
58 |
59 | @media (max-width: 767px) {
60 | @for $i from 0 through 10 {
61 | @include genspacer_size('xs', $i, $i+em)
62 | }
63 | @each $name, $value in $extra-spacing-list {
64 | @include genspacer_size('xs', $name, $value+em)
65 | }
66 | }
67 | @media (min-width: 768px) and (max-width: 991px) {
68 | @for $i from 0 through 10 {
69 | @include genspacer_size('sm', $i, $i+em)
70 | }
71 | @each $name, $value in $extra-spacing-list {
72 | @include genspacer_size('sm', $name, $value+em)
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/wye/static/sass/_theme.scss:
--------------------------------------------------------------------------------
1 | $color__bg--silver: #f4f5f7;
2 | $color__text--gray: #848B91;
3 | $color__text--dark: #33384A;
4 | $color__bg--dark: #2E3D4C;
5 | $color__text--spacegray: #88939e;
6 |
7 | .fill-primary { background-color: $primary; color: white; }
8 | .fill-secondary { background-color: $secondary; color: white; }
9 | .fill-tertiary { background-color: $tertiary; color: white; }
10 | .fill-quaternary { background-color: $quaternary; color: white; }
11 | .fill-white { background-color: white; }
12 | .fill-theme { background-color: $theme; color: $dark; }
13 | .fill-theme-alt { background-color: lighten($theme, 10%); color: $dark; }
14 | .fill-light { background-color: #F5F5F5; }
15 | .fill-silver { background-color: #f4f5f7; }
16 | .white { color: white; }
17 | .gray { color: $gray-text; }
18 | .primary { color: $primary; }
19 | .secondary { color: $secondary; }
20 | .tertiary { color: $tertiary; }
21 |
22 | .github {
23 | color: $github;
24 | }
25 | .twitter {
26 | color: $twitter;
27 | }
28 | .facebook{
29 | color: $facebook;
30 | }
31 | .googleplus {
32 | color: $googleplus;
33 | }
34 | .linkedin {
35 | color: $linkedin;
36 | }
37 | .github {
38 | color: $github;
39 | }
40 | .slideshare {
41 | color: $slideshare;
42 | }
43 | .reddit {
44 | color: $reddit;
45 | }
46 | .bitbucket {
47 | color: $bitbucket;
48 | }
49 | .stackoverflow {
50 | color: $stackoverflow;
51 | }
52 |
--------------------------------------------------------------------------------
/wye/static/sass/_typography.scss:
--------------------------------------------------------------------------------
1 | body {
2 | font-size: 14px;
3 | line-height: 24px;
4 | font-family: 'Open Sans', sans-serif;
5 | font-weight: normal;
6 | }
7 |
8 | p {
9 | color: #848B91;
10 | font-size: 1.1em;
11 | line-height: 1.7;
12 | }
13 | .title-type {
14 | font-family: 'Alegreya Sans', serif;
15 | }
16 |
17 | .huge { font-size: 3em; }
18 | .extralarge { font-size: 2.5em; line-height: 1.4; }
19 | .large { font-size: 2em; line-height: 1.4; }
20 | .legible { font-size: 1.2em; line-height: 1.7; }
21 | .regular { font-size: 1em; line-height: 1.5; }
22 | .tiny { font-size: 0.8em; }
23 |
24 | .extrabold { font-weight: 800; }
25 | .bold { font-weight: 700; }
26 | .semibold { font-weight: 600; }
27 | .regular { font-weight: 400; }
28 | .light { font-weight: 300; }
29 |
30 | .all-caps {
31 | text-transform: uppercase;
32 | }
33 | @media screen and (max-width: 768px) {
34 | header[role="banner"] h1{
35 | font-size: 1.5em;
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/wye/static/sass/_utils.scss:
--------------------------------------------------------------------------------
1 | .table-clickable {
2 | .clickable-row {
3 | cursor: pointer;
4 | &:hover {
5 | background: rgba($theme, 0.8);
6 | color: $secondary;
7 | }
8 | }
9 | }
10 | .truncate {
11 | text-overflow: ellipsis;
12 | overflow: hidden;
13 | white-space: nowrap;
14 | }
15 | .list-silent {
16 | list-style-type: none;
17 | }
18 | .flushright { float: right; }
19 | .flushleft { float: left; }
20 | .contain-width {
21 | width: 100%;
22 | }
23 |
24 | .vertical-center {
25 | position: relative;
26 | top: 50%;
27 | transform: translateY(-50%);
28 | }
29 | .relative {
30 | position: relative;
31 | }
32 | .block {
33 | display: block;
34 | }
35 |
36 | .panel {
37 | &-container {
38 | display: block;
39 | @media (min-width: 768px) {
40 | display: table;
41 | }
42 | }
43 | &-half {
44 | width: 100%;
45 | display: block;
46 | table-layout: fixed;
47 | @media (min-width: 768px) {
48 | width: 50%;
49 | display: table-cell;
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/wye/static/sass/_vars.scss:
--------------------------------------------------------------------------------
1 | $primary: #00A8C6;
2 | $secondary: #397D9F;
3 | $tertiary: #48586F;
4 | $quaternary: #3A3C55;
5 |
6 | $primary-alt: #029FBB;
7 | $secondary-alt: #337190;
8 | $tertiary-alt: #3A495F;
9 |
10 | $theme: #FBE673;
11 | $gray-text: #7B838C;
12 | $dark: #353C3C;
13 | $light: #F5F5F5;
14 |
15 | $form-input-bg: #efefef;
16 |
17 | $mail: #FF9652;
18 | $twitter: #00ACED;
19 | $facebook: #3A5897;
20 | $googleplus: #DC4A38;
21 | $linkedin: #0274B3;
22 | $github: #222222;
23 | $slideshare: #5BA6A8;
24 | $reddit: #FF5600;
25 | $bitbucket: #1F5081;
26 | $stackoverflow: #F98906;
27 |
--------------------------------------------------------------------------------
/wye/static/sass/components/_box.scss:
--------------------------------------------------------------------------------
1 | .statbox {
2 | width: 100%;
3 | margin: 0.5em;
4 | border-radius: 0.3em;
5 | color: white;
6 | padding: 1em 1.3em;
7 | margin-top: 1em;
8 | margin-bottom: 1em;
9 | &__count {
10 | font-size: 2.5em;
11 | padding-bottom: 0.3em;
12 | }
13 | &__label {
14 | font-weight: 300;
15 | }
16 | &--1 {
17 | background-color: $primary;
18 | }
19 | &--2 {
20 | background-color: $secondary;
21 | }
22 | &--3 {
23 | background-color: $tertiary;
24 | }
25 | &--4 {
26 | background-color: $quaternary;
27 | }
28 | }
29 |
30 | .featurebox {
31 | padding: 2em 1em;
32 | &__icon {
33 | width: 9em;
34 | margin: auto auto 1em auto;
35 | object {
36 | width: 100%;
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/wye/static/sass/components/_button.scss:
--------------------------------------------------------------------------------
1 | .btn-theme {
2 | padding: 0.5em 2em;
3 | font-size: 1.1em;
4 | background-color: $theme;
5 | border-color: $theme;
6 | color: $dark;
7 | &:hover {
8 | background-color: darken($theme, 10%);
9 | border-color: $theme;
10 | color: $dark;
11 | }
12 |
13 | &-primary {
14 | background-color: $primary;
15 | border-color: $primary;
16 | color: white;
17 | &:hover {
18 | background-color: $primary-alt;
19 | border-color: $primary-alt;
20 | color: white;
21 | }
22 | }
23 | &-secondary {
24 | background-color: $secondary;
25 | border-color: $secondary;
26 | color: white;
27 | &:hover {
28 | background-color: $secondary-alt;
29 | border-color: $secondary-alt;
30 | color: white;
31 | }
32 | }
33 | &-tertiary {
34 | background-color: $tertiary;
35 | border-color: $tertiary;
36 | color: white;
37 | &:hover {
38 | background-color: $tertiary-alt;
39 | border-color: $tertiary-alt;
40 | color: white;
41 | }
42 | }
43 | &-dark {
44 | background-color: $dark;
45 | border-color: $dark;
46 | color: white;
47 | &:hover {
48 | background-color: $theme;
49 | border-color: $theme;
50 | color: $dark;
51 | }
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/wye/static/sass/components/_card.scss:
--------------------------------------------------------------------------------
1 | .eventcard {
2 | // border: 2px solid darken($color__bg--silver, 5%);
3 | border: 2px solid lighten($theme, 15%);
4 | padding: 1.5em;
5 | margin-bottom: 2em;
6 | border-radius: 0.3em;
7 | text-align: center;
8 | &:hover {
9 | background-color: rgba($theme, 0.2);
10 | border: 2px solid $theme;
11 | }
12 | &__icon {
13 | width: 1.2em;
14 | display: none;
15 | color: darken($color__bg--silver, 40%);
16 | }
17 | &__topic {}
18 | &__date {}
19 | &__location {}
20 | &__level {
21 | background-color: $color__bg--silver;
22 | color: $dark;
23 | }
24 | &__speaker {}
25 | }
26 |
--------------------------------------------------------------------------------
/wye/static/sass/pages/_faq.scss:
--------------------------------------------------------------------------------
1 | .faq {
2 | &__list {
3 | padding-left: 1.5em;
4 | font-weight: 600;
5 | }
6 | &__question {
7 | font-size: 1.2em;
8 | padding-bottom: 0.5em;
9 | padding-top: 0.5em;
10 | }
11 | &__answer {
12 | font-weight: 400;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/wye/static/sass/pages/_home.scss:
--------------------------------------------------------------------------------
1 | .masthead {
2 | background-image: linear-gradient(rgba(72, 88, 111, 0.7), rgba(72, 88, 111, 0.7)), url('../img/home/banner.jpg');
3 | background-size: cover;
4 | color: white;
5 | height: 30em;
6 | }
7 | .intro {
8 | &__text {
9 | font-size: 1em;
10 | color: $color__text--gray;
11 | }
12 | &__stats {
13 | padding: 2em 0;
14 | }
15 | }
16 | .testimonial {
17 | &__block {
18 | padding: 0.5em 0;
19 | }
20 | &__quote {
21 | font-style: italic;
22 | font-weight: 300;
23 | }
24 | &__icon {
25 | color: $primary;
26 | width: 2em;
27 | }
28 | }
29 | .blog-highlights {
30 | &__link {
31 | color: $color__bg--silver;
32 | &:hover, &:active, &:focus {
33 | color: $theme;
34 | }
35 | }
36 | }
37 | .twitter-widget {
38 | // background-color: $theme;
39 | }
40 |
--------------------------------------------------------------------------------
/wye/templates/403.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% block content %}
3 | Not Found
4 |
5 | Permission Denied
6 |
7 | {% endblock %}
--------------------------------------------------------------------------------
/wye/templates/404.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% block content %}
3 | Not Found
4 |
5 | The web page you are looking for is not found on the server.
6 |
7 | {% endblock %}
--------------------------------------------------------------------------------
/wye/templates/500.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% block content %}
3 | Oops!
4 |
5 | Sorry, something went wrong.
6 | We've emailed the error to the webmaster. Please try again after a while.
7 |
8 | {% endblock %}
--------------------------------------------------------------------------------
/wye/templates/about.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% block title %}About | {{ block.super }}{% endblock %}
3 |
4 | {% block header %}
5 |
6 |
About
7 |
8 | {% endblock %}
9 |
10 | {% block content %}
11 |
12 |
In the month of August 2013, just before the annual PyCon India conference, a bunch of volunteers came together and decided to spread the love of Python far and wide. A lot of colleges and instructors came together conducting numerous workshops, and we celebrated that month as the PythonMonth .
13 |
The response and enthusiasm was tremendous. The energy kept on flowing, inevitably leading to the thought that if people wanted to learn, and there were people ready to teach, why restrict ourselves to just one month? PythonExpress was born from that thought.
14 |
PythonExpress is an ongoing effort that aims to connect tutors, organizations and students. The ultimate goal behind this project is to create an avenue for the ones who want to learn, to come together with the ones who can teach, thereby helping to improve one's existing knowledge in Python as well as helping one to get a kickstart into the world of Python.
15 |
The exposure that the students gain from the workshops is more than just about Python as a programming language. It is also about the Python community. A community known around the world for its friendly and welcoming nature.
16 |
Last but not the least, we teach Python because we want to, and we love to.
17 |
18 | {% endblock %}
19 |
--------------------------------------------------------------------------------
/wye/templates/account/account_inactive.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 | {% load i18n %}
4 |
5 | {% block title %}{% trans "Account Inactive" %}{% endblock %}
6 |
7 | {% block content %}
8 |
9 |
10 |
11 |
12 |
{% trans "Account Inactive" %}
13 |
14 |
{% trans "This account is inactive." %}
15 |
16 |
17 |
18 |
19 |
20 | {% endblock %}
21 |
--------------------------------------------------------------------------------
/wye/templates/account/base.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 |
4 |
--------------------------------------------------------------------------------
/wye/templates/account/email/email_confirmation_message.txt:
--------------------------------------------------------------------------------
1 | {% load account %}{% user_display user as user_display %}{% load i18n %}{% autoescape off %}{% blocktrans with site_name=current_site.name site_domain=current_site.domain %}Hello from {{ site_name }}!
2 |
3 | You're receiving this e-mail because user {{ user_display }} at {{ site_domain }} has given yours as an e-mail address to connect their account.
4 |
5 | To confirm this is correct, go to {{ activate_url }}
6 | {% endblocktrans %}{% endautoescape %}
7 | {% blocktrans with site_name=current_site.name site_domain=current_site.domain %}Thank you from {{ site_name }}!
8 | {{ site_domain }}{% endblocktrans %}
9 |
--------------------------------------------------------------------------------
/wye/templates/account/email/email_confirmation_signup_message.txt:
--------------------------------------------------------------------------------
1 | {% include "account/email/email_confirmation_message.txt" %}
2 |
--------------------------------------------------------------------------------
/wye/templates/account/email/email_confirmation_signup_subject.txt:
--------------------------------------------------------------------------------
1 | {% include "account/email/email_confirmation_subject.txt" %}
2 |
--------------------------------------------------------------------------------
/wye/templates/account/email/email_confirmation_subject.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% autoescape off %}
3 | {% blocktrans %}Please Confirm Your E-mail Address{% endblocktrans %}
4 | {% endautoescape %}
5 |
--------------------------------------------------------------------------------
/wye/templates/account/email/password_reset_key_message.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}{% blocktrans with site_name=site.name site_domain=site.domain %}Hello from {{ site_name }}!
2 |
3 | You're receiving this e-mail because you or someone else has requested a password for your user account at {{ site_domain }}.
4 | It can be safely ignored if you did not request a password reset. Click the link below to reset your password.{% endblocktrans %}
5 |
6 | {{ password_reset_url }}
7 |
8 | {% if username %}{% blocktrans %}In case you forgot, your username is {{ username }}.{% endblocktrans %}
9 |
10 | {% endif %}{% blocktrans with site_name=site.name site_domain=site.domain %}Thank you for using {{ site_name }}!
11 | {{ site_domain }}{% endblocktrans %}
12 |
--------------------------------------------------------------------------------
/wye/templates/account/email/password_reset_key_subject.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% autoescape off %}
3 | {% blocktrans %}Password Reset E-mail{% endblocktrans %}
4 | {% endautoescape %}
--------------------------------------------------------------------------------
/wye/templates/account/email_confirm.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 | {% load i18n %}
4 | {% load account %}
5 |
6 | {% block title %}{% trans "Confirm E-mail Address" %}{% endblock %}
7 |
8 | {% block content %}
9 |
10 |
11 |
12 |
13 |
{% trans "Confirm E-mail Address" %}
14 |
15 | {% if confirmation %}
16 | {% user_display confirmation.email_address.user as user_display %}
17 |
{% blocktrans with confirmation.email_address.email as email %}Please confirm that {{ email }} is an e-mail address for user {{ user_display }}.{% endblocktrans %}
18 |
22 | {% else %}
23 | {% url 'account_email' as email_url %}
24 |
{% blocktrans %}This e-mail confirmation link expired or is invalid. Please issue a new e-mail confirmation request .{% endblocktrans %}
25 | {% endif %}
26 |
27 |
28 |
29 |
30 |
31 | {% endblock %}
32 |
--------------------------------------------------------------------------------
/wye/templates/account/email_confirmed.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 | {% load i18n %}
4 | {% load account %}
5 |
6 | {% block title %}{% trans "Confirm E-mail Address" %}{% endblock %}
7 |
8 | {% block content %}
9 |
10 |
11 |
12 |
13 |
{% trans "Confirm E-mail Address" %}
14 |
15 | {% user_display confirmation.email_address.user as user_display %}
16 |
{% blocktrans with confirmation.email_address.email as email %}You have confirmed that {{ email }} is an e-mail address for user {{ user_display }}.{% endblocktrans %}
17 |
18 |
19 |
20 |
21 |
22 | {% endblock %}
23 |
--------------------------------------------------------------------------------
/wye/templates/account/logout.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 | {% load i18n %}
4 |
5 | {% block title %}{% trans "Sign Out" %}{% endblock %}
6 |
7 | {% block content %}
8 |
9 |
10 |
11 |
12 |
{% trans "Sign Out" %}
13 |
14 |
{% trans 'Are you sure you want to sign out?' %}
15 |
22 |
23 |
24 |
25 |
26 |
27 | {% endblock %}
28 |
--------------------------------------------------------------------------------
/wye/templates/account/messages/cannot_delete_primary_email.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% blocktrans %}You cannot remove your primary e-mail address ({{email}}).{% endblocktrans %}
3 |
--------------------------------------------------------------------------------
/wye/templates/account/messages/email_confirmation_sent.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% blocktrans %}Confirmation e-mail sent to {{email}}.{% endblocktrans %}
3 |
--------------------------------------------------------------------------------
/wye/templates/account/messages/email_confirmed.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% blocktrans %}You have confirmed {{email}}.{% endblocktrans %}
3 |
--------------------------------------------------------------------------------
/wye/templates/account/messages/email_deleted.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% blocktrans %}Removed e-mail address {{email}}.{% endblocktrans %}
3 |
--------------------------------------------------------------------------------
/wye/templates/account/messages/logged_in.txt:
--------------------------------------------------------------------------------
1 | {% load account %}
2 | {% load i18n %}
3 | {% user_display user as name %}
4 | {% blocktrans %}Successfully signed in as {{name}}.{% endblocktrans %}
5 |
--------------------------------------------------------------------------------
/wye/templates/account/messages/logged_out.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% blocktrans %}You have signed out.{% endblocktrans %}
3 |
--------------------------------------------------------------------------------
/wye/templates/account/messages/password_changed.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% blocktrans %}Password successfully changed.{% endblocktrans %}
3 |
4 |
--------------------------------------------------------------------------------
/wye/templates/account/messages/password_set.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% blocktrans %}Password successfully set.{% endblocktrans %}
3 |
4 |
--------------------------------------------------------------------------------
/wye/templates/account/messages/primary_email_set.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% blocktrans %}Primary e-mail address set.{% endblocktrans %}
3 |
--------------------------------------------------------------------------------
/wye/templates/account/messages/unverified_primary_email.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% blocktrans %}Your primary e-mail address must be verified.{% endblocktrans %}
3 |
--------------------------------------------------------------------------------
/wye/templates/account/password_change.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 | {% load i18n %}
4 |
5 | {% block title %}{% trans "Change Password" %}{% endblock %}
6 |
7 | {% block content %}
8 |
9 |
10 |
11 |
12 |
{% trans "Change Password" %}
13 |
14 |
19 |
20 |
21 |
22 |
23 |
24 | {% endblock %}
25 |
--------------------------------------------------------------------------------
/wye/templates/account/password_reset.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 | {% load i18n %}
4 | {% load account %}
5 |
6 | {% block title %}{% trans "Password Reset" %}{% endblock %}
7 |
8 | {% block content %}
9 |
10 |
11 |
12 |
13 |
{% trans "Password Reset" %}
14 |
15 | {% if user.is_authenticated %}
16 | {% include "account/snippets/already_logged_in.html" %}
17 | {% endif %}
18 |
19 |
{% trans "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it." %}
20 |
21 |
28 |
29 |
32 |
33 |
34 |
35 |
36 | {% endblock %}
37 |
--------------------------------------------------------------------------------
/wye/templates/account/password_reset_done.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 | {% load i18n %}
4 | {% load account %}
5 |
6 | {% block title %}{% trans "Password Reset" %}{% endblock %}
7 |
8 | {% block content %}
9 |
10 |
11 |
12 |
13 |
{% trans "Password Reset" %}
14 |
15 | {% if user.is_authenticated %}
16 | {% include "account/snippets/already_logged_in.html" %}
17 | {% endif %}
18 |
19 |
{% blocktrans %}We have sent you an e-mail. Please contact us if you do not receive it within a few minutes.{% endblocktrans %}
20 |
21 |
22 |
23 |
24 |
25 | {% endblock %}
26 |
--------------------------------------------------------------------------------
/wye/templates/account/password_reset_from_key.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 | {% load i18n %}
4 | {% block title %}{% trans "Change Password" %}{% endblock %}
5 |
6 | {% block content %}
7 |
8 |
9 |
10 |
11 |
{% if token_fail %}{% trans "Bad Token" %}{% else %}{% trans "Change Password" %}{% endif %}
12 |
13 | {% if token_fail %}
14 | {% url 'account_reset_password' as passwd_reset_url %}
15 |
{% blocktrans %}The password reset link was invalid, possibly because it has already been used. Please request a new password reset .{% endblocktrans %}
16 | {% else %}
17 | {% if form %}
18 |
23 | {% else %}
24 |
{% trans 'Your password is now changed.' %}
25 | {% endif %}
26 | {% endif %}
27 |
28 |
29 |
30 |
31 |
32 | {% endblock %}
33 |
--------------------------------------------------------------------------------
/wye/templates/account/password_reset_from_key_done.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 | {% load i18n %}
4 | {% block title %}{% trans "Change Password" %}{% endblock %}
5 |
6 | {% block content %}
7 |
8 |
9 |
10 |
11 |
{% trans "Change Password" %}
12 |
13 |
{% trans 'Your password is now changed.' %}
14 |
15 |
16 |
17 |
18 |
19 | {% endblock %}
20 |
--------------------------------------------------------------------------------
/wye/templates/account/password_set.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 | {% load i18n %}
4 |
5 | {% block title %}{% trans "Set Password" %}{% endblock %}
6 |
7 | {% block content %}
8 |
9 |
10 |
11 |
12 |
{% trans "Set Password" %}
13 |
14 |
19 |
20 |
21 |
22 |
23 |
24 | {% endblock %}
25 |
--------------------------------------------------------------------------------
/wye/templates/account/signup.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 | {% load i18n %}
4 |
5 | {% block title %}{% trans "Signup" %}{% endblock %}
6 |
7 | {% block content %}
8 |
9 |
10 |
11 |
12 |
Sign Up
13 |
27 |
30 |
31 |
32 |
33 |
34 | {% endblock %}
35 |
--------------------------------------------------------------------------------
/wye/templates/account/signup_closed.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 | {% load i18n %}
4 |
5 | {% block title %}{% trans "Sign Up Closed" %}{% endblock %}
6 |
7 | {% block content %}
8 |
9 |
10 |
11 |
12 |
{% trans "Sign Up Closed" %}
13 |
14 |
{% trans "We are sorry, but the sign up is currently closed." %}
15 |
16 |
17 |
18 |
19 |
20 | {% endblock %}
21 |
--------------------------------------------------------------------------------
/wye/templates/account/snippets/already_logged_in.html:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% load account %}
3 |
4 | {% user_display user as user_display %}
5 | {% trans "Note" %}: {% blocktrans %}you are already logged in as {{ user_display }}.{% endblocktrans %}
6 |
--------------------------------------------------------------------------------
/wye/templates/account/verification_sent.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 | {% load i18n %}
4 |
5 | {% block title %}{% trans "Verify Your E-mail Address" %}{% endblock %}
6 |
7 | {% block content %}
8 |
9 |
10 |
11 |
12 |
{% trans "Verify Your E-mail Address" %}
13 |
14 |
{% blocktrans %}We have sent an e-mail to you for verification. Follow the link provided to finalize the signup process. Please contact us if you do not receive it within a few minutes.{% endblocktrans %}
15 |
16 |
17 |
18 |
19 |
20 | {% endblock %}
21 |
--------------------------------------------------------------------------------
/wye/templates/account/verified_email_required.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 | {% load i18n %}
4 |
5 | {% block title %}{% trans "Verify Your E-mail Address" %}{% endblock %}
6 |
7 | {% block content %}
8 |
9 |
10 |
11 |
12 |
{% trans "Verify Your E-mail Address" %}
13 |
14 | {% url 'account_email' as email_url %}
15 |
16 |
{% blocktrans %}This part of the site requires us to verify that
17 | you are who you claim to be. For this purpose, we require that you
18 | verify ownership of your e-mail address. {% endblocktrans %}
19 |
20 |
{% blocktrans %}We have sent an e-mail to you for
21 | verification. Please click on the link inside this e-mail. Please
22 | contact us if you do not receive it within a few minutes.{% endblocktrans %}
23 |
24 |
{% blocktrans %}Note: you can still change your e-mail address .{% endblocktrans %}
25 |
26 |
27 |
28 |
29 |
30 | {% endblock %}
31 |
--------------------------------------------------------------------------------
/wye/templates/auth/login.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% block title %}Login | Pythonexpress{% endblock %}
3 |
4 | {% block content %}
5 |
6 |
7 |
8 |
Login
9 |
10 | {% if form.errors %}
11 | {% for field in form %}
12 | {% if field.errors %}
13 | {{ field.label_tag }}: {{ field.errors }}
14 | {% endif %}
15 | {% endfor %}
16 | {{ form.non_field_errors }}
17 | {% endif %}
18 |
19 |
29 |
30 |
31 |
32 |
33 | {% endblock %}
34 |
--------------------------------------------------------------------------------
/wye/templates/auth/logout.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block head_title %}Sign out{% endblock %}
4 |
5 | {% block content %}
6 |
23 | {% endblock %}
24 |
25 |
26 |
--------------------------------------------------------------------------------
/wye/templates/auth/signup.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% block title %}Signup | Pythonexpress{% endblock %}
3 |
4 | {% block content %}
5 |
6 |
7 |
8 |
Sign Up
9 |
10 |
20 |
21 | {% if form.errors %}
22 | {% for field in form %}
23 | {% if field.errors %}
24 | {{ field.label_tag }}: {{ field.errors }}
25 | {% endif %}
26 | {% endfor %}
27 | {{ form.non_field_errors }}
28 | {% endif %}
29 |
30 |
40 |
41 |
42 |
43 | {% endblock %}
44 |
--------------------------------------------------------------------------------
/wye/templates/contact.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block header %}
4 |
5 |
{% if form %}Contact Us{% else %}Thank You {% endif %}
6 |
7 | {% endblock %}
8 |
9 | {% block content %}
10 |
11 |
12 |
13 | {% if form %}
14 |
19 | {% else %}
20 | Your response has been recorded. We will get in touch with you shortly.
21 | {% endif %}
22 |
23 |
24 |
25 | {% endblock %}
26 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/contactus/message.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 | {% block header_content %}
4 | New Feedback
5 | {% endblock %}
6 |
7 |
8 | {% block content_body %}
9 | {% block content %}
10 | Hi all,
11 | We have received feedback from {{contact_name}}. Requesting to respective Regional or Admin members to reply and inform all on the action taken.
12 |
13 | Email : {{contact_email}}
14 | Feedback Type : {{feedback_type}}
15 | Contact Number : {{conatct_number}}
16 | Comments : {{comments}}
17 |
18 | May the love of Python spread far and wide!
19 | Warmly,
20 | The PythonExpress team
21 | {% endblock %}
22 | {% endblock %}
23 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/contactus/message.txt:
--------------------------------------------------------------------------------
1 | Hi all,
2 | We have received feedback from {{contact_name}}. Requesting to respective Regional or Admin members to reply and inform all on the action taken.
3 |
4 | Email : {{contact_email}}
5 | Feedback Type : {{feedback_type}}
6 | Contact Number : {{conatct_number}}
7 | Comments : {{comments}}
8 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/contactus/message_user.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 | {% block header_content %}
4 | New Feedback Confirmation
5 | {% endblock %}
6 |
7 | {% block content_body %}
8 | {% block content %}
9 | Hey {{contact_name}},
10 | We have received your feedback. Someone from our team will get in touch with you shortly.
11 | May the love of Python spread far and wide!
12 | Warmly,
13 | The PythonExpress team
14 | {% endblock %}
15 | {% endblock %}
16 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/contactus/message_user.txt:
--------------------------------------------------------------------------------
1 | Hey {{contact_name}},
2 |
3 | We have received your feedback. Someone from our team will get in touch with you shortly.
4 |
5 | May the love of Python spread far and wide!
6 | Warmly,
7 | The PythonExpress Team
8 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/organisation/deactivate_request.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 | {% block header_content %}
4 | Deac Organization Confirmation
5 | {% endblock %}
6 |
7 | {% block content_body %}
8 | {% block content %}
9 | Hey {{full_name}},
10 | Thank you so much for being a part of the PythonExpress initiative. We're really sorry to see you go.
11 | If there is anything that we can do to help you or in case you would like to let us know of any grievances, please feel free to drop us a line at contact@pythonexpress.org.
12 | We would like to hear from you.
13 |
14 | Warmly,
15 | The PythonExpress team
16 | {% endblock %}
17 | {% endblock %}
18 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/organisation/deactivate_request.txt:
--------------------------------------------------------------------------------
1 | Hey {{full_name}},
2 |
3 | Thank you so much for being a part of the PythonExpress initiative. We're really sorry to see you go. If there is anything that we can do to help you or in case you would like to let us know of any grievances, please feel free to drop us a line at contact@pythonexpress.org. We would like to hear from you.
4 |
5 | Warmly,
6 | The PythonExpress team
7 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/organisation/member_addition_to_user.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 | {% block header_content %}
4 | New Member Confirmation
5 | {% endblock %}
6 |
7 | {% block content_body %}
8 | {% block content %}
9 | Hey {{full_name}},
10 | You've added {{ new_member_name }} to your organization. {{ new_member_name }} can now access your organization dashboard and manage workshops. Visit your profile to view or update your organization details.
11 | If you have any questions, do visit our FAQ page . If that doesn't answer your question, feel free to drop a line to contact@pythonexpress.org and we'll get back to you.
12 | May the love of Python spread far and wide!
13 | Warmly,
14 | The PythonExpress team
15 | {% endblock %}
16 | {% endblock %}
17 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/organisation/member_addition_to_user.txt:
--------------------------------------------------------------------------------
1 | Hey {{full_name}},
2 |
3 | You've added {{ new_member_name }} to your organization. {{ new_member_name }} can now access your organization dashboard and manage workshops. Visit your profile (link-to-organization-list-page) to view or update your organization details.
4 |
5 | If you have any questions, do visit our FAQ page (link-to-FAQ-page). If that doesn't answer your question, feel free to drop a line to contact@pythonexpress.org and we'll get back to you.
6 |
7 | May the love of Python spread far and wide!
8 |
9 | Warmly,
10 | The PythonExpress team
11 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/organisation/new.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 |
4 | {% block header_content %}
5 | New Organization Confirmation
6 | {% endblock %}
7 |
8 | {% block content_body %}
9 | {% block content %}
10 | Hey {{full_name}},
11 | Thank you for registering your organization on PythonExpress.
12 | We are extremely excited to have you onboard!
13 | Now that you have your profile ready , why not go ahead and announce your first workshop?
14 | As soon as you do that, we'll notify the regional heads and potential teachers about it.
15 | If you have any questions, do visit our FAQ page . If that doesn't answer your question, feel free to drop a line to contact@pythonexpress.org and we'll get back to you.
16 | May the love of Python spread far and wide!
17 | Warmly,
18 | The PythonExpress team
19 | {% endblock %}
20 | {% endblock %}
21 |
22 |
23 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/organisation/new.txt:
--------------------------------------------------------------------------------
1 | Hey {{full_name}},
2 |
3 | Thank you for registering your organization on PythonExpress. We are extremely excited to have you onboard! Now that you have your profile ready (link-to-profile), why not go ahead and announce your first workshop (link-to-create-workshop)? As soon as you do that, we'll notify the regional heads and potential teachers about it.
4 |
5 | If you have any questions, do visit our FAQ page (link-to-faq-page). If that doesn't answer your question, feel free to drop a line to contact@pythonexpress.org and we'll get back to you.
6 |
7 | May the love of Python spread far and wide!
8 | Warmly,
9 | The PythonExpress team
10 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/organisation/org_member_addition.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 | {% block header_content %}
4 | New Member Confirmation
5 | {% endblock %}
6 |
7 | {% block content_body %}
8 | {% block content %}
9 | Hey {{new_member_name}},
10 | You're added to the organization {{ org_name }}.
11 | You can now access the organization dashboard and manage workshops. Visit your profile to view or update your organization details.
12 | {% if token %}
13 | But first you need to create an account, follow this link to create your user account.
14 | {{ host }}{% url "invitation_register" user.id token %}
15 | {% endif %}
16 | If you have any questions, do visit our FAQ page . If that doesn't answer your question, feel free to drop a line to contact@pythonexpress.org and we'll get back to you.
17 | May the love of Python spread far and wide!
18 | Warmly,
19 | The PythonExpress team
20 | {% endblock %}
21 | {% endblock %}
22 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/organisation/org_member_addition.txt:
--------------------------------------------------------------------------------
1 | Hey {{new_member_name}},
2 |
3 | You're added to organization {{ org_name }}.
4 | You can You can now access the organization dashboard and manage workshops. Visit your profile (link-to-organization-list-page) to view or update your organization details.
5 | {% if token %}
6 | But first you need to create an account, follow this link to create your user account.
7 |
8 | {{ host }}{% url "invitation_register" user.id token %}
9 | {% endif %}
10 |
11 | If you have any questions, do visit our FAQ page (link-to-FAQ-page). If that doesn't answer your question, feel free to drop a line to contact@pythonexpress.org and we'll get back to you.
12 |
13 | May the love of Python spread far and wide!
14 |
15 | Warmly,
16 | The PythonExpress team
17 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/partner/message_user.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 |
4 | {% block header_content %}
5 | Partner Request
6 | {% endblock %}
7 |
8 | {% block content_body %}
9 | {% block content %}
10 | Hey {{name}},
11 | We have received your feedback. Someone from our team will get in touch with you shortly.
12 | May the love of Python spread far and wide!
13 | Warmly,
14 | The PythonExpress team
15 | {% endblock %}
16 | {% endblock %}
17 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/partner/message_user.txt:
--------------------------------------------------------------------------------
1 | Hey {{name}},
2 |
3 | We have received your feedback. Someone from our team will get in touch with you shortly.
4 |
5 | May the love of Python spread far and wide!
6 | Warmly,
7 | The PythonExpress Team
8 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/partner/partner_message.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 |
4 | {% block header_content %}
5 | Partner Request
6 | {% endblock %}
7 |
8 | {% block content_body %}
9 | {% block content %}
10 | Hi all,
11 | We have received feedback from {{name}}. Requesting to respective Regional or Admin members to reply and inform all on the action taken.
12 |
13 | Organisation Name: {{org_name}}
14 | Organisation url : {{org_url}}
15 | Partnership Type : {{partner_type}}
16 | Description: {{description}}
17 | Python Usage in organisation : {{python_use}}
18 | Name : {{name}}
19 | Email : {{contact_email}}
20 | Contact Number : {{conatct_number}}
21 | Comments : {{comments}}
22 |
23 | May the love of Python spread far and wide!
24 | Warmly,
25 | The PythonExpress team
26 | {% endblock %}
27 | {% endblock %}
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/partner/partner_message.txt:
--------------------------------------------------------------------------------
1 | Hi all,
2 | We have received feedback from {{name}}. Requesting to respective Regional or Admin members to reply and inform all on the action taken.
3 |
4 | Organisation Name: {{org_name}}
5 | Organisation url : {{org_url}}
6 | Partnership Type : {{partner_type}}
7 | Description: {{description}}
8 | Python Usage in organisation : {{python_use}}
9 | Name : {{name}}
10 | Email : {{contact_email}}
11 | Contact Number : {{conatct_number}}
12 | Comments : {{comments}}
13 |
14 |
15 | May the love of Python spread far and wide!
16 |
17 | Warmly,
18 | The PythonExpress team
19 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/user/new_user_signup.txt:
--------------------------------------------------------------------------------
1 | {% if user.is_presenter %}
2 |
3 | Welcome to the PythonExpress family, oh {{ full_name }}! Wandering Python pedagogues make this community strong and we are only too happy to have you here. Now that you have your profile setup (link-to-user-profile), why not take a look at the workshops that await your kind attention? Check them out here: (link-to-list-of-registered-workshops).
4 |
5 | {% else %}
6 |
7 | Hey {{ full_name }},
8 |
9 | Glad to have you as a part of the PythonExpress family! If you'd like to register your organization in order host workshops, please do go ahead do so here: (link-to-creating-organization). Otherwise if you have Python skills yourself, why not register yourself as a tutor and visit a few colleges? Sounds intriguing? Register as a tutor here: (link-to-registering-as-a-tutor).
10 |
11 | (% endif %}
12 |
13 | In case you have any questions, please do visit our FAQ page (link-to-FAQ-page). If that doesn't answer you, then feel free to drop us a line at contact@pythonexpress.org and we'll get back to you.
14 |
15 | May the love of Python spread far and wide!
16 |
17 | Warmly,
18 | The PythonExpress team.
19 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/assign_me/message.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 | {% block header_content %}
4 | Workshop Accepted
5 | {% endblock %}
6 |
7 | {% block content_body %}
8 | {% block content %}
9 | {% if presenter %}
10 | Hey {{ presenter_name }},
11 |
12 | We're writing in to let you know that the Workshop at {{ workshop_organization }} to be conducted on {{ date }} has been {% if assigned %} assigned to {% else %} unassigned from {% endif %} you.
13 |
14 | Please visit the url below for more information.
15 | {{ workshop_url }}
16 |
17 |
18 | {% else %}
19 | Hello folks!
20 |
21 | Just giving you a heads up. The Workshop you are planning to conduct on {{ date }} has been {% if assigned %} assigned to {% else %} unassigned from {% endif %} {{ presenter_name }}.
22 | Please visit the url below for more information.
23 | {{ workshop_url }}
24 |
25 | {% endif %}
26 | May the love of Python spread far and wide!
27 | Warmly,
28 | The PythonExpress team
29 | {% endblock %}
30 | {% endblock %}
31 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/assign_me/message.txt:
--------------------------------------------------------------------------------
1 | {% if presenter %}
2 | Hey {{ presenter_name }},
3 |
4 | We're writing in to let you know that the Workshop at {{ workshop_organization }} to be conducted on {{ date }} has been {% if assigned %} assigned to {% else %} unassigned from {% endif %} you. Please visit the url below for more information.
5 | {{ workshop_url }}
6 |
7 | {% else %}
8 | Hello folks!
9 |
10 | Just giving you a heads up. The Workshop you are planning to conduct on {{ date }} has been {% if assigned %} assigned to {% else %} unassigned from {% endif %} {{ presenter_name }}. Please visit the url below for more information.
11 | {{ workshop_url }}
12 |
13 | {% endif %}
14 |
15 | Warmly,
16 | The PythonExpress team.
17 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/assign_me/subject.txt:
--------------------------------------------------------------------------------
1 | [PythonExpress] Workshop status - {% if assigned %} Assigned {% else %} Unassigned {% endif %}.
2 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/create_workshop/message.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 | {% block header_content %}
4 | New Workshop request
5 | {% endblock %}
6 |
7 |
8 | {% block content_body %}
9 | {% block content %}
10 | Hello folks!
11 |
12 | Your organization's {{ workshop_topic }} workshop request on {{ date }} has been successfully added! We shall be notifying all the regional leads and potential instructors soon.
13 |
Meanwhile, do visit the url below for more information.
14 | {{ workshop_url }}
15 |
16 | May the love of Python spread far and wide!
17 | Warmly,
18 | The PythonExpress team
19 | {% endblock %}
20 | {% endblock %}
21 |
22 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/create_workshop/message.txt:
--------------------------------------------------------------------------------
1 | Hello folks!
2 |
3 | Your organization's {{ workshop_topic }} workshop request on {{ date }} has been successfully added! We shall be notifying all the regional leads and potential instructors soon. Meanwhile, do visit the url below for more information.
4 | {{ workshop_url }}
5 |
6 | May the love of Python spread far and wide!
7 |
8 | Warmly,
9 | The PythonExpress team.
10 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/feedback_email.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 | {% block header_content %}
4 | Request forFeedback
5 | {% endblock %}
6 |
7 |
8 | {% block content_body %}
9 | {% block content %}
10 | Hello,
11 |
12 | >Hope you had an exciting session. Waiting to hear it from you. Give your feedback on pythonexpress.org
13 |
May the love of Python spread far and wide!
14 | Warmly,
15 | The PythonExpress team
16 | {% endblock %}
17 | {% endblock %}
18 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/feedback_email.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/templates/email_messages/workshop/feedback_email.txt
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/new_workshop.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/templates/email_messages/workshop/new_workshop.txt
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/remainder.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 | {% block header_content %}
4 | Request forFeedback
5 | {% endblock %}
6 |
7 |
8 | {% block content_body %}
9 | {% block content %}
10 | Gentle reminder for PythonExpress workshop !! Namaste
11 |
12 | The workshop on {{workshop_title}} scheduled for {{workshop_date}} by {{trainer}} at {{organiser}}, {{venue}} is a go! If there is any concern / query please feel free to reach out to PythonExpress team via contact@pythonexpress.org
13 |
14 | Let’s have a successful workshop! All the best!
15 | {% endblock %}
16 | {% endblock %}
17 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/remainder.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/templates/email_messages/workshop/remainder.txt
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/students/certificate_created.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 | {% block header_content %}
4 | Intro for Workshop
5 | {% endblock %}
6 |
7 | {% block content_body %}
8 | {% block content %}
9 |
10 |
11 | Hello ,
12 | Greetings!
13 | Certificate of participation for student {{full_name}} is attached here in the email. Request you to hand this over to the concerned student.
14 |
15 | May the love of Python spread far and wide!
16 | Warmly,
17 | The PythonExpress team
18 |
19 |
20 |
21 | {% endblock %}
22 | {% endblock %}
23 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/students/certificate_created.txt:
--------------------------------------------------------------------------------
1 | Hello ,
2 | Greetings!
3 | Certificate of participation for student {{full_name}} is attached here in the email. Request you to hand this over to the concerned student.
4 |
5 | May the love of Python spread far and wide!
6 | Warmly,
7 | The PythonExpress team
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/students/welcome.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 | {% block header_content %}
4 | Intro for Workshop
5 | {% endblock %}
6 |
7 | {% block content_body %}
8 | {% block content %}
9 |
10 |
11 | Hello {{ full_name }},
12 | Welcome to PythonExpress family!
13 | Hope the {{workshop_section}} workshop held on {{workshop_date}} was a good learning experience.
14 | Your "Certificate of Participation" is available to download.
15 | Please log into https://pythonexpress.org and download certificate from My Profile page. For more details refer FAQ
16 | May the love of Python spread far and wide!
17 | Warmly,
18 | The PythonExpress team
19 |
20 |
21 |
22 | {% endblock %}
23 | {% endblock %}
24 |
25 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/students/welcome.txt:
--------------------------------------------------------------------------------
1 | Hello {{ full_name }},
2 |
3 | Welcome to PythonExpress family!
4 | Hope the {{workshop_section}} workshop held on {{workshop_date}} was a good learning experience.
5 | Your "Certificate of Participation" is available to download.
6 | Please log into https://pythonexpress.org and download certificate from My Profile page. For more details refer http://pythonexpress.org/faq/
7 | May the love of Python spread far and wide!
8 |
9 | Warmly,
10 | The PythonExpress team
11 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/workshop_intro_email.html:
--------------------------------------------------------------------------------
1 | {% extends "email_messages/layout.html" %}
2 |
3 | {% block header_content %}
4 | Intro for Workshop
5 | {% endblock %}
6 |
7 | {% block content_body %}
8 | {% block content %}
9 |
10 |
11 | >Namaste
12 |
13 | >Welcome aboard. PythonExpress would like to take the liberty of introducing the Trainer and Point of Contact for the workshop scheduled for {{date}} and on the topic of {{workshop_title}}.
14 |
15 |
Point of Contact:
16 | {% for poc in poc_list %}
17 | {{poc.first_name}} {{poc.last_name}} ,
18 | {{poc.email}}, {{poc.profile.mobile}}
19 |
20 | {% endfor %}
21 |
22 |
23 | The Trainer:
24 |
25 | {% for presenter in presenter_list %}
26 | {{presenter.first_name}} {{presenter.last_name}} , {{presenter.email}}, {{presenter.profile.mobile}}
27 |
28 | {% endfor %}
29 |
30 |
31 |
32 | please communicate your requirements for the workshop day to college POC's.
33 | Please feel free to take this discussion forward, preferably keeping contact@pythonexpress.org in the loop.
34 |
35 | Let’s work towards a great workshop !
36 |
37 | May the love of Python spread far and wide!
38 | Warmly,
39 | The PythonExpress team
40 |
41 |
42 |
43 | {% endblock %}
44 | {% endblock %}
45 |
46 |
--------------------------------------------------------------------------------
/wye/templates/email_messages/workshop/workshop_intro_email.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/templates/email_messages/workshop/workshop_intro_email.txt
--------------------------------------------------------------------------------
/wye/templates/error.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% block title %}Error | {{ block.super }}{% endblock %}
3 |
4 | {% block header %}
5 |
8 | {% endblock %}
9 |
10 | {% block content %}
11 |
12 |
{{message}}
13 |
14 |
15 | {% endblock %}
16 |
--------------------------------------------------------------------------------
/wye/templates/openid/base.html:
--------------------------------------------------------------------------------
1 | {% extends "socialaccount/base.html" %}
2 |
--------------------------------------------------------------------------------
/wye/templates/openid/login.html:
--------------------------------------------------------------------------------
1 | {% extends "openid/base.html" %}
2 |
3 | {% load i18n %}
4 |
5 | {% block head_title %}OpenID Sign In{% endblock %}
6 |
7 | {% block content %}
8 |
9 | {% trans 'OpenID Sign In' %}
10 |
11 |
12 |
17 |
18 | {% endblock %}
19 |
--------------------------------------------------------------------------------
/wye/templates/organisation/create.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load static from staticfiles %}
3 | {% include 'autocomplete_light/static.html' %}
4 | {% block title %}Organisation | {{ block.super }}{% endblock %}
5 |
6 | {% block header %}
7 |
8 |
Create Organisation
9 |
10 | {% endblock %}
11 |
12 | {% block content %}
13 |
28 | {% endblock %}
29 | {% block footer_scripts %}
30 |
31 | {% endblock %}
32 |
--------------------------------------------------------------------------------
/wye/templates/organisation/edit.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% block title %}Organisation | {{ block.super }}{% endblock %}
3 | {% block header %}
4 |
5 |
Organisations
6 |
7 | {% endblock %}
8 |
9 | {% block content %}
10 |
28 | {% endblock %}
29 |
--------------------------------------------------------------------------------
/wye/templates/organisation/member-add.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% block title %}Organisation | {{ block.super }}{% endblock %}
3 | {% block header %}
4 |
5 |
Organisations
6 |
7 | {% endblock %}
8 |
9 | {% block content %}
10 |
28 | {% endblock %}
29 |
--------------------------------------------------------------------------------
/wye/templates/organisation/register_form.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% block title %}Signup | Pythonexpress{% endblock %}
3 |
4 | {% block content %}
5 |
38 | {% endblock %}
39 |
--------------------------------------------------------------------------------
/wye/templates/partner.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block header %}
4 |
5 |
{% if form %}Partner With Us{% else %}Thank You {% endif %}
6 |
7 | {% endblock %}
8 |
9 | {% block content %}
10 |
11 |
12 |
13 | {% if form %}
14 |
19 | {% else %}
20 | Your response has been recorded. We will get in touch with you shortly.
21 | {% endif %}
22 |
23 |
24 |
25 | {% endblock %}
26 |
--------------------------------------------------------------------------------
/wye/templates/profile/details.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block content %}
4 | This page wil be called when user click on hyperlink on profile page
5 |
6 | {% endblock %}
--------------------------------------------------------------------------------
/wye/templates/profile/profile_create.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load static from staticfiles %}
3 | {% include 'autocomplete_light/static.html' %}
4 | {% block title %}Complete Profile | {{ block.super }}{% endblock %}
5 | {% block extracss %}
6 |
7 | {% endblock %}
8 |
9 | {% block header %}
10 |
11 |
Complete Profile
12 |
13 | {% endblock %}
14 |
15 | {% block content %}
16 |
26 | {% endblock %}
27 |
--------------------------------------------------------------------------------
/wye/templates/profile/update.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block header %}
4 |
5 |
Edit Profile
6 |
7 | {% endblock %}
8 |
9 | {% block content %}
10 | {{ form.media }}
11 |
12 |
17 |
18 |
19 |
Update Profile
20 |
21 |
22 |
30 |
31 | {% endblock %}
32 |
--------------------------------------------------------------------------------
/wye/templates/regions/lead/create.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load static from staticfiles %}
3 | {% include 'autocomplete_light/static.html' %}
4 |
5 | {% block extracss %}
6 |
7 | {% endblock %}
8 |
9 | {% block header %}
10 |
11 |
Create Regional Lead
12 |
13 | {% endblock %}
14 |
15 | {% block content %}
16 |
31 | {% endblock %}
32 |
--------------------------------------------------------------------------------
/wye/templates/regions/lead/edit.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block header %}
4 |
5 |
Update Regional Lead
6 |
7 | {% endblock %}
8 |
9 | {% block content %}
10 |
26 | {% endblock %}
27 |
--------------------------------------------------------------------------------
/wye/templates/regions/location/create.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load static from staticfiles %}
3 | {% include 'autocomplete_light/static.html' %}
4 |
5 | {% block extracss %}
6 |
7 | {% endblock %}
8 |
9 | {% block header %}
10 |
11 |
Add Location
12 |
13 | {% endblock %}
14 |
15 | {% block content %}
16 |
32 | {% endblock %}
33 |
--------------------------------------------------------------------------------
/wye/templates/regions/location/edit.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block header %}
4 |
5 |
Update Location
6 |
7 | {% endblock %}
8 |
9 | {% block content %}
10 |
26 | {% endblock %}
27 |
--------------------------------------------------------------------------------
/wye/templates/regions/state/create.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load static from staticfiles %}
3 | {% include 'autocomplete_light/static.html' %}
4 |
5 | {% block extracss %}
6 |
7 | {% endblock %}
8 |
9 | {% block header %}
10 |
11 |
Add State
12 |
13 | {% endblock %}
14 |
15 | {% block content %}
16 |
32 | {% endblock %}
33 |
--------------------------------------------------------------------------------
/wye/templates/regions/state/edit.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block header %}
4 |
5 |
Update State
6 |
7 | {% endblock %}
8 |
9 | {% block content %}
10 |
26 | {% endblock %}
27 |
--------------------------------------------------------------------------------
/wye/templates/socialaccount/authentication_error.html:
--------------------------------------------------------------------------------
1 | {% extends "socialaccount/base.html" %}
2 |
3 | {% load i18n %}
4 |
5 | {% block head_title %}{% trans "Social Network Login Failure" %}{% endblock %}
6 |
7 | {% block content %}
8 | {% trans "Social Network Login Failure" %}
9 |
10 | {% trans "An error occurred while attempting to login via your social network account." %}
11 | {% endblock %}
12 |
--------------------------------------------------------------------------------
/wye/templates/socialaccount/base.html:
--------------------------------------------------------------------------------
1 | {% extends "account/base.html" %}
2 |
3 |
--------------------------------------------------------------------------------
/wye/templates/socialaccount/connections.html:
--------------------------------------------------------------------------------
1 | {% extends "socialaccount/base.html" %}
2 |
3 | {% load i18n %}
4 |
5 | {% block head_title %}{% trans "Account Connections" %}{% endblock %}
6 |
7 | {% block content %}
8 | {% trans "Account Connections" %}
9 |
10 | {% if form.accounts %}
11 | {% blocktrans %}You can sign in to your account using any of the following third party accounts:{% endblocktrans %}
12 |
13 |
14 |
41 |
42 | {% else %}
43 | {% trans 'You currently have no social network accounts connected to this account.' %}
44 | {% endif %}
45 |
46 | {% trans 'Add a 3rd Party Account' %}
47 |
48 |
49 | {% include "socialaccount/snippets/provider_list.html" with process="connect" %}
50 |
51 |
52 | {% include "socialaccount/snippets/login_extra.html" %}
53 |
54 | {% endblock %}
55 |
--------------------------------------------------------------------------------
/wye/templates/socialaccount/login_cancelled.html:
--------------------------------------------------------------------------------
1 | {% extends "socialaccount/base.html" %}
2 |
3 | {% load i18n %}
4 |
5 | {% block head_title %}{% trans "Login Cancelled" %}{% endblock %}
6 |
7 | {% block content %}
8 |
9 | {% trans "Login Cancelled" %}
10 |
11 | {% url 'account_login' as login_url %}
12 |
13 | {% blocktrans %}You decided to cancel logging in to our site using one of your existing accounts. If this was a mistake, please proceed to sign in .{% endblocktrans %}
14 |
15 | {% endblock %}
16 |
--------------------------------------------------------------------------------
/wye/templates/socialaccount/messages/account_connected.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% blocktrans %}The social account has been connected.{% endblocktrans %}
3 |
--------------------------------------------------------------------------------
/wye/templates/socialaccount/messages/account_connected_other.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% blocktrans %}The social account is already connected to a different account.{% endblocktrans %}
3 |
--------------------------------------------------------------------------------
/wye/templates/socialaccount/messages/account_disconnected.txt:
--------------------------------------------------------------------------------
1 | {% load i18n %}
2 | {% blocktrans %}The social account has been disconnected.{% endblocktrans %}
3 |
--------------------------------------------------------------------------------
/wye/templates/socialaccount/signup.html:
--------------------------------------------------------------------------------
1 | {% extends "socialaccount/base.html" %}
2 |
3 | {% load i18n %}
4 |
5 | {% block head_title %}{% trans "Signup" %}{% endblock %}
6 |
7 | {% block content %}
8 | {% trans "Sign Up" %}
9 |
10 | {% blocktrans with provider_name=account.get_provider.name site_name=site.name %}You are about to use your {{provider_name}} account to login to
11 | {{site_name}}. As a final step, please complete the following form:{% endblocktrans %}
12 |
13 |
21 |
22 | {% endblock %}
23 |
--------------------------------------------------------------------------------
/wye/templates/socialaccount/snippets/login_extra.html:
--------------------------------------------------------------------------------
1 | {% load socialaccount %}
2 |
3 | {% providers_media_js %}
4 |
5 |
--------------------------------------------------------------------------------
/wye/templates/socialaccount/snippets/provider_list.html:
--------------------------------------------------------------------------------
1 | {% load socialaccount %}
2 |
3 | {% get_providers as socialaccount_providers %}
4 |
5 | {% for provider in socialaccount_providers %}
6 | {% if provider.id == "openid" %}
7 | {% for brand in provider.get_brands %}
8 |
9 | {{brand.name}}
13 |
14 | {% endfor %}
15 | {% endif %}
16 | {{provider.name}}
18 | {% endfor %}
19 |
20 |
--------------------------------------------------------------------------------
/wye/templates/supporters.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 | {% load staticfiles %}
3 | {% block title %}Partner | {{ block.super }}{% endblock %}
4 |
5 | {% block header %}
6 |
7 |
PARTNERS
8 |
9 | {% endblock %}
10 |
11 | {% block content %}
12 |
13 |
14 |
21 |
22 |
Community partners
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 | {% endblock %}
32 |
--------------------------------------------------------------------------------
/wye/templates/workshops/students/email_certificate.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block header %}
4 |
5 |
Email Certificate
6 |
7 | {% endblock %}
8 | {% load static from staticfiles %}
9 |
10 | {% block content %}
11 | {{ form.media }}
12 |
13 |
18 |
19 | Download sample
format here
20 |
21 |
22 |
30 |
31 | {% endblock %}
32 |
--------------------------------------------------------------------------------
/wye/templates/workshops/students/register.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% load static from staticfiles %}
4 | {% block header %}
5 |
6 |
Student Register for Workshop
7 |
8 | {% endblock %}
9 |
10 | {% block content %}
11 | {{ form.media }}
12 |
13 |
18 |
19 | Download sample
format here
20 |
21 |
22 |
30 |
31 | {% endblock %}
32 |
--------------------------------------------------------------------------------
/wye/templates/workshops/workshop_create.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block header %}
4 |
5 |
Create Workshop
6 |
7 | {% endblock %}
8 |
9 | {% block content %}
10 | {{ form.media }}
11 |
26 | {% endblock %}
27 |
--------------------------------------------------------------------------------
/wye/templates/workshops/workshop_display.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Organization
6 | Presenter
7 | Date
8 | Location
9 | Section
10 |
11 |
12 |
13 | {% for each_workshop in workshop %}
14 |
15 | {{ each_workshop.requester.name }}
16 | {{ each_workshop.get_presenter_list|join:", " }}
17 | {{ each_workshop.expected_date }}
18 | {{ each_workshop.location }}
19 | {{ each_workshop.workshop_section }}
20 |
21 | {% endfor %}
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/wye/templates/workshops/workshop_feedback.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block header %}
4 |
5 |
Workshop Feedback
6 |
7 | {% endblock %}
8 |
9 | {% block content %}
10 |
26 | {% endblock %}
27 |
--------------------------------------------------------------------------------
/wye/templates/workshops/workshop_update.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block header %}
4 |
5 |
Update Workshop
6 |
7 | {% endblock %}
8 |
9 | {% block content %}
10 | {{ form.media }}
11 |
29 |
30 | {% endblock %}
31 |
--------------------------------------------------------------------------------
/wye/urls.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from django.conf import settings
3 | from django.conf.urls import include, url
4 | from django.conf.urls.static import static
5 | from django.contrib import admin
6 | from django.views.generic.base import TemplateView
7 |
8 | from wye.base.views import HomePageView
9 | from wye.profiles.views import (
10 | contact,
11 | partner_view,
12 | account_redirect)
13 | from wye.organisations.views import activate_view
14 | # from wye.workshops.views import upcoming_workshops
15 |
16 | urlpatterns = [
17 | url(r'^account_redirect/$', account_redirect, name='account-redirect'),
18 | url(r'^accounts/', include('allauth.urls')),
19 | url(r'^django-admin/', include(admin.site.urls)),
20 | url(r'^about/$', TemplateView.as_view(template_name='about.html',),
21 | name='about'),
22 | url(r'^contact/$', contact, name='contact'),
23 | url(r'^partner/$', partner_view, name='partner'),
24 | url(r'^supporter/$', TemplateView.as_view(
25 | template_name='supporters.html',),
26 | name='supporter'),
27 | url(r'^thankyou/$', TemplateView.as_view(template_name='contact.html'),
28 | name='thankyou'),
29 | url(r'^workshops_info/$', TemplateView.as_view(
30 | template_name='workshops_info.html',),
31 | name='workshops_info'),
32 | # url(r'^workshops_upcoming/$',
33 | # upcoming_workshops, name="upcoming_workshops"),
34 | url(r'^faq/$', TemplateView.as_view(template_name='faq.html',),
35 | name='faq'),
36 | url(r'^organisation/',
37 | include('wye.organisations.urls', namespace="organisations")),
38 | url(r'^workshop/',
39 | include('wye.workshops.urls', namespace="workshops")),
40 | url(r'^profile/',
41 | include('wye.profiles.urls', namespace="profiles")),
42 | url(r'^region/',
43 | include('wye.regions.urls', namespace="regions")),
44 | url(r'^reports/',
45 | include('wye.reports.urls', namespace="reports")),
46 | url(r'^invitation/(?P[\d]+)-(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/',
47 | view=activate_view, name="invitation_register"),
48 | url(r'^$', HomePageView.as_view(),
49 | name='home-page'),
50 | ] + static(
51 | settings.STATIC_URL,
52 | document_root=settings.STATICFILES_DIRS) + static(
53 | settings.MEDIA_URL,
54 | document_root=settings.MEDIA_ROOT)
55 |
--------------------------------------------------------------------------------
/wye/workshops/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/workshops/__init__.py
--------------------------------------------------------------------------------
/wye/workshops/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 | from . import models
3 |
4 |
5 | class WorkshopAdmin(admin.ModelAdmin):
6 | list_per_page = 50
7 | list_display = (
8 | 'requester',
9 | 'workshop_section',
10 | 'no_of_participants')
11 | search_fields = (
12 | 'expected_date',
13 | 'workshop_level',
14 | 'status')
15 | list_filter = ('is_active', 'status', 'workshop_level')
16 |
17 | admin.site.register(models.Workshop, WorkshopAdmin)
18 |
19 |
20 | class WorkshopFeedBackAdmin(admin.ModelAdmin):
21 | list_per_page = 50
22 | list_display = (
23 | 'workshop',
24 | 'feedback_type',
25 | 'comment')
26 | search_fields = (
27 | 'expected_date',
28 | 'workshop_level',
29 | 'status')
30 | list_filter = ('feedback_type',)
31 |
32 | admin.site.register(models.WorkshopFeedBack, WorkshopFeedBackAdmin)
33 |
34 | admin.site.register(models.WorkshopSections)
35 | admin.site.register(models.WorkshopRatingValues)
36 | admin.site.register(models.WorkshopVoting)
37 |
--------------------------------------------------------------------------------
/wye/workshops/decorators.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/workshops/decorators.py
--------------------------------------------------------------------------------
/wye/workshops/migrations/0002_auto_20151024_1441.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('workshops', '0001_initial'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='workshop',
16 | name='status',
17 | field=models.PositiveSmallIntegerField(default=1, verbose_name=b'Current Status', choices=[(3, 'Workshop Accepted '), (5, 'Workshop Completed'), (4, 'Workshop Declined'), (1, 'Draft'), (6, 'Workshop On Hold'), (2, 'Workshop Requested')]),
18 | ),
19 | ]
20 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0003_auto_20151025_0818.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('workshops', '0002_auto_20151024_1441'),
11 | ]
12 |
13 | operations = [
14 | migrations.AddField(
15 | model_name='workshopvoting',
16 | name='rating',
17 | field=models.ForeignKey(related_name='workshop_rating', default='', to='workshops.WorkshopRatingValues'),
18 | preserve_default=False,
19 | ),
20 | migrations.AlterField(
21 | model_name='workshopvoting',
22 | name='presenter_rating',
23 | field=models.IntegerField(),
24 | ),
25 | migrations.AlterField(
26 | model_name='workshopvoting',
27 | name='requester_rating',
28 | field=models.IntegerField(),
29 | ),
30 | ]
31 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0004_auto_20151025_1331.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('workshops', '0003_auto_20151025_0818'),
11 | ]
12 |
13 | operations = [
14 | migrations.RenameField(
15 | model_name='workshopfeedback',
16 | old_name='presenter_comment',
17 | new_name='comment',
18 | ),
19 | migrations.RemoveField(
20 | model_name='workshopfeedback',
21 | name='requester_comment',
22 | ),
23 | migrations.RemoveField(
24 | model_name='workshopvoting',
25 | name='presenter_rating',
26 | ),
27 | migrations.RemoveField(
28 | model_name='workshopvoting',
29 | name='requester_rating',
30 | ),
31 | migrations.RemoveField(
32 | model_name='workshopvoting',
33 | name='workshop',
34 | ),
35 | migrations.AddField(
36 | model_name='workshopfeedback',
37 | name='user_type',
38 | field=models.PositiveSmallIntegerField(default=0, verbose_name=b'User_type', choices=[(2, 'Organisation'), (1, 'Presenter')]),
39 | preserve_default=False,
40 | ),
41 | migrations.AddField(
42 | model_name='workshopvoting',
43 | name='workshop_feedback',
44 | field=models.ForeignKey(related_name='workshop_feedback', default='', to='workshops.WorkshopFeedBack'),
45 | preserve_default=False,
46 | ),
47 | migrations.AddField(
48 | model_name='workshopvoting',
49 | name='workshop_rating',
50 | field=models.ForeignKey(related_name='workshop_rating', default='', to='workshops.WorkshopRatingValues'),
51 | preserve_default=False,
52 | ),
53 | migrations.AlterField(
54 | model_name='workshopvoting',
55 | name='rating',
56 | field=models.IntegerField(),
57 | ),
58 | ]
59 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0005_auto_20151025_1338.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('workshops', '0004_auto_20151025_1331'),
11 | ]
12 |
13 | operations = [
14 | migrations.RenameField(
15 | model_name='workshopfeedback',
16 | old_name='user_type',
17 | new_name='feedback_type',
18 | ),
19 | ]
20 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0006_remove_workshopratingvalues_value.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('workshops', '0005_auto_20151025_1338'),
11 | ]
12 |
13 | operations = [
14 | migrations.RemoveField(
15 | model_name='workshopratingvalues',
16 | name='value',
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0007_auto_20151028_0048.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('workshops', '0006_remove_workshopratingvalues_value'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='workshop',
16 | name='status',
17 | field=models.PositiveSmallIntegerField(verbose_name='Current Status', default=1, choices=[(3, 'Workshop Accepted '), (5, 'Workshop Completed'), (4, 'Workshop Declined'), (1, 'Draft'), (5, 'FeedBack Pending'), (6, 'Workshop On Hold'), (2, 'Workshop Requested')]),
18 | ),
19 | migrations.AlterField(
20 | model_name='workshopfeedback',
21 | name='feedback_type',
22 | field=models.PositiveSmallIntegerField(verbose_name='User_type', choices=[(2, 'Organisation'), (1, 'Presenter')]),
23 | ),
24 | ]
25 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0008_auto_20160716_1939.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 | import django.core.validators
6 |
7 |
8 | class Migration(migrations.Migration):
9 |
10 | dependencies = [
11 | ('workshops', '0007_auto_20151028_0048'),
12 | ]
13 |
14 | operations = [
15 | migrations.AlterField(
16 | model_name='workshop',
17 | name='no_of_participants',
18 | field=models.PositiveIntegerField(validators=[django.core.validators.MaxValueValidator(1000)]),
19 | ),
20 | migrations.AlterField(
21 | model_name='workshop',
22 | name='status',
23 | field=models.PositiveSmallIntegerField(choices=[(3, 'Workshop Accepted '), (5, 'Workshop Completed'), (4, 'Workshop Declined'), (1, 'Draft'), (5, 'FeedBack Pending'), (6, 'Workshop On Hold'), (2, 'Workshop Requested')], verbose_name='Current Status', default=2),
24 | ),
25 | ]
26 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0009_auto_20161017_0059.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 | from django.conf import settings
6 |
7 |
8 | class Migration(migrations.Migration):
9 |
10 | dependencies = [
11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL),
12 | ('workshops', '0008_auto_20160716_1939'),
13 | ]
14 |
15 | operations = [
16 | migrations.AddField(
17 | model_name='workshop',
18 | name='number_of_volunteers',
19 | field=models.IntegerField(null=True, blank=True),
20 | ),
21 | migrations.AddField(
22 | model_name='workshop',
23 | name='volunteer',
24 | field=models.ManyToManyField(related_name='workshop_volunteer', to=settings.AUTH_USER_MODEL),
25 | ),
26 | ]
27 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0009_workshopratingvalues_feedback_type.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('workshops', '0008_auto_20160716_1939'),
11 | ]
12 |
13 | operations = [
14 | migrations.AddField(
15 | model_name='workshopratingvalues',
16 | name='feedback_type',
17 | field=models.PositiveSmallIntegerField(default=1, verbose_name='User_type', choices=[(2, 'Organisation'), (1, 'Presenter')]),
18 | preserve_default=False,
19 | ),
20 | ]
21 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0010_auto_20161022_1056.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('workshops', '0009_auto_20161017_0059'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='workshop',
16 | name='number_of_volunteers',
17 | field=models.PositiveSmallIntegerField(default=0, null=True, blank=True),
18 | ),
19 | ]
20 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0011_merge.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('workshops', '0009_workshopratingvalues_feedback_type'),
11 | ('workshops', '0010_auto_20161022_1056'),
12 | ]
13 |
14 | operations = [
15 | ]
16 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0012_auto_20170212_1701.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('workshops', '0011_merge'),
11 | ]
12 |
13 | operations = [
14 | migrations.AddField(
15 | model_name='workshopratingvalues',
16 | name='is_active',
17 | field=models.BooleanField(default=True),
18 | ),
19 | migrations.AddField(
20 | model_name='workshopsections',
21 | name='is_active',
22 | field=models.BooleanField(default=True),
23 | ),
24 | migrations.AlterField(
25 | model_name='workshop',
26 | name='status',
27 | field=models.PositiveSmallIntegerField(verbose_name='Current Status', choices=[(3, 'Workshop Accepted '), (7, 'Workshop Completed'), (4, 'Workshop Declined'), (1, 'Draft'), (5, 'FeedBack Pending'), (6, 'Workshop On Hold'), (2, 'Workshop Requested'), (8, 'Workshop unable to complete')], default=2),
28 | ),
29 | ]
30 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0013_auto_20170617_1409.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('workshops', '0012_auto_20170212_1701'),
11 | ]
12 |
13 | operations = [
14 | migrations.RemoveField(
15 | model_name='workshop',
16 | name='location',
17 | ),
18 | migrations.AddField(
19 | model_name='workshop',
20 | name='budget',
21 | field=models.CharField(null=True, max_length=5),
22 | ),
23 | migrations.AddField(
24 | model_name='workshop',
25 | name='comments',
26 | field=models.TextField(default=''),
27 | preserve_default=False,
28 | ),
29 | migrations.AddField(
30 | model_name='workshop',
31 | name='hotel_reimbursement',
32 | field=models.PositiveSmallIntegerField(default=2, verbose_name='Stay Reimbursement Support', choices=[(2, 'No'), (1, 'Yes')]),
33 | ),
34 | migrations.AddField(
35 | model_name='workshop',
36 | name='reimbursement_mode',
37 | field=models.TextField(null=True),
38 | ),
39 | migrations.AddField(
40 | model_name='workshop',
41 | name='travel_reimbursement',
42 | field=models.PositiveSmallIntegerField(default=2, verbose_name='Travel Reimbursement Support', choices=[(2, 'No'), (1, 'Yes')]),
43 | ),
44 | migrations.AddField(
45 | model_name='workshop',
46 | name='tutor_reimbursement_flag',
47 | field=models.PositiveSmallIntegerField(default=2, verbose_name=' Do you need Travel/Stay reimbursement ?', choices=[(2, 'No'), (1, 'Yes')]),
48 | ),
49 | ]
50 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0014_workshop_target_audience.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('workshops', '0013_auto_20170617_1409'),
11 | ]
12 |
13 | operations = [
14 | migrations.AddField(
15 | model_name='workshop',
16 | name='target_audience',
17 | field=models.PositiveSmallIntegerField(default=1, verbose_name='Audience', choices=[(1, 'B.E Final Year'), (4, 'B.E Second Year'), (3, 'B.E Second Year'), (2, 'B.E Third Year'), (5, 'MASTER Final Year'), (7, 'MASTER Second Year'), (6, 'MASTER Second Year'), (11, 'Others'), (10, 'School'), (9, 'College 1 Year'), (8, 'College 2nd year')]),
18 | ),
19 | ]
20 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0015_auto_20170907_0003.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | dependencies = [
10 | ('workshops', '0014_workshop_target_audience'),
11 | ]
12 |
13 | operations = [
14 | migrations.AlterField(
15 | model_name='workshop',
16 | name='target_audience',
17 | field=models.PositiveSmallIntegerField(default=1, verbose_name='Audience', choices=[(1, 'Engineering 4th Year'), (4, 'Engineering 1st Year'), (3, 'Engineering 2ndYear'), (2, 'Engineering 3rd Year'), (10, 'Diploma 1st Year'), (9, 'Diploma 2nd Year'), (8, 'Diploma 3rd Year'), (5, 'MCA Final Year'), (7, 'MCA First Year'), (6, 'MCA Second Year'), (14, 'Others'), (13, 'School'), (12, '10+1'), (11, '10+2')]),
18 | ),
19 | ]
20 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/0016_auto_20171030_1708.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | from __future__ import unicode_literals
3 |
4 | from django.db import migrations, models
5 | from django.conf import settings
6 |
7 |
8 | class Migration(migrations.Migration):
9 |
10 | dependencies = [
11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL),
12 | ('workshops', '0015_auto_20170907_0003'),
13 | ]
14 |
15 | operations = [
16 | migrations.AddField(
17 | model_name='workshop',
18 | name='student_attended',
19 | field=models.ManyToManyField(to=settings.AUTH_USER_MODEL, related_name='workshop_attended'),
20 | ),
21 | migrations.AlterField(
22 | model_name='workshop',
23 | name='no_of_participants',
24 | field=models.PositiveIntegerField(choices=[(10, 10), (20, 20), (30, 30), (40, 40), (50, 50), (60, 60)]),
25 | ),
26 | migrations.AlterField(
27 | model_name='workshop',
28 | name='workshop_level',
29 | field=models.PositiveSmallIntegerField(verbose_name='Workshop Level', choices=[(2, 'Advance'), (1, 'Beginner'), (2, 'Intermediate')]),
30 | ),
31 | ]
32 |
--------------------------------------------------------------------------------
/wye/workshops/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/workshops/migrations/__init__.py
--------------------------------------------------------------------------------
/wye/workshops/templatetags/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pythonindia/wye/d8390883c7f2e6790e5d4537b8bbee6b6d9a549b/wye/workshops/templatetags/__init__.py
--------------------------------------------------------------------------------
/wye/workshops/templatetags/workshop_display.py:
--------------------------------------------------------------------------------
1 | # from django import template
2 |
3 | # register = template.Library()
4 |
5 |
6 | # @register.inclusion_tag('workshops/workshop_display.html')
7 | # def show_workshops(workshops):
8 |
9 | # return {'workshop': workshops}
10 |
--------------------------------------------------------------------------------
/wye/workshops/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls import url
2 | from .views import (
3 | workshop_list,
4 | workshop_details,
5 | workshop_create,
6 | WorkshopUpdate,
7 | WorkshopToggleActive,
8 | WorkshopAction,
9 | workshop_feedback_view,
10 | workshop_update_volunteer,
11 | workshop_accept_as_volunteer,
12 | workshop_opt_out_as_volunteer)
13 | from .student_views import (
14 | send_email_certificate,
15 | register_students,
16 | download_student_certificate)
17 |
18 |
19 | urlpatterns = [
20 | url(r'^$', workshop_list, name="workshop_list"),
21 | url(r'^(?P\d+)/$', workshop_details, name="workshop_detail"),
22 | url(r'^create/$', workshop_create, name="workshop_create"),
23 | url(r'^update/(?P\d+)/$',
24 | WorkshopUpdate.as_view(), name="workshop_update"),
25 | url(r'^(?P\d+)/(?Pactive|deactive)/$',
26 | WorkshopToggleActive.as_view(), name="workshop_toggle"),
27 | url(r'^(?P\d+)/(?Paccept|reject|hold|publish|decline)/$',
28 | WorkshopAction.as_view(), name="workshop_action"),
29 | url(r'^feedback/(?P\d+)/$',
30 | workshop_feedback_view, name="workshop_feedback"),
31 | url(r'^update-volunteer/(?P\d+)$',
32 | workshop_update_volunteer, name="workshop_update_volunteer"),
33 | url(r'^workshop-opt-in-as-volunteer/(?P\d+)$',
34 | workshop_accept_as_volunteer, name="workshop_opt_in_volunteer"),
35 | url(r'^workshop-opt-out-as-volunteer/(?P\d+)$',
36 | workshop_opt_out_as_volunteer, name="workshop_opt_out_volunteer"),
37 | url(r'^email_cetrificate/(?P\d+)/$',
38 | send_email_certificate, name="send_email_certificate"),
39 | url(r'^student_register/(?P\d+)/$',
40 | register_students, name="register_students"),
41 | url(r'^certificate/(?P\d+)/download/$',
42 | download_student_certificate, name="download_student_certificate"),
43 |
44 | ]
45 |
--------------------------------------------------------------------------------
/wye/wsgi.py:
--------------------------------------------------------------------------------
1 | """
2 | WSGI config for wye project.
3 |
4 | It exposes the WSGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.wsgi import get_wsgi_application
13 |
14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
15 |
16 | application = get_wsgi_application()
17 |
--------------------------------------------------------------------------------