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 @@ +

Account/Index

+ +

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 @@ +
+ {% csrf_token %} + + + + + +
+ + + + + + + + +
+ +
+ + Forgot password? +
+
\ 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 %} + + + +
+

Sign up

+ {% csrf_token %} + {{ form.as_p }} + +
+{% 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 @@ + + + + + +

+ DevHub Page +

+ +
+ This a web app based on django
urls: +
+ +
+ /account +
+ Go to Account index + +
+ /account/login +
+ Go to Login + +
+ /account/register/ +
+ Go to register + + + diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/account/tests.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/account/urls.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/urls.py new file mode 100644 index 0000000..cd07cf0 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/urls.py @@ -0,0 +1,10 @@ +from django.urls import path + +from account import views + +urlpatterns = [ + path('', views.index, name='index'), + path(r'login/', views.login), + path(r'register/', views.register) + +] diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/account/views.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/views.py new file mode 100644 index 0000000..478b3b6 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/account/views.py @@ -0,0 +1,48 @@ +from .forms import CustomCreateUser +from django.shortcuts import render +from django.contrib.auth import authenticate, logout +from django.contrib.auth import login as auth_login +from django.http import HttpResponseRedirect, HttpResponse +from django.urls import reverse + + + + + + +def index(request): + return render(request, "account/index.html") + + +def register(request): + if request.method == 'POST': + form = CustomCreateUser(request.POST) + if form.is_valid(): + User = form.save() + username = form.cleaned_data.get('username') + raw_password = form.cleaned_data.get('password1') + User = authenticate(username=username, password=raw_password) + auth_login(request, User) + return HttpResponseRedirect(reverse("index")) + else: + form = CustomCreateUser() + return render(request, "account/register/register.html", {'form': form}) + + +def login(request): + if request.method == 'POST': + username = request.POST.get('username') + password = request.POST.get('psw') + user = authenticate(username=username, password=password) + if user: + if user.is_active: + auth_login(request, user) + return HttpResponseRedirect(reverse("index")) + else: + return HttpResponse ("Your account was inactive") + else: + print("Someone tried to log in and Failed") + return HttpResponse ("Invalid credentials") + else: + return render(request, "account/login/login.html") + diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/devhub/__init__.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/devhub/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/devhub/settings.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/devhub/settings.py new file mode 100644 index 0000000..ba68398 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/devhub/settings.py @@ -0,0 +1,128 @@ +""" +Django settings for devhub project. + +Generated by 'django-admin startproject' using Django 2.1.7. + +For more information on this file, see +https://docs.djangoproject.com/en/2.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.1/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '%sl=sr@84$rrenr8=!p@7733st0ggv4&6(#ipbq()1yvbd2rjv' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'account.apps.AccountConfig', + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'devhub.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'devhub.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/2.1/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': 'postgres', + 'USER': 'postgres', + 'HOST': '172.19.0.2', + 'PORT': 5432, + } +} + + +# Password validation +# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/2.1/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/2.1/howto/static-files/ + +STATIC_URL = '/static/' +STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),] +# Custom User model +# https://docs.djangoproject.com/en/dev/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project +AUTH_USER_MODEL = 'account.Account' diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/devhub/urls.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/devhub/urls.py new file mode 100644 index 0000000..89dd848 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/devhub/urls.py @@ -0,0 +1,26 @@ +"""devhub URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/2.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path, include +from django.conf import settings +from django.conf.urls.static import static +from devhub import views + +urlpatterns = [ + path('', views.index, name='index' ), + path('admin/', admin.site.urls), + path('account/', include('account.urls')), +] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/devhub/views.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/devhub/views.py new file mode 100644 index 0000000..db33e7e --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/devhub/views.py @@ -0,0 +1,5 @@ +from django.shortcuts import render + + +def index(request): + return render(request, "devhub/index.html") \ No newline at end of file diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/devhub/wsgi.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/devhub/wsgi.py new file mode 100644 index 0000000..5f213e2 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/devhub/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for devhub project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'devhub.settings') + +application = get_wsgi_application() diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/manage.py b/assignments/assignment2/solutions/Jlopezjlx/src/src/manage.py new file mode 100755 index 0000000..480b352 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/manage.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == '__main__': + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'devhub.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/static/css.css b/assignments/assignment2/solutions/Jlopezjlx/src/src/static/css.css new file mode 100644 index 0000000..dee0f7f --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/static/css.css @@ -0,0 +1,79 @@ +/* Bordered form */ +* { + margin: 0; + padding: 0; + font-family: sans-serif; + box-sizing: border-box; +} + + +body { + background: #ffffff; + display: flex; + min-height: 100vh; +} + + +form { + margin: auto; + width: 50%; + max-width: 500px; + background: #ffffff; + padding: 30px; + border: 1px solid rgba(0,0,0,0.2); + } + + /* Full-width inputs */ + input[type=text], input[type=password] { + width: 100%; + padding: 12px 20px; + margin: 8px 0; + display: inline-block; + border: 1px solid #ccc; + box-sizing: border-box; + } + + /* Set a style for all buttons */ + button { + background-color: #4DAEFA; + color: #FBC08C; + padding: 14px 20px; + margin: 8px 0; + border: none; + cursor: pointer; + width: 100%; + } + + /* Add a hover effect for buttons */ + button:hover { + opacity: 0.8; + } + + /* Extra style for the cancel button (red) */ + .cancelbtn { + width: auto; + padding: 10px 18px; + background-color: #4DAEFA; + } + + /* Add padding to containers */ + .container { + padding: 16px; + } + + /* The "Forgot password" text */ + span.psw { + float: right; + padding-top: 16px; + } + + /* Change styles for span and cancel button on extra small screens */ + @media screen and (max-width: 300px) { + span.psw { + display: block; + float: none; + } + .cancelbtn { + width: 100%; + } + } \ No newline at end of file diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/static/index.css b/assignments/assignment2/solutions/Jlopezjlx/src/src/static/index.css new file mode 100644 index 0000000..9ed2144 --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/static/index.css @@ -0,0 +1,15 @@ +h3{ + text-align: center; +} + +h5 { + text-align: center; +} + +h6 { + text-align: center; +} + +body{ + background-color: #ffffff; +} diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/src/static/register.css b/assignments/assignment2/solutions/Jlopezjlx/src/src/static/register.css new file mode 100644 index 0000000..6f6541b --- /dev/null +++ b/assignments/assignment2/solutions/Jlopezjlx/src/src/static/register.css @@ -0,0 +1,45 @@ +* { + margin: 0; + padding: 0; + font-family: sans-serif; + box-sizing: border-box; +} + + +body { + background: #ffffff; + display: flex; + min-height: 100vh; +} + + +form { + margin: auto; + width: 50%; + max-width: 500px; + background: #ffffff; + padding: 30px; + border: 1px solid rgba(0,0,0,0.2); + +} + +input[type=text], input[type=password] { + width: 100%; + margin-bottom: 5px; + margin: 10px 0; + padding: 12px 20px; +} + +h1 { + text-align: center; +} + +button { + background-color: #4DAEFA; + color: #FBC08C; + padding: 14px 20px; + margin: 8px 0; + border: none; + cursor: pointer; + width: 100%; + } \ No newline at end of file diff --git a/assignments/assignment2/solutions/Jlopezjlx/src/tests/README.md b/assignments/assignment2/solutions/Jlopezjlx/src/tests/README.md new file mode 100644 index 0000000..e69de29