diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/Dockerfile b/assignments/assignment2/solutions/Jlopezjlx/src/Dockerfile new file mode 100644 index 0000000..7a08710 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3 + +WORKDIR /usr/src/app + +COPY requirements.txt ./ +RUN pip install --no-cache-dir -r requirements.txt +COPY . . +EXPOSE 8000 +CMD [ "python", "./src/manage.py", "runserver", "0.0.0.0:8000"] + diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/LICENSE b/assignments/assignment2/solutions/Jlopezjlx/src/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/README.md b/assignments/assignment2/solutions/Jlopezjlx/src/README.md new file mode 100644 index 0000000..da9a6e0 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/README.md @@ -0,0 +1,50 @@ +# DevHub + +Hub for DEVelopment related stuff: news, articles, source codes, ideas, etc. + +## Related [YouTube](http://youtube.com/CoderVlogger "CoderVlogger's YouTube channel") videos + +Please check out the following videos to learn more about DevHub: + +1. [Introduction & Custom User Model](https://youtu.be/cg0KNJZqInY) +2. [Setup URLs, templates and HTML views for Account application](https://youtu.be/yNlRzTfZi8Q) + +# Setup + +## Using `virtualenv` + +1. Make sure you have [Python 3] and [virtualenv] installed +2. Clone this repository: `git clone https://github.com/CoderVlogger/devhub.git` +3. Move into the project folder: `cd devhub` +4. Create a new virtualenv: `virtualenv venv -p python3` +5. Activate the virtualenv: `source ./venv/bin/activate` +6. Install dependencies: `pip install -r requirements.txt` + +## Using `Docker` + +1. Make sure you have Docker installed +2. Clone this repository: `git clone https://github.com/CoderVlogger/devhub.git` +3. Move into the project folder: `cd devhub` +4. Build the Image using Dockerfile: `docker build -t [Image-Name] .` +5. Run a container: `docker run -p 8000:8000 -it --rm --name [Container-Name] [Image-Name]` + +# Project Structure + +## Repository structure + +1. `src` - source code +2. `docs` - auto generated Sphinx documentation (to be added) +3. `tests` - high level tests (e2e, load, etc. - to be added) + +## Django applications + +1. Account + 1. User side register, login and logout + 2. Profile and account settings +2. Board (to be added) + 1. Share public posts + 2. Post rating system + 3. Post comments + +[Python 3]: https://www.python.org/downloads/ +[virtualenv]: https://virtualenv.pypa.io/en/stable/ diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/docker-compose.yml b/assignments/assignment2/solutions/Jlopezjlx/src/docker-compose.yml new file mode 100644 index 0000000..8645baf --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/docker-compose.yml @@ -0,0 +1,27 @@ +version: '3' + + +services: + db_devhub: + container_name: db_devhub + image: postgres:9.6.12 + environment: + - "POSTGRES_PASSWORD:12345" + ports: + - 8085:8080 + - 5432:5432 + networks: + - devhub + web-app: + container_name: devhub_run_app + build: . + ports: + - 8000:8000 + depends_on: + - db_devhub + networks: + - devhub + + +networks: + devhub: \ No newline at end of file diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/docs/README.md b/assignments/assignment2/solutions/Jlopezjlx/src/docs/README.md new file mode 100644 index 0000000..e69de29 diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/requirements.txt b/assignments/assignment2/solutions/Jlopezjlx/src/requirements.txt new file mode 100644 index 0000000..7aaf108 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/requirements.txt @@ -0,0 +1,11 @@ +astroid==2.2.5 +Django==2.1.7 +isort==4.3.16 +lazy-object-proxy==1.3.1 +mccabe==0.6.1 +pylint==2.3.1 +pytz==2018.9 +six==1.12.0 +typed-ast==1.3.1 +wrapt==1.11.1 +psycopg2==2.8.2 diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/account/__init__.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/account/admin.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/admin.py new file mode 100644 index 0000000..2a53c88 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/admin.py @@ -0,0 +1,13 @@ +from django.contrib import admin +from django.contrib.auth.admin import UserAdmin +from account import models as account_models +from .forms import CustomCreateUser + + +class CustomUser(UserAdmin): + add_form = CustomCreateUser + model = account_models.Account + list_display = ['username', 'password', 'email'] + + +admin.site.register(account_models.Account, UserAdmin) diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/account/apps.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/apps.py new file mode 100644 index 0000000..f7b1d19 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class AccountConfig(AppConfig): + name = 'account' diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/account/forms.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/forms.py new file mode 100644 index 0000000..2624bc2 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/forms.py @@ -0,0 +1,14 @@ +from django.contrib.auth import get_user_model +from .models import Account +from django import forms +from django.contrib.auth.forms import UserCreationForm, UserChangeForm + + + +User = get_user_model() + +class CustomCreateUser(UserCreationForm): + + class Meta: + model = Account + fields = ('username',) \ No newline at end of file diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/account/migrations/0001_initial.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/migrations/0001_initial.py new file mode 100644 index 0000000..e7b97be --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 2.1.7 on 2019-04-13 20:00 + +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0009_alter_user_last_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='Account', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/account/migrations/__init__.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/account/models.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/models.py new file mode 100644 index 0000000..2836e6f --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/models.py @@ -0,0 +1,14 @@ +from django.contrib.auth.models import AbstractUser +from django.db import models + + + + + +class Account(AbstractUser): + """ + With this class we are customazing Django's User model. + More information here: + https://docs.djangoproject.com/en/dev/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project + """ + REQUIRED_FIELDS = ['email'] diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/account/templates/account/index.html b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/templates/account/index.html new file mode 100644 index 0000000..31837e2 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/templates/account/index.html @@ -0,0 +1,3 @@ +
You are in Account's index page.
diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/account/templates/account/login/login.html b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/templates/account/login/login.html new file mode 100644 index 0000000..692950e --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/templates/account/login/login.html @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/account/templates/account/register/register.html b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/templates/account/register/register.html new file mode 100644 index 0000000..e836490 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/templates/account/register/register.html @@ -0,0 +1,11 @@ +{% block content %} + + + + +{% endblock %} \ No newline at end of file diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/account/templates/devhub/index.html b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/templates/devhub/index.html new file mode 100644 index 0000000..12b7907 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/templates/devhub/index.html @@ -0,0 +1,30 @@ + + + + + +