From 23a29da5f07fb82c71e1d1213fb74383863fa590 Mon Sep 17 00:00:00 2001 From: Richard Date: Fri, 11 Mar 2022 20:08:46 -0600 Subject: [PATCH] django lab 2 completed --- .../django/lab-02/blog_project/__init__.py | 0 .../django/lab-02/blog_project/asgi.py | 16 + .../django/lab-02/blog_project/settings.py | 127 ++++++ .../django/lab-02/blog_project/urls.py | 23 + .../django/lab-02/blog_project/wsgi.py | 16 + .../lab-02/blog_project_app/__init__.py | 0 .../django/lab-02/blog_project_app/admin.py | 6 + .../django/lab-02/blog_project_app/apps.py | 6 + .../migrations/0001_initial.py | 28 ++ .../migrations/0002_blogpost_date_edited.py | 19 + .../0003_alter_blogpost_date_edited.py | 18 + .../blog_project_app/migrations/__init__.py | 0 .../django/lab-02/blog_project_app/models.py | 16 + .../lab-02/blog_project_app/static/index.css | 0 .../blog_project_app/static/normalize.css | 431 ++++++++++++++++++ .../templates/blog_project_app/create.html | 21 + .../templates/blog_project_app/index.html | 38 ++ .../django/lab-02/blog_project_app/tests.py | 3 + .../django/lab-02/blog_project_app/urls.py | 8 + .../django/lab-02/blog_project_app/views.py | 62 +++ Code/Richard/django/lab-02/manage.py | 22 + Code/Richard/django/lab-02/users/__init__.py | 0 Code/Richard/django/lab-02/users/admin.py | 7 + Code/Richard/django/lab-02/users/apps.py | 6 + .../lab-02/users/migrations/0001_initial.py | 44 ++ .../lab-02/users/migrations/__init__.py | 0 Code/Richard/django/lab-02/users/models.py | 10 + .../django/lab-02/users/static/normalize.css | 431 ++++++++++++++++++ .../lab-02/users/templates/users/login.html | 33 ++ .../lab-02/users/templates/users/profile.html | 34 ++ .../users/templates/users/register.html | 60 +++ Code/Richard/django/lab-02/users/tests.py | 3 + Code/Richard/django/lab-02/users/urls.py | 11 + Code/Richard/django/lab-02/users/views.py | 77 ++++ 34 files changed, 1576 insertions(+) create mode 100644 Code/Richard/django/lab-02/blog_project/__init__.py create mode 100644 Code/Richard/django/lab-02/blog_project/asgi.py create mode 100644 Code/Richard/django/lab-02/blog_project/settings.py create mode 100644 Code/Richard/django/lab-02/blog_project/urls.py create mode 100644 Code/Richard/django/lab-02/blog_project/wsgi.py create mode 100644 Code/Richard/django/lab-02/blog_project_app/__init__.py create mode 100644 Code/Richard/django/lab-02/blog_project_app/admin.py create mode 100644 Code/Richard/django/lab-02/blog_project_app/apps.py create mode 100644 Code/Richard/django/lab-02/blog_project_app/migrations/0001_initial.py create mode 100644 Code/Richard/django/lab-02/blog_project_app/migrations/0002_blogpost_date_edited.py create mode 100644 Code/Richard/django/lab-02/blog_project_app/migrations/0003_alter_blogpost_date_edited.py create mode 100644 Code/Richard/django/lab-02/blog_project_app/migrations/__init__.py create mode 100644 Code/Richard/django/lab-02/blog_project_app/models.py create mode 100644 Code/Richard/django/lab-02/blog_project_app/static/index.css create mode 100644 Code/Richard/django/lab-02/blog_project_app/static/normalize.css create mode 100644 Code/Richard/django/lab-02/blog_project_app/templates/blog_project_app/create.html create mode 100644 Code/Richard/django/lab-02/blog_project_app/templates/blog_project_app/index.html create mode 100644 Code/Richard/django/lab-02/blog_project_app/tests.py create mode 100644 Code/Richard/django/lab-02/blog_project_app/urls.py create mode 100644 Code/Richard/django/lab-02/blog_project_app/views.py create mode 100644 Code/Richard/django/lab-02/manage.py create mode 100644 Code/Richard/django/lab-02/users/__init__.py create mode 100644 Code/Richard/django/lab-02/users/admin.py create mode 100644 Code/Richard/django/lab-02/users/apps.py create mode 100644 Code/Richard/django/lab-02/users/migrations/0001_initial.py create mode 100644 Code/Richard/django/lab-02/users/migrations/__init__.py create mode 100644 Code/Richard/django/lab-02/users/models.py create mode 100644 Code/Richard/django/lab-02/users/static/normalize.css create mode 100644 Code/Richard/django/lab-02/users/templates/users/login.html create mode 100644 Code/Richard/django/lab-02/users/templates/users/profile.html create mode 100644 Code/Richard/django/lab-02/users/templates/users/register.html create mode 100644 Code/Richard/django/lab-02/users/tests.py create mode 100644 Code/Richard/django/lab-02/users/urls.py create mode 100644 Code/Richard/django/lab-02/users/views.py diff --git a/Code/Richard/django/lab-02/blog_project/__init__.py b/Code/Richard/django/lab-02/blog_project/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Code/Richard/django/lab-02/blog_project/asgi.py b/Code/Richard/django/lab-02/blog_project/asgi.py new file mode 100644 index 00000000..f99cd99a --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for blog_project project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blog_project.settings') + +application = get_asgi_application() diff --git a/Code/Richard/django/lab-02/blog_project/settings.py b/Code/Richard/django/lab-02/blog_project/settings.py new file mode 100644 index 00000000..65670079 --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project/settings.py @@ -0,0 +1,127 @@ +""" +Django settings for blog_project project. + +Generated by 'django-admin startproject' using Django 4.0.1. + +For more information on this file, see +https://docs.djangoproject.com/en/4.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.0/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-)+zif&+@7#o21=^rs@xi5uv@iw)6dytcd*cctzi7pbme-kxu0$' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'users', + 'blog_project_app' +] + +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 = 'blog_project.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 = 'blog_project.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.0/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.0/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/4.0/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'America/Indiana/Knox' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.0/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +AUTH_USER_MODEL = 'users.CustomUser' diff --git a/Code/Richard/django/lab-02/blog_project/urls.py b/Code/Richard/django/lab-02/blog_project/urls.py new file mode 100644 index 00000000..1c2e796c --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project/urls.py @@ -0,0 +1,23 @@ +"""blog_project URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.0/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 + +urlpatterns = [ + path('admin/', admin.site.urls), + path('', include('blog_project_app.urls')), + path('users/', include('users.urls')) +] diff --git a/Code/Richard/django/lab-02/blog_project/wsgi.py b/Code/Richard/django/lab-02/blog_project/wsgi.py new file mode 100644 index 00000000..97b2fc7c --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for blog_project 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/4.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blog_project.settings') + +application = get_wsgi_application() diff --git a/Code/Richard/django/lab-02/blog_project_app/__init__.py b/Code/Richard/django/lab-02/blog_project_app/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Code/Richard/django/lab-02/blog_project_app/admin.py b/Code/Richard/django/lab-02/blog_project_app/admin.py new file mode 100644 index 00000000..1a7ee96a --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project_app/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin +from .models import BlogPost + +# Register your models here. + +admin.site.register(BlogPost) \ No newline at end of file diff --git a/Code/Richard/django/lab-02/blog_project_app/apps.py b/Code/Richard/django/lab-02/blog_project_app/apps.py new file mode 100644 index 00000000..5c3e929a --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project_app/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class BlogProjectAppConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'blog_project_app' diff --git a/Code/Richard/django/lab-02/blog_project_app/migrations/0001_initial.py b/Code/Richard/django/lab-02/blog_project_app/migrations/0001_initial.py new file mode 100644 index 00000000..13e66744 --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project_app/migrations/0001_initial.py @@ -0,0 +1,28 @@ +# Generated by Django 4.0.1 on 2022-01-06 04:34 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='BlogPost', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100)), + ('body', models.CharField(max_length=3000)), + ('public', models.BooleanField()), + ('date_created', models.DateTimeField(auto_now_add=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='blogpost', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/Code/Richard/django/lab-02/blog_project_app/migrations/0002_blogpost_date_edited.py b/Code/Richard/django/lab-02/blog_project_app/migrations/0002_blogpost_date_edited.py new file mode 100644 index 00000000..da78649a --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project_app/migrations/0002_blogpost_date_edited.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0.1 on 2022-01-07 03:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog_project_app', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='blogpost', + name='date_edited', + field=models.DateTimeField(auto_now=True), + preserve_default=False, + ), + ] diff --git a/Code/Richard/django/lab-02/blog_project_app/migrations/0003_alter_blogpost_date_edited.py b/Code/Richard/django/lab-02/blog_project_app/migrations/0003_alter_blogpost_date_edited.py new file mode 100644 index 00000000..aec11687 --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project_app/migrations/0003_alter_blogpost_date_edited.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.1 on 2022-01-07 03:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog_project_app', '0002_blogpost_date_edited'), + ] + + operations = [ + migrations.AlterField( + model_name='blogpost', + name='date_edited', + field=models.DateTimeField(auto_now=True), + ), + ] diff --git a/Code/Richard/django/lab-02/blog_project_app/migrations/__init__.py b/Code/Richard/django/lab-02/blog_project_app/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Code/Richard/django/lab-02/blog_project_app/models.py b/Code/Richard/django/lab-02/blog_project_app/models.py new file mode 100644 index 00000000..e1396013 --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project_app/models.py @@ -0,0 +1,16 @@ +from django.db import models +from django.db.models.fields import BooleanField, DateTimeField +from django.db.models.fields.related import ForeignKey +from users.models import CustomUser +# Create your models here. + +class BlogPost(models.Model): + title = models.CharField(max_length=100) + body = models.CharField(max_length=3000) + user= models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='blogpost') + public = models.BooleanField() + date_created=models.DateTimeField(auto_now_add=True) + date_edited=models.DateTimeField(auto_now=True) + +def __str__(self): + return f"{self.title} {self.body} {self.user} {self.created_date}" \ No newline at end of file diff --git a/Code/Richard/django/lab-02/blog_project_app/static/index.css b/Code/Richard/django/lab-02/blog_project_app/static/index.css new file mode 100644 index 00000000..e69de29b diff --git a/Code/Richard/django/lab-02/blog_project_app/static/normalize.css b/Code/Richard/django/lab-02/blog_project_app/static/normalize.css new file mode 100644 index 00000000..3c1b6242 --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project_app/static/normalize.css @@ -0,0 +1,431 @@ +/* Document + * ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + + html { + line-height: 1.15; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ + } + + /* Sections + * ========================================================================== */ + + /** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Edge, Firefox, and Safari. + */ + + h1 { + font-size: 2em; + margin: 0.67em 0; + } + + /* Grouping content + * ========================================================================== */ + + /** + * Remove the margin on nested lists in Chrome, Edge, IE, and Safari. + */ + + dl dl, + dl ol, + dl ul, + ol dl, + ul dl { + margin: 0; + } + + /** + * Remove the margin on nested lists in Edge 18- and IE. + */ + + ol ol, + ol ul, + ul ol, + ul ul { + margin: 0; + } + + /** + * 1. Add the correct box sizing in Firefox. + * 2. Correct the inheritance of border color in Firefox. + * 3. Show the overflow in Edge 18- and IE. + */ + + hr { + box-sizing: content-box; /* 1 */ + color: inherit; /* 2 */ + height: 0; /* 1 */ + overflow: visible; /* 3 */ + } + + /** + * Add the correct display in IE. + */ + + main { + display: block; + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /* Text-level semantics + * ========================================================================== */ + + /** + * Remove the gray background on active links in IE 10. + */ + + a { + background-color: transparent; + } + + /** + * Add the correct text decoration in Edge 18-, IE, and Safari. + */ + + abbr[title] { + text-decoration: underline; + text-decoration: underline dotted; + } + + /** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + + b, + strong { + font-weight: bolder; + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + code, + kbd, + samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /** + * Add the correct font size in all browsers. + */ + + small { + font-size: 80%; + } + + /* Embedded content + * ========================================================================== */ + + /** + * Add the correct display in IE 9-. + */ + + audio, + video { + display: inline-block; + } + + /** + * Add the correct display in iOS 4-7. + */ + + audio:not([controls]) { + display: none; + height: 0; + } + + /** + * Remove the border on images within links in IE 10-. + */ + + img { + border-style: none; + } + + /** + * Hide the overflow in IE. + */ + + svg:not(:root) { + overflow: hidden; + } + + /* Tabular data + * ========================================================================== */ + + /** + * 1. Correct table border color inheritance in all Chrome, Edge, and Safari. + * 2. Remove text indentation from table contents in Chrome, Edge, and Safari. + */ + + table { + border-color: inherit; /* 1 */ + text-indent: 0; /* 2 */ + } + + /* Forms + * ========================================================================== */ + + /** + * Remove the margin on controls in Safari. + */ + + button, + input, + select { + margin: 0; + } + + /** + * 1. Show the overflow in IE. + * 2. Remove the inheritance of text transform in Edge 18-, Firefox, and IE. + */ + + button { + overflow: visible; /* 1 */ + text-transform: none; /* 2 */ + } + + /** + * Correct the inability to style buttons in iOS and Safari. + */ + + button, + [type="button"], + [type="reset"], + [type="submit"] { + -webkit-appearance: button; + } + + /** + * Correct the padding in Firefox. + */ + + fieldset { + padding: 0.35em 0.75em 0.625em; + } + + /** + * Show the overflow in Edge 18- and IE. + */ + + input { + overflow: visible; + } + + /** + * 1. Correct the text wrapping in Edge 18- and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + */ + + legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + white-space: normal; /* 1 */ + } + + /** + * 1. Add the correct display in Edge 18- and IE. + * 2. Add the correct vertical alignment in Chrome, Edge, and Firefox. + */ + + progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ + } + + /** + * Remove the inheritance of text transform in Firefox. + */ + + select { + text-transform: none; + } + + /** + * 1. Remove the margin in Firefox and Safari. + * 2. Remove the default vertical scrollbar in IE. + */ + + textarea { + margin: 0; /* 1 */ + overflow: auto; /* 2 */ + } + + /** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + + [type="checkbox"], + [type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + } + + /** + * 1. Correct the odd appearance in Chrome, Edge, and Safari. + * 2. Correct the outline style in Safari. + */ + + [type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + } + + /** + * Correct the cursor style of increment and decrement buttons in Safari. + */ + + ::-webkit-inner-spin-button, + ::-webkit-outer-spin-button { + height: auto; + } + + /** + * Correct the text style of placeholders in Chrome, Edge, and Safari. + */ + + ::-webkit-input-placeholder { + color: inherit; + opacity: 0.54; + } + + /** + * Remove the inner padding in Chrome, Edge, and Safari on macOS. + */ + + ::-webkit-search-decoration { + -webkit-appearance: none; + } + + /** + * 1. Correct the inability to style upload buttons in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + + ::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ + } + + /** + * Remove the inner border and padding of focus outlines in Firefox. + */ + + ::-moz-focus-inner { + border-style: none; + padding: 0; + } + + /** + * Restore the focus outline styles unset by the previous rule in Firefox. + */ + + :-moz-focusring { + outline: 1px dotted ButtonText; + } + + /** + * Remove the additional :invalid styles in Firefox. + */ + + :-moz-ui-invalid { + box-shadow: none; + } + + /* Interactive + * ========================================================================== */ + + /* + * Add the correct display in Edge 18- and IE. + */ + + details { + display: block; + } + + /* + * Add the correct styles in Edge 18-, IE, and Safari. + */ + + dialog { + background-color: white; + border: solid; + color: black; + display: block; + height: -moz-fit-content; + height: -webkit-fit-content; + height: fit-content; + left: 0; + margin: auto; + padding: 1em; + position: absolute; + right: 0; + width: -moz-fit-content; + width: -webkit-fit-content; + width: fit-content; + } + + dialog:not([open]) { + display: none; + } + + /* + * Add the correct display in all browsers. + */ + + summary { + display: list-item; + } + + /* Scripting + * ========================================================================== */ + + /** + * Add the correct display in IE 9-. + */ + + canvas { + display: inline-block; + } + + /** + * Add the correct display in IE. + */ + + template { + display: none; + } + + /* User interaction + * ========================================================================== */ + + /** + * Add the correct display in IE 10-. + */ + + [hidden] { + display: none; + } \ No newline at end of file diff --git a/Code/Richard/django/lab-02/blog_project_app/templates/blog_project_app/create.html b/Code/Richard/django/lab-02/blog_project_app/templates/blog_project_app/create.html new file mode 100644 index 00000000..49ed86f6 --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project_app/templates/blog_project_app/create.html @@ -0,0 +1,21 @@ + + + + + + + + + + +{% load static %} + + + + Create Blog Post + + + +

{{ message }}

+ + \ No newline at end of file diff --git a/Code/Richard/django/lab-02/blog_project_app/templates/blog_project_app/index.html b/Code/Richard/django/lab-02/blog_project_app/templates/blog_project_app/index.html new file mode 100644 index 00000000..0beef1d5 --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project_app/templates/blog_project_app/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + {% load static %} + + + + Django Blog Project + + + + +
+
+
+ {% for blogpost in blogposts %} +

{{ blogpost.title }}

+
{{blogpost.body}}
+
--{{blogpost.user}}-- {{blogpost.date_created|date}}
+ {% endfor %} +
+
+
+ + + \ No newline at end of file diff --git a/Code/Richard/django/lab-02/blog_project_app/tests.py b/Code/Richard/django/lab-02/blog_project_app/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project_app/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/Code/Richard/django/lab-02/blog_project_app/urls.py b/Code/Richard/django/lab-02/blog_project_app/urls.py new file mode 100644 index 00000000..f7b98bee --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project_app/urls.py @@ -0,0 +1,8 @@ +from django.urls import path +from . import views + +app_name='blog_project_app' +urlpatterns = [ + path('', views.blogview, name='blogview'), + path('create/', views.createpostview, name='createpostview') +] \ No newline at end of file diff --git a/Code/Richard/django/lab-02/blog_project_app/views.py b/Code/Richard/django/lab-02/blog_project_app/views.py new file mode 100644 index 00000000..8a8d3d42 --- /dev/null +++ b/Code/Richard/django/lab-02/blog_project_app/views.py @@ -0,0 +1,62 @@ +from django.shortcuts import render, reverse +from django.http import HttpResponse, HttpResponseRedirect, request +from .models import BlogPost +from users.models import CustomUser +# Create your views here. + +def blogview(request): + blogposts= BlogPost.objects.all() + context = { + 'blogposts': blogposts + } + return render(request, 'blog_project_app/index.html', context) + +def profileview(request): + blogposts= BlogPost.objects.all() + + context = { + 'blogposts': blogposts + } + + return render(request, 'blog_project_app/profile.html', context) + +def createpostview(request): + context = { + 'message': 'create post here' + } + + return render(request, 'blog_project_app/create.html', context) + +def registerview(request): + # blogposts= BlogPost.objects.all() + # context = { + # 'blogposts': blogposts + # } + # return render(request, 'blog_project_app/register.html', context) + + if request.method == 'GET': + return render(request, 'users/register.html') + + elif request.method == 'POST': + form = request.POST + + username = form['username'] + password = form['password'] + email = form['email'] + first_name = form['first-name'] + last_name = form['last-name'] + + print(username, password, email, first_name, last_name) + + # create a new user with the form data + new_user = CustomUser.objects.create_user( + username=username, + email=email, + password=password, + first_name=first_name, + last_name=last_name, + ) + + django_login(request, new_user) + + return HttpResponseRedirect(reverse('blog_project_app:index')) \ No newline at end of file diff --git a/Code/Richard/django/lab-02/manage.py b/Code/Richard/django/lab-02/manage.py new file mode 100644 index 00000000..e04dc851 --- /dev/null +++ b/Code/Richard/django/lab-02/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blog_project.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) + + +if __name__ == '__main__': + main() diff --git a/Code/Richard/django/lab-02/users/__init__.py b/Code/Richard/django/lab-02/users/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Code/Richard/django/lab-02/users/admin.py b/Code/Richard/django/lab-02/users/admin.py new file mode 100644 index 00000000..9bfbf559 --- /dev/null +++ b/Code/Richard/django/lab-02/users/admin.py @@ -0,0 +1,7 @@ +from django.contrib import admin +from django.contrib.auth.admin import UserAdmin +from .models import CustomUser + +admin.site.register(CustomUser, UserAdmin) + +# Register your models here. diff --git a/Code/Richard/django/lab-02/users/apps.py b/Code/Richard/django/lab-02/users/apps.py new file mode 100644 index 00000000..72b14010 --- /dev/null +++ b/Code/Richard/django/lab-02/users/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'users' diff --git a/Code/Richard/django/lab-02/users/migrations/0001_initial.py b/Code/Richard/django/lab-02/users/migrations/0001_initial.py new file mode 100644 index 00000000..c7902cb3 --- /dev/null +++ b/Code/Richard/django/lab-02/users/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 4.0.1 on 2022-01-05 03:43 + +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', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='CustomUser', + fields=[ + ('id', models.BigAutoField(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=150, 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/Code/Richard/django/lab-02/users/migrations/__init__.py b/Code/Richard/django/lab-02/users/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Code/Richard/django/lab-02/users/models.py b/Code/Richard/django/lab-02/users/models.py new file mode 100644 index 00000000..8834cb5b --- /dev/null +++ b/Code/Richard/django/lab-02/users/models.py @@ -0,0 +1,10 @@ +from django.db import models +from django.contrib.auth.models import AbstractUser +# Create your models here. + +class CustomUser(AbstractUser): + pass + +def __str__(self): + return self.username + diff --git a/Code/Richard/django/lab-02/users/static/normalize.css b/Code/Richard/django/lab-02/users/static/normalize.css new file mode 100644 index 00000000..3c1b6242 --- /dev/null +++ b/Code/Richard/django/lab-02/users/static/normalize.css @@ -0,0 +1,431 @@ +/* Document + * ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ + + html { + line-height: 1.15; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ + } + + /* Sections + * ========================================================================== */ + + /** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Edge, Firefox, and Safari. + */ + + h1 { + font-size: 2em; + margin: 0.67em 0; + } + + /* Grouping content + * ========================================================================== */ + + /** + * Remove the margin on nested lists in Chrome, Edge, IE, and Safari. + */ + + dl dl, + dl ol, + dl ul, + ol dl, + ul dl { + margin: 0; + } + + /** + * Remove the margin on nested lists in Edge 18- and IE. + */ + + ol ol, + ol ul, + ul ol, + ul ul { + margin: 0; + } + + /** + * 1. Add the correct box sizing in Firefox. + * 2. Correct the inheritance of border color in Firefox. + * 3. Show the overflow in Edge 18- and IE. + */ + + hr { + box-sizing: content-box; /* 1 */ + color: inherit; /* 2 */ + height: 0; /* 1 */ + overflow: visible; /* 3 */ + } + + /** + * Add the correct display in IE. + */ + + main { + display: block; + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /* Text-level semantics + * ========================================================================== */ + + /** + * Remove the gray background on active links in IE 10. + */ + + a { + background-color: transparent; + } + + /** + * Add the correct text decoration in Edge 18-, IE, and Safari. + */ + + abbr[title] { + text-decoration: underline; + text-decoration: underline dotted; + } + + /** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + + b, + strong { + font-weight: bolder; + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + code, + kbd, + samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /** + * Add the correct font size in all browsers. + */ + + small { + font-size: 80%; + } + + /* Embedded content + * ========================================================================== */ + + /** + * Add the correct display in IE 9-. + */ + + audio, + video { + display: inline-block; + } + + /** + * Add the correct display in iOS 4-7. + */ + + audio:not([controls]) { + display: none; + height: 0; + } + + /** + * Remove the border on images within links in IE 10-. + */ + + img { + border-style: none; + } + + /** + * Hide the overflow in IE. + */ + + svg:not(:root) { + overflow: hidden; + } + + /* Tabular data + * ========================================================================== */ + + /** + * 1. Correct table border color inheritance in all Chrome, Edge, and Safari. + * 2. Remove text indentation from table contents in Chrome, Edge, and Safari. + */ + + table { + border-color: inherit; /* 1 */ + text-indent: 0; /* 2 */ + } + + /* Forms + * ========================================================================== */ + + /** + * Remove the margin on controls in Safari. + */ + + button, + input, + select { + margin: 0; + } + + /** + * 1. Show the overflow in IE. + * 2. Remove the inheritance of text transform in Edge 18-, Firefox, and IE. + */ + + button { + overflow: visible; /* 1 */ + text-transform: none; /* 2 */ + } + + /** + * Correct the inability to style buttons in iOS and Safari. + */ + + button, + [type="button"], + [type="reset"], + [type="submit"] { + -webkit-appearance: button; + } + + /** + * Correct the padding in Firefox. + */ + + fieldset { + padding: 0.35em 0.75em 0.625em; + } + + /** + * Show the overflow in Edge 18- and IE. + */ + + input { + overflow: visible; + } + + /** + * 1. Correct the text wrapping in Edge 18- and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + */ + + legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + white-space: normal; /* 1 */ + } + + /** + * 1. Add the correct display in Edge 18- and IE. + * 2. Add the correct vertical alignment in Chrome, Edge, and Firefox. + */ + + progress { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ + } + + /** + * Remove the inheritance of text transform in Firefox. + */ + + select { + text-transform: none; + } + + /** + * 1. Remove the margin in Firefox and Safari. + * 2. Remove the default vertical scrollbar in IE. + */ + + textarea { + margin: 0; /* 1 */ + overflow: auto; /* 2 */ + } + + /** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + + [type="checkbox"], + [type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + } + + /** + * 1. Correct the odd appearance in Chrome, Edge, and Safari. + * 2. Correct the outline style in Safari. + */ + + [type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + } + + /** + * Correct the cursor style of increment and decrement buttons in Safari. + */ + + ::-webkit-inner-spin-button, + ::-webkit-outer-spin-button { + height: auto; + } + + /** + * Correct the text style of placeholders in Chrome, Edge, and Safari. + */ + + ::-webkit-input-placeholder { + color: inherit; + opacity: 0.54; + } + + /** + * Remove the inner padding in Chrome, Edge, and Safari on macOS. + */ + + ::-webkit-search-decoration { + -webkit-appearance: none; + } + + /** + * 1. Correct the inability to style upload buttons in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + + ::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ + } + + /** + * Remove the inner border and padding of focus outlines in Firefox. + */ + + ::-moz-focus-inner { + border-style: none; + padding: 0; + } + + /** + * Restore the focus outline styles unset by the previous rule in Firefox. + */ + + :-moz-focusring { + outline: 1px dotted ButtonText; + } + + /** + * Remove the additional :invalid styles in Firefox. + */ + + :-moz-ui-invalid { + box-shadow: none; + } + + /* Interactive + * ========================================================================== */ + + /* + * Add the correct display in Edge 18- and IE. + */ + + details { + display: block; + } + + /* + * Add the correct styles in Edge 18-, IE, and Safari. + */ + + dialog { + background-color: white; + border: solid; + color: black; + display: block; + height: -moz-fit-content; + height: -webkit-fit-content; + height: fit-content; + left: 0; + margin: auto; + padding: 1em; + position: absolute; + right: 0; + width: -moz-fit-content; + width: -webkit-fit-content; + width: fit-content; + } + + dialog:not([open]) { + display: none; + } + + /* + * Add the correct display in all browsers. + */ + + summary { + display: list-item; + } + + /* Scripting + * ========================================================================== */ + + /** + * Add the correct display in IE 9-. + */ + + canvas { + display: inline-block; + } + + /** + * Add the correct display in IE. + */ + + template { + display: none; + } + + /* User interaction + * ========================================================================== */ + + /** + * Add the correct display in IE 10-. + */ + + [hidden] { + display: none; + } \ No newline at end of file diff --git a/Code/Richard/django/lab-02/users/templates/users/login.html b/Code/Richard/django/lab-02/users/templates/users/login.html new file mode 100644 index 00000000..44dbc79b --- /dev/null +++ b/Code/Richard/django/lab-02/users/templates/users/login.html @@ -0,0 +1,33 @@ + + + + + + + + + + + {% load static %} + + + Login Page + + +
+
+ {% csrf_token %} + Username +
+ Password +
+ +
+
+ + \ No newline at end of file diff --git a/Code/Richard/django/lab-02/users/templates/users/profile.html b/Code/Richard/django/lab-02/users/templates/users/profile.html new file mode 100644 index 00000000..fec8d435 --- /dev/null +++ b/Code/Richard/django/lab-02/users/templates/users/profile.html @@ -0,0 +1,34 @@ + + + + + + + + + + +{% load static %} + + + + Profile Page + + + +

{{ current_user.username}}'s Profile Page

+ +
+
+
+ {% for blogpost in blogposts %} +

{{ blogpost.title }}

+
Created{{blogpost.date_created}}
+ {% endfor %} +
+
+
+ + + + \ No newline at end of file diff --git a/Code/Richard/django/lab-02/users/templates/users/register.html b/Code/Richard/django/lab-02/users/templates/users/register.html new file mode 100644 index 00000000..beeb30f6 --- /dev/null +++ b/Code/Richard/django/lab-02/users/templates/users/register.html @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + User Registration Page + + + + {% load static %} +
+

Register for Blog Account

+
+
+
+
+ {% csrf_token %} + Username +
+ First Name +
+ Last Name +
+ Email Address +
+ Password +
+ Confirm Password +
+ +
Your password can’t be too similar to your other personal information. +
+ Your password must contain at least 8 characters. +
+ Your password can’t be a commonly used password. +
+ Your password can’t be entirely numeric. +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/Code/Richard/django/lab-02/users/tests.py b/Code/Richard/django/lab-02/users/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/Code/Richard/django/lab-02/users/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/Code/Richard/django/lab-02/users/urls.py b/Code/Richard/django/lab-02/users/urls.py new file mode 100644 index 00000000..54fc3a32 --- /dev/null +++ b/Code/Richard/django/lab-02/users/urls.py @@ -0,0 +1,11 @@ +from django.urls import path + +from . import views + +app_name='users' +urlpatterns = [ + path('register/', views.register, name='register'), + path('login/', views.login, name='login'), + path('logout/', views.logout, name='logout'), + path('profile/', views.profileview, name='profileview') +] \ No newline at end of file diff --git a/Code/Richard/django/lab-02/users/views.py b/Code/Richard/django/lab-02/users/views.py new file mode 100644 index 00000000..224623de --- /dev/null +++ b/Code/Richard/django/lab-02/users/views.py @@ -0,0 +1,77 @@ +from django.shortcuts import render, reverse +from django.http import HttpResponseRedirect +from blog_project_app.models import BlogPost +from django.contrib.auth import ( + authenticate, + login as django_login, + logout as django_logout +) +from users.models import CustomUser + +def register(request): + if request.method == 'GET': + return render(request, 'users/register.html') + + elif request.method == 'POST': + form = request.POST + username = form['username'] + password = form['password'] + email = form['email'] + first_name = form['first-name'] + last_name = form['last-name'] + + print(username, password, email, first_name, last_name) + + # create a new user with the form data + new_user = CustomUser.objects.create_user( + username=username, + email=email, + password=password, + first_name=first_name, + last_name=last_name, + ) + + django_login(request, new_user) + # return render(request, '/') + return HttpResponseRedirect(reverse('users:profileview')) + + +def login(request): + if request.method == 'GET': + return render(request, 'users/login.html') + + elif request.method == 'POST': + form = request.POST + + # pull the form information from the form + username = form['username'] + password = form['password'] + + user = authenticate(request, username=username, password=password) + + if user is None: + return render(request, 'users/login.html', {'error': 'Invalid Username or Password!'}) + + + # if the user is authenticated, log them in + django_login(request, user) + + return HttpResponseRedirect(reverse('users:profileview')) + +def logout(request): + django_logout(request) + + return HttpResponseRedirect(reverse('blog_project_app:index')) + +def account(request): + pass + +def profileview(request): + blogposts= BlogPost.objects.filter(user=request.user) + + context = { + 'current_user':request.user, + 'blogposts': blogposts + } + + return render(request, 'users/profile.html', context) \ No newline at end of file