diff --git a/.gitignore copy b/.gitignore copy
new file mode 100644
index 0000000..b6e4761
--- /dev/null
+++ b/.gitignore copy
@@ -0,0 +1,129 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+pip-wheel-metadata/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+.python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
diff --git a/404_error.html b/404_error.html
deleted file mode 100644
index 0a613d7..0000000
--- a/404_error.html
+++ /dev/null
@@ -1,90 +0,0 @@
-
-
-
-
-
-
- Document
-
-
-
-
-
-
-
Oops, We can't seem to find
- the page that you are looking for.
-
Back to Home
-
-
-
-
\ No newline at end of file
diff --git a/504_error.html b/504_error.html
deleted file mode 100644
index 0415aec..0000000
--- a/504_error.html
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
-
-
-
- Document
-
-
-
-
-
-
-
The server encountered a temporary error and could not complete
- your request. Please try again in 30 seconds.
-
Reload page
-
-
-
-
\ No newline at end of file
diff --git a/README copy.md b/README copy.md
new file mode 100644
index 0000000..56f0df5
--- /dev/null
+++ b/README copy.md
@@ -0,0 +1 @@
+# col-film.github.io
\ No newline at end of file
diff --git a/Samples/All-Vimeo-All-Channels.png b/Samples/All-Vimeo-All-Channels.png
new file mode 100644
index 0000000..7d198d1
Binary files /dev/null and b/Samples/All-Vimeo-All-Channels.png differ
diff --git a/Samples/Creator's-Profile-View.png b/Samples/Creator's-Profile-View.png
new file mode 100644
index 0000000..337f914
Binary files /dev/null and b/Samples/Creator's-Profile-View.png differ
diff --git a/Samples/Vimeo-watch-description.png b/Samples/Vimeo-watch-description.png
new file mode 100644
index 0000000..00f4690
Binary files /dev/null and b/Samples/Vimeo-watch-description.png differ
diff --git a/Samples/Vimeo.png b/Samples/Vimeo.png
new file mode 100644
index 0000000..4d7e41c
Binary files /dev/null and b/Samples/Vimeo.png differ
diff --git a/Samples/Watch-Screen-Vimeo.png b/Samples/Watch-Screen-Vimeo.png
new file mode 100644
index 0000000..5e4c418
Binary files /dev/null and b/Samples/Watch-Screen-Vimeo.png differ
diff --git a/Samples/Watch-Screen.png b/Samples/Watch-Screen.png
new file mode 100644
index 0000000..b485728
Binary files /dev/null and b/Samples/Watch-Screen.png differ
diff --git a/Samples/Youtube-homepage.png b/Samples/Youtube-homepage.png
new file mode 100644
index 0000000..8d70906
Binary files /dev/null and b/Samples/Youtube-homepage.png differ
diff --git a/accounts/__init__.py b/accounts/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/accounts/admin.py b/accounts/admin.py
new file mode 100644
index 0000000..e69de29
diff --git a/accounts/apps.py b/accounts/apps.py
new file mode 100644
index 0000000..3e3c765
--- /dev/null
+++ b/accounts/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class AccountsConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'accounts'
diff --git a/accounts/migrations/__init__.py b/accounts/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/accounts/models.py b/accounts/models.py
new file mode 100644
index 0000000..e69de29
diff --git a/accounts/templates/favourites.html b/accounts/templates/favourites.html
new file mode 100644
index 0000000..499589d
--- /dev/null
+++ b/accounts/templates/favourites.html
@@ -0,0 +1,40 @@
+{% extends "base.html" %}
+
+{% block page_header %}
+Log in to your account.
+{% endblock page_header %}
+
+{% block content %}
+
+ Lists of all Favourites
+
+ {% for favourite in favourites %}
+
+
+
+
+
+
+
+ {% empty %}
+
+
+ No Favourites Yet!
+
+
+
+ Would you like to checkout some Movies?
+
+ {% endfor %}
+
+{% endblock content %}
+
+
+
+
+
+
+
+
+
+
diff --git a/accounts/templates/profile.html b/accounts/templates/profile.html
new file mode 100644
index 0000000..57264ea
--- /dev/null
+++ b/accounts/templates/profile.html
@@ -0,0 +1,73 @@
+{% extends "base.html" %}
+
+{% block page_header %}
+Log in to your account.
+{% endblock page_header %}
+
+{% block content %}
+
+
+
+ User Details
+
+
+ {{ user.username }}
+
+ {{ user.userinfo.user_type }}
+
+
+
+ Lists of all Signin User's Videos
+
+ {% for movie in movies %}
+
+
+
+
+
+
+
+ {% empty %}
+
+
+ No movie Yet!
+
+
+
+ Would you like to UPLOAD a Movie?
+
+ {% endfor %}
+
+
+ Lists of all Favourites
+
+ {% for favourite in favourites %}
+
+
+
+
+
+
+
+ {% empty %}
+
+
+ No Favourites Yet!
+
+
+
+ Would you like to checkout some Movies?
+
+ {% endfor %}
+
+{% endblock content %}
+
+
+
+
+
+
+
+
+
+
diff --git a/accounts/templates/registration/logged_out.html b/accounts/templates/registration/logged_out.html
new file mode 100644
index 0000000..77827fc
--- /dev/null
+++ b/accounts/templates/registration/logged_out.html
@@ -0,0 +1,22 @@
+{% extends "movies/base.html" %}
+
+
+{% block page_header %}
+ Logged Out
+{% endblock page_header %}
+
+{% block content %}
+
+{% endblock content %}
+
+
+
diff --git a/accounts/templates/registration/login.html b/accounts/templates/registration/login.html
new file mode 100644
index 0000000..2e6daf8
--- /dev/null
+++ b/accounts/templates/registration/login.html
@@ -0,0 +1,19 @@
+{% extends "base.html" %}
+
+{% block page_header %}
+ Log in to your account.
+{% endblock page_header %}
+
+{% block content %}
+
+
+
+{% endblock content %}
+
diff --git a/accounts/templates/registration/register.html b/accounts/templates/registration/register.html
new file mode 100644
index 0000000..ca999b1
--- /dev/null
+++ b/accounts/templates/registration/register.html
@@ -0,0 +1,21 @@
+{% extends "base.html" %}
+
+{% block page_header %}
+ Create An Account.
+{% endblock page_header %}
+
+{% block content %}
+
+
+
+{% endblock content %}
+
diff --git a/accounts/tests.py b/accounts/tests.py
new file mode 100644
index 0000000..c2629a3
--- /dev/null
+++ b/accounts/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
\ No newline at end of file
diff --git a/accounts/urls.py b/accounts/urls.py
new file mode 100644
index 0000000..984150d
--- /dev/null
+++ b/accounts/urls.py
@@ -0,0 +1,19 @@
+from django.urls import path,include
+from . import views
+
+app_name = "accounts"
+
+urlpatterns = [
+ #Default auth urls.
+ path('', include('django.contrib.auth.urls')),
+
+ #Register Page
+ path('register/', views.register, name='register'),
+
+ path('profile/', views.profile, name='profile'),
+
+ path('profile/favourites/', views.list_favourites, name='list_favourites'),
+
+ path('favourites/', views.add_favourite, name='add_favourite'),
+
+]
\ No newline at end of file
diff --git a/accounts/views.py b/accounts/views.py
new file mode 100644
index 0000000..aae22e6
--- /dev/null
+++ b/accounts/views.py
@@ -0,0 +1,92 @@
+
+from django.shortcuts import render, redirect
+from django.contrib.auth import login
+from django.contrib.auth.forms import UserCreationForm
+from movies.forms import CustomUserCreationForm, UserInfoForm
+from django.contrib.auth.models import User
+from movies.models import Movie
+
+# def register(request):
+# """Register a new user"""
+# if request.method != 'POST':
+# #Display blank form
+# form = CustomUserCreationForm()
+# else:
+# # Process the completed form
+# form = CustomUserCreationForm(data=request.POST)
+
+# if form.is_valid:
+# new_user = form.save()
+
+# #Login the user in and redirect to home page
+
+# login(request, new_user)
+# return redirect('movies:index')
+
+# # Display Form filled or invalid
+# context = {'form': form}
+# return render(request, 'registration/register.html', context)
+
+def register(request):
+ """Register a new user"""
+ if request.method != 'POST':
+ #Display blank form
+ form = CustomUserCreationForm()
+ user_info_form = UserInfoForm()
+ else:
+ # Process the completed form
+ form = CustomUserCreationForm(data=request.POST)
+ user_info_form = UserInfoForm(request.POST, request.FILES or None)
+
+ if form.is_valid and user_info_form.is_valid():
+ new_user = form.save()
+
+ profile = user_info_form.save(commit=False)
+ profile.user = new_user
+ profile.save()
+
+ #Login the user in and redirect to home page
+
+ login(request,new_user)
+ return redirect('movies:index')
+
+ # Display Form filled or invalid
+ context = {'form': form, 'user_info_form': user_info_form}
+ return render(request, 'registration/register.html', context)
+
+
+from django.http import HttpResponse
+from django.contrib.auth.decorators import login_required
+# Create your views here.
+from movies.models import Movie, MovieComment
+from django.http import Http404
+
+@login_required
+def add_favourite(request, movie_id):
+ movie = Movie.objects.get(id=movie_id)
+ if movie.favourites.filter(id=request.user.id).exists():
+ movie.favourites.remove(request.user)
+ else:
+ movie.favourites.add(request.user)
+ return redirect('movies:view_movie', movie_id = movie_id)
+
+
+@login_required
+def list_favourites(request):
+ favourites = Movie.objects.filter(favourites=request.user)
+
+ context = {'favourites' : favourites}
+
+ return render(request, 'favourites.html', context)
+
+@login_required
+def profile(request):
+ user = request.user
+
+ movies = Movie.objects.filter(author=request.user)
+
+ favourites = Movie.objects.filter(favourites=request.user)
+
+ context = {'favourites' : favourites, 'movies' : movies, 'user' : user}
+
+ return render(request, 'profile.html', context)
diff --git a/base.html b/base.html
deleted file mode 100644
index d2793b4..0000000
--- a/base.html
+++ /dev/null
@@ -1,172 +0,0 @@
-
-
-
-
-
-
- Base page
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/m_env/Scripts/Activate.ps1 b/m_env/Scripts/Activate.ps1
new file mode 100644
index 0000000..b840595
--- /dev/null
+++ b/m_env/Scripts/Activate.ps1
@@ -0,0 +1,419 @@
+<#
+.Synopsis
+Activate a Python virtual environment for the current PowerShell session.
+
+.Description
+Pushes the python executable for a virtual environment to the front of the
+$Env:PATH environment variable and sets the prompt to signify that you are
+in a Python virtual environment. Makes use of the command line switches as
+well as the `pyvenv.cfg` file values present in the virtual environment.
+
+.Parameter VenvDir
+Path to the directory that contains the virtual environment to activate. The
+default value for this is the parent of the directory that the Activate.ps1
+script is located within.
+
+.Parameter Prompt
+The prompt prefix to display when this virtual environment is activated. By
+default, this prompt is the name of the virtual environment folder (VenvDir)
+surrounded by parentheses and followed by a single space (ie. '(.venv) ').
+
+.Example
+Activate.ps1
+Activates the Python virtual environment that contains the Activate.ps1 script.
+
+.Example
+Activate.ps1 -Verbose
+Activates the Python virtual environment that contains the Activate.ps1 script,
+and shows extra information about the activation as it executes.
+
+.Example
+Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
+Activates the Python virtual environment located in the specified location.
+
+.Example
+Activate.ps1 -Prompt "MyPython"
+Activates the Python virtual environment that contains the Activate.ps1 script,
+and prefixes the current prompt with the specified string (surrounded in
+parentheses) while the virtual environment is active.
+
+.Notes
+On Windows, it may be required to enable this Activate.ps1 script by setting the
+execution policy for the user. You can do this by issuing the following PowerShell
+command:
+
+PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
+
+For more information on Execution Policies:
+https://go.microsoft.com/fwlink/?LinkID=135170
+
+#>
+Param(
+ [Parameter(Mandatory = $false)]
+ [String]
+ $VenvDir,
+ [Parameter(Mandatory = $false)]
+ [String]
+ $Prompt
+)
+
+<# Function declarations --------------------------------------------------- #>
+
+<#
+.Synopsis
+Remove all shell session elements added by the Activate script, including the
+addition of the virtual environment's Python executable from the beginning of
+the PATH variable.
+
+.Parameter NonDestructive
+If present, do not remove this function from the global namespace for the
+session.
+
+#>
+function global:deactivate ([switch]$NonDestructive) {
+ # Revert to original values
+
+ # The prior prompt:
+ if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
+ Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
+ Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
+ }
+
+ # The prior PYTHONHOME:
+ if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
+ Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
+ Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
+ }
+
+ # The prior PATH:
+ if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
+ Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
+ Remove-Item -Path Env:_OLD_VIRTUAL_PATH
+ }
+
+ # Just remove the VIRTUAL_ENV altogether:
+ if (Test-Path -Path Env:VIRTUAL_ENV) {
+ Remove-Item -Path env:VIRTUAL_ENV
+ }
+
+ # Just remove VIRTUAL_ENV_PROMPT altogether.
+ if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) {
+ Remove-Item -Path env:VIRTUAL_ENV_PROMPT
+ }
+
+ # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
+ if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
+ Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
+ }
+
+ # Leave deactivate function in the global namespace if requested:
+ if (-not $NonDestructive) {
+ Remove-Item -Path function:deactivate
+ }
+}
+
+<#
+.Description
+Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
+given folder, and returns them in a map.
+
+For each line in the pyvenv.cfg file, if that line can be parsed into exactly
+two strings separated by `=` (with any amount of whitespace surrounding the =)
+then it is considered a `key = value` line. The left hand string is the key,
+the right hand is the value.
+
+If the value starts with a `'` or a `"` then the first and last character is
+stripped from the value before being captured.
+
+.Parameter ConfigDir
+Path to the directory that contains the `pyvenv.cfg` file.
+#>
+function Get-PyVenvConfig(
+ [String]
+ $ConfigDir
+) {
+ Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
+
+ # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
+ $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
+
+ # An empty map will be returned if no config file is found.
+ $pyvenvConfig = @{ }
+
+ if ($pyvenvConfigPath) {
+
+ Write-Verbose "File exists, parse `key = value` lines"
+ $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
+
+ $pyvenvConfigContent | ForEach-Object {
+ $keyval = $PSItem -split "\s*=\s*", 2
+ if ($keyval[0] -and $keyval[1]) {
+ $val = $keyval[1]
+
+ # Remove extraneous quotations around a string value.
+ if ("'""".Contains($val.Substring(0, 1))) {
+ $val = $val.Substring(1, $val.Length - 2)
+ }
+
+ $pyvenvConfig[$keyval[0]] = $val
+ Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
+ }
+ }
+ }
+ return $pyvenvConfig
+}
+
+
+<# Begin Activate script --------------------------------------------------- #>
+
+# Determine the containing directory of this script
+$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
+$VenvExecDir = Get-Item -Path $VenvExecPath
+
+Write-Verbose "Activation script is located in path: '$VenvExecPath'"
+Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
+Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
+
+# Set values required in priority: CmdLine, ConfigFile, Default
+# First, get the location of the virtual environment, it might not be
+# VenvExecDir if specified on the command line.
+if ($VenvDir) {
+ Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
+}
+else {
+ Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
+ $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
+ Write-Verbose "VenvDir=$VenvDir"
+}
+
+# Next, read the `pyvenv.cfg` file to determine any required value such
+# as `prompt`.
+$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
+
+# Next, set the prompt from the command line, or the config file, or
+# just use the name of the virtual environment folder.
+if ($Prompt) {
+ Write-Verbose "Prompt specified as argument, using '$Prompt'"
+}
+else {
+ Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
+ if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
+ Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
+ $Prompt = $pyvenvCfg['prompt'];
+ }
+ else {
+ Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)"
+ Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
+ $Prompt = Split-Path -Path $venvDir -Leaf
+ }
+}
+
+Write-Verbose "Prompt = '$Prompt'"
+Write-Verbose "VenvDir='$VenvDir'"
+
+# Deactivate any currently active virtual environment, but leave the
+# deactivate function in place.
+deactivate -nondestructive
+
+# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
+# that there is an activated venv.
+$env:VIRTUAL_ENV = $VenvDir
+
+if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
+
+ Write-Verbose "Setting prompt to '$Prompt'"
+
+ # Set the prompt to include the env name
+ # Make sure _OLD_VIRTUAL_PROMPT is global
+ function global:_OLD_VIRTUAL_PROMPT { "" }
+ Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
+ New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
+
+ function global:prompt {
+ Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
+ _OLD_VIRTUAL_PROMPT
+ }
+ $env:VIRTUAL_ENV_PROMPT = $Prompt
+}
+
+# Clear PYTHONHOME
+if (Test-Path -Path Env:PYTHONHOME) {
+ Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
+ Remove-Item -Path Env:PYTHONHOME
+}
+
+# Add the venv to the PATH
+Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
+$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
+
+# SIG # Begin signature block
+# MIIfnwYJKoZIhvcNAQcCoIIfkDCCH4wCAQExDzANBglghkgBZQMEAgEFADB5Bgor
+# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
+# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBnL745ElCYk8vk
+# dBtMuQhLeWJ3ZGfzKW4DHCYzAn+QB6CCDi8wggawMIIEmKADAgECAhAIrUCyYNKc
+# TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
+# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
+# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z
+# NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
+# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
+# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+# ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0
+# JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr
+# Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF
+# LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F
+# LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh
+# 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ
+# wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay
+# g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI
+# YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp
+# QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro
+# OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB
+# WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+
+# YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P
+# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk
+# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC
+# hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v
+# dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j
+# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED
+# MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql
+# +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF
+# UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h
+# mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw
+# YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld
+# AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw
+# 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP
+# LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE
+# QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn
+# KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji
+# WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq
+# yK+p/pQd52MbOoZWeE4wggd3MIIFX6ADAgECAhAHHxQbizANJfMU6yMM0NHdMA0G
+# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
+# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
+# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjIwMTE3MDAwMDAwWhcNMjUwMTE1
+# MjM1OTU5WjB8MQswCQYDVQQGEwJVUzEPMA0GA1UECBMGT3JlZ29uMRIwEAYDVQQH
+# EwlCZWF2ZXJ0b24xIzAhBgNVBAoTGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9u
+# MSMwIQYDVQQDExpQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjCCAiIwDQYJKoZI
+# hvcNAQEBBQADggIPADCCAgoCggIBAKgc0BTT+iKbtK6f2mr9pNMUTcAJxKdsuOiS
+# YgDFfwhjQy89koM7uP+QV/gwx8MzEt3c9tLJvDccVWQ8H7mVsk/K+X+IufBLCgUi
+# 0GGAZUegEAeRlSXxxhYScr818ma8EvGIZdiSOhqjYc4KnfgfIS4RLtZSrDFG2tN1
+# 6yS8skFa3IHyvWdbD9PvZ4iYNAS4pjYDRjT/9uzPZ4Pan+53xZIcDgjiTwOh8VGu
+# ppxcia6a7xCyKoOAGjvCyQsj5223v1/Ig7Dp9mGI+nh1E3IwmyTIIuVHyK6Lqu35
+# 2diDY+iCMpk9ZanmSjmB+GMVs+H/gOiofjjtf6oz0ki3rb7sQ8fTnonIL9dyGTJ0
+# ZFYKeb6BLA66d2GALwxZhLe5WH4Np9HcyXHACkppsE6ynYjTOd7+jN1PRJahN1oE
+# RzTzEiV6nCO1M3U1HbPTGyq52IMFSBM2/07WTJSbOeXjvYR7aUxK9/ZkJiacl2iZ
+# I7IWe7JKhHohqKuceQNyOzxTakLcRkzynvIrk33R9YVqtB4L6wtFxhUjvDnQg16x
+# ot2KVPdfyPAWd81wtZADmrUtsZ9qG79x1hBdyOl4vUtVPECuyhCxaw+faVjumapP
+# Unwo8ygflJJ74J+BYxf6UuD7m8yzsfXWkdv52DjL74TxzuFTLHPyARWCSCAbzn3Z
+# Ily+qIqDAgMBAAGjggIGMIICAjAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiI
+# ZfROQjAdBgNVHQ4EFgQUt/1Teh2XDuUj2WW3siYWJgkZHA8wDgYDVR0PAQH/BAQD
+# AgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0
+# dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWdu
+# aW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5k
+# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZT
+# SEEzODQyMDIxQ0ExLmNybDA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUF
+# BwIBFhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGH
+# MIGEMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYB
+# BQUHMAKGUGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0
+# ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAwGA1UdEwEB
+# /wQCMAAwDQYJKoZIhvcNAQELBQADggIBABxv4AeV/5ltkELHSC63fXAFYS5tadcW
+# TiNc2rskrNLrfH1Ns0vgSZFoQxYBFKI159E8oQQ1SKbTEubZ/B9kmHPhprHya08+
+# VVzxC88pOEvz68nA82oEM09584aILqYmj8Pj7h/kmZNzuEL7WiwFa/U1hX+XiWfL
+# IJQsAHBla0i7QRF2de8/VSF0XXFa2kBQ6aiTsiLyKPNbaNtbcucaUdn6vVUS5izW
+# OXM95BSkFSKdE45Oq3FForNJXjBvSCpwcP36WklaHL+aHu1upIhCTUkzTHMh8b86
+# WmjRUqbrnvdyR2ydI5l1OqcMBjkpPpIV6wcc+KY/RH2xvVuuoHjlUjwq2bHiNoX+
+# W1scCpnA8YTs2d50jDHUgwUo+ciwpffH0Riq132NFmrH3r67VaN3TuBxjI8SIZM5
+# 8WEDkbeoriDk3hxU8ZWV7b8AW6oyVBGfM06UgkfMb58h+tJPrFx8VI/WLq1dTqMf
+# ZOm5cuclMnUHs2uqrRNtnV8UfidPBL4ZHkTcClQbCoz0UbLhkiDvIS00Dn+BBcxw
+# /TKqVL4Oaz3bkMSsM46LciTeucHY9ExRVt3zy7i149sd+F4QozPqn7FrSVHXmem3
+# r7bjyHTxOgqxRCVa18Vtx7P/8bYSBeS+WHCKcliFCecspusCDSlnRUjZwyPdP0VH
+# xaZg2unjHY3rMYIQxjCCEMICAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
+# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29k
+# ZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAHHxQbizANJfMU6yMM
+# 0NHdMA0GCWCGSAFlAwQCAQUAoIGaMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEE
+# MBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC4GCisGAQQBgjcCAQwxIDAe
+# oByAGgBQAHkAdABoAG8AbgAgADMALgAxADAALgAyMC8GCSqGSIb3DQEJBDEiBCBn
+# AZ6P7YvTwq0fbF62o7E75R0LxsW5OtyYiFESQckLhjANBgkqhkiG9w0BAQEFAASC
+# AgBRSzqP2zE+V5lLXFXjuLbAOkLxcM4pOIu1euvetZOkJ2cmVtnvcbVftMjtsUwY
+# GZWOdQn92wCvT6P5BsoSldIld0KfiVpKMZLmpJUJJjsUQDxNJhyh2iWDPZFQywCu
+# n8fPx/suU+CTAnV6t3EKdjfPixRPXR5zCpIIZ6RkCO4LOoofOyfOkIoUlvIzf0cq
+# fvtvcsWaj2KQYlAHRSXPDEe2w3gTiSuVatuI8wAL+U7taS9H3vcBUxPq0yjimlMs
+# /QrZEgKPf0BOoXdxmEHKbTuqJds3DrcT5JUw3NLRf/jD3gFKFN31JEx8J8WhXLrm
+# oTTi9Agvli2JhF86o+mQiN0tvKVsBBXURUUoRhlMjJF5sRKGdSQLphHU7wyfPChf
+# KENKHwb5kntoyl+oL0acd6YDqc9GJSijZwUYeOvF8rGt4V1lOrV0l+kiU+lXG0t6
+# YPIHO7517eO2Em/B8e2tBKHJaFFedq+aPhZk0zLTZaysoOQqos18+xkhhAzasO+q
+# KW2PnUhTRWxEmlJXARAxeq9sS8KudI1X37TVzQ9AuOl8xFYijNF/NEekh20tvGIa
+# /cqnaBCmOl2J/lh2QepBNTz+wG3l0nfY8aOMDCdyS3Y3nik/UR3GVPCxw24pRH4l
+# JUtPvgi/cqZRaY5lHX3g2YX1pyIbZ6WV+sMysdzzpMYWTKGCDX0wgg15BgorBgEE
+# AYI3AwMBMYINaTCCDWUGCSqGSIb3DQEHAqCCDVYwgg1SAgEDMQ8wDQYJYIZIAWUD
+# BAIBBQAwdwYLKoZIhvcNAQkQAQSgaARmMGQCAQEGCWCGSAGG/WwHATAxMA0GCWCG
+# SAFlAwQCAQUABCApRtPryrdnZj1Bfg21et7CJhqeTOLk5FJicFsRkh+S5AIQNATJ
+# OYkoR2jzQSVFTSnc2RgPMjAyMjAxMTcxNDI0MjdaoIIKNzCCBP4wggPmoAMCAQIC
+# EA1CSuC+Ooj/YEAhzhQA8N0wDQYJKoZIhvcNAQELBQAwcjELMAkGA1UEBhMCVVMx
+# FTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNv
+# bTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIFRpbWVzdGFtcGlu
+# ZyBDQTAeFw0yMTAxMDEwMDAwMDBaFw0zMTAxMDYwMDAwMDBaMEgxCzAJBgNVBAYT
+# AlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjEgMB4GA1UEAxMXRGlnaUNlcnQg
+# VGltZXN0YW1wIDIwMjEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC
+# 5mGEZ8WK9Q0IpEXKY2tR1zoRQr0KdXVNlLQMULUmEP4dyG+RawyW5xpcSO9E5b+b
+# Yc0VkWJauP9nC5xj/TZqgfop+N0rcIXeAhjzeG28ffnHbQk9vmp2h+mKvfiEXR52
+# yeTGdnY6U9HR01o2j8aj4S8bOrdh1nPsTm0zinxdRS1LsVDmQTo3VobckyON91Al
+# 6GTm3dOPL1e1hyDrDo4s1SPa9E14RuMDgzEpSlwMMYpKjIjF9zBa+RSvFV9sQ0kJ
+# /SYjU/aNY+gaq1uxHTDCm2mCtNv8VlS8H6GHq756WwogL0sJyZWnjbL61mOLTqVy
+# HO6fegFz+BnW/g1JhL0BAgMBAAGjggG4MIIBtDAOBgNVHQ8BAf8EBAMCB4AwDAYD
+# VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDBBBgNVHSAEOjA4MDYG
+# CWCGSAGG/WwHATApMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNv
+# bS9DUFMwHwYDVR0jBBgwFoAU9LbhIB3+Ka7S5GGlsqIlssgXNW4wHQYDVR0OBBYE
+# FDZEho6kurBmvrwoLR1ENt3janq8MHEGA1UdHwRqMGgwMqAwoC6GLGh0dHA6Ly9j
+# cmwzLmRpZ2ljZXJ0LmNvbS9zaGEyLWFzc3VyZWQtdHMuY3JsMDKgMKAuhixodHRw
+# Oi8vY3JsNC5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLXRzLmNybDCBhQYIKwYB
+# BQUHAQEEeTB3MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20w
+# TwYIKwYBBQUHMAKGQ2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2Vy
+# dFNIQTJBc3N1cmVkSURUaW1lc3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQELBQAD
+# ggEBAEgc3LXpmiO85xrnIA6OZ0b9QnJRdAojR6OrktIlxHBZvhSg5SeBpU0UFRkH
+# efDRBMOG2Tu9/kQCZk3taaQP9rhwz2Lo9VFKeHk2eie38+dSn5On7UOee+e03UEi
+# ifuHokYDTvz0/rdkd2NfI1Jpg4L6GlPtkMyNoRdzDfTzZTlwS/Oc1np72gy8PTLQ
+# G8v1Yfx1CAB2vIEO+MDhXM/EEXLnG2RJ2CKadRVC9S0yOIHa9GCiurRS+1zgYSQl
+# T7LfySmoc0NR2r1j1h9bm/cuG08THfdKDXF+l7f0P4TrweOjSaH6zqe/Vs+6WXZh
+# iV9+p7SOZ3j5NpjhyyjaW4emii8wggUxMIIEGaADAgECAhAKoSXW1jIbfkHkBdo2
+# l8IVMA0GCSqGSIb3DQEBCwUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdp
+# Q2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0Rp
+# Z2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0xNjAxMDcxMjAwMDBaFw0zMTAx
+# MDcxMjAwMDBaMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx
+# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNI
+# QTIgQXNzdXJlZCBJRCBUaW1lc3RhbXBpbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUA
+# A4IBDwAwggEKAoIBAQC90DLuS82Pf92puoKZxTlUKFe2I0rEDgdFM1EQfdD5fU1o
+# fue2oPSNs4jkl79jIZCYvxO8V9PD4X4I1moUADj3Lh477sym9jJZ/l9lP+Cb6+NG
+# RwYaVX4LJ37AovWg4N4iPw7/fpX786O6Ij4YrBHk8JkDbTuFfAnT7l3ImgtU46gJ
+# cWvgzyIQD3XPcXJOCq3fQDpct1HhoXkUxk0kIzBdvOw8YGqsLwfM/fDqR9mIUF79
+# Zm5WYScpiYRR5oLnRlD9lCosp+R1PrqYD4R/nzEU1q3V8mTLex4F0IQZchfxFwbv
+# Pc3WTe8GQv2iUypPhR3EHTyvz9qsEPXdrKzpVv+TAgMBAAGjggHOMIIByjAdBgNV
+# HQ4EFgQU9LbhIB3+Ka7S5GGlsqIlssgXNW4wHwYDVR0jBBgwFoAUReuir/SSy4Ix
+# LVGLp6chnfNtyA8wEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYw
+# EwYDVR0lBAwwCgYIKwYBBQUHAwgweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzAB
+# hhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9j
+# YWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQw
+# gYEGA1UdHwR6MHgwOqA4oDaGNGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdp
+# Q2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2lj
+# ZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwUAYDVR0gBEkwRzA4
+# BgpghkgBhv1sAAIEMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0
+# LmNvbS9DUFMwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4IBAQBxlRLpUYdW
+# ac3v3dp8qmN6s3jPBjdAhO9LhL/KzwMC/cWnww4gQiyvd/MrHwwhWiq3BTQdaq6Z
+# +CeiZr8JqmDfdqQ6kw/4stHYfBli6F6CJR7Euhx7LCHi1lssFDVDBGiy23UC4HLH
+# mNY8ZOUfSBAYX4k4YU1iRiSHY4yRUiyvKYnleB/WCxSlgNcSR3CzddWThZN+tpJn
+# +1Nhiaj1a5bA9FhpDXzIAbG5KHW3mWOFIoxhynmUfln8jA/jb7UBJrZspe6HUSHk
+# WGCbugwtK22ixH67xCUrRwIIfEmuE7bhfEJCKMYYVs9BNLZmXbZ0e/VWMyIvIjay
+# S6JKldj1po5SMYIChjCCAoICAQEwgYYwcjELMAkGA1UEBhMCVVMxFTATBgNVBAoT
+# DERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UE
+# AxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIFRpbWVzdGFtcGluZyBDQQIQDUJK
+# 4L46iP9gQCHOFADw3TANBglghkgBZQMEAgEFAKCB0TAaBgkqhkiG9w0BCQMxDQYL
+# KoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTIyMDExNzE0MjQyN1owKwYLKoZI
+# hvcNAQkQAgwxHDAaMBgwFgQU4deCqOGRvu9ryhaRtaq0lKYkm/MwLwYJKoZIhvcN
+# AQkEMSIEIEisVoLYacgzAIEwW38XeItPgmJxlcpLtbpVrvF4nQLgMDcGCyqGSIb3
+# DQEJEAIvMSgwJjAkMCIEILMQkAa8CtmDB5FXKeBEA0Fcg+MpK2FPJpZMjTVx7PWp
+# MA0GCSqGSIb3DQEBAQUABIIBAETHhyD4SMqK76a6HhqOY7FJzkFOhj2f3q+bsWnJ
+# l0/m++gC94THTdZe+PoW3PIR+46C1uBPwBgfcoo3guZDzK79g3xNPIO8VlRihEQN
+# KFIXn1qx+Lzs98mqd2JdXfnr1kFoZkseiBnRpG0H1tVIeiL0S5R+sUzZS/lvQtfl
+# aqh75Yc4vZQJ3q7Vsd01Flkrvi+BCoPZxo7szKlCkVlT+nZsc2n6MeTDYVdxT3dO
+# PLaWrEqkLLK4FDpG5+yiCqSOQ4fhLljtUMP9CCiISTjg92O3a9vYulm6tdt25JHj
+# yob3QE/n711GqaiGHOuEGuCZoJGn7sTxjwHk5CEzugadWhU=
+# SIG # End signature block
diff --git a/m_env/Scripts/activate b/m_env/Scripts/activate
new file mode 100644
index 0000000..1d13128
--- /dev/null
+++ b/m_env/Scripts/activate
@@ -0,0 +1,69 @@
+# This file must be used with "source bin/activate" *from bash*
+# you cannot run it directly
+
+deactivate () {
+ # reset old environment variables
+ if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
+ PATH="${_OLD_VIRTUAL_PATH:-}"
+ export PATH
+ unset _OLD_VIRTUAL_PATH
+ fi
+ if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
+ PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
+ export PYTHONHOME
+ unset _OLD_VIRTUAL_PYTHONHOME
+ fi
+
+ # This should detect bash and zsh, which have a hash command that must
+ # be called to get it to forget past commands. Without forgetting
+ # past commands the $PATH changes we made may not be respected
+ if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
+ hash -r 2> /dev/null
+ fi
+
+ if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
+ PS1="${_OLD_VIRTUAL_PS1:-}"
+ export PS1
+ unset _OLD_VIRTUAL_PS1
+ fi
+
+ unset VIRTUAL_ENV
+ unset VIRTUAL_ENV_PROMPT
+ if [ ! "${1:-}" = "nondestructive" ] ; then
+ # Self destruct!
+ unset -f deactivate
+ fi
+}
+
+# unset irrelevant variables
+deactivate nondestructive
+
+VIRTUAL_ENV="C:\Users\Temiloluwa\OneDrive\Desktop\Must Work\movies\m_env"
+export VIRTUAL_ENV
+
+_OLD_VIRTUAL_PATH="$PATH"
+PATH="$VIRTUAL_ENV/Scripts:$PATH"
+export PATH
+
+# unset PYTHONHOME if set
+# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
+# could use `if (set -u; : $PYTHONHOME) ;` in bash
+if [ -n "${PYTHONHOME:-}" ] ; then
+ _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
+ unset PYTHONHOME
+fi
+
+if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
+ _OLD_VIRTUAL_PS1="${PS1:-}"
+ PS1="(m_env) ${PS1:-}"
+ export PS1
+ VIRTUAL_ENV_PROMPT="(m_env) "
+ export VIRTUAL_ENV_PROMPT
+fi
+
+# This should detect bash and zsh, which have a hash command that must
+# be called to get it to forget past commands. Without forgetting
+# past commands the $PATH changes we made may not be respected
+if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
+ hash -r 2> /dev/null
+fi
diff --git a/m_env/Scripts/activate.bat b/m_env/Scripts/activate.bat
new file mode 100644
index 0000000..fdb61a3
--- /dev/null
+++ b/m_env/Scripts/activate.bat
@@ -0,0 +1,34 @@
+@echo off
+
+rem This file is UTF-8 encoded, so we need to update the current code page while executing it
+for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do (
+ set _OLD_CODEPAGE=%%a
+)
+if defined _OLD_CODEPAGE (
+ "%SystemRoot%\System32\chcp.com" 65001 > nul
+)
+
+set VIRTUAL_ENV=C:\Users\Temiloluwa\OneDrive\Desktop\Must Work\movies\m_env
+
+if not defined PROMPT set PROMPT=$P$G
+
+if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT%
+if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
+
+set _OLD_VIRTUAL_PROMPT=%PROMPT%
+set PROMPT=(m_env) %PROMPT%
+
+if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%
+set PYTHONHOME=
+
+if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%
+if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH%
+
+set PATH=%VIRTUAL_ENV%\Scripts;%PATH%
+set VIRTUAL_ENV_PROMPT=(m_env)
+
+:END
+if defined _OLD_CODEPAGE (
+ "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul
+ set _OLD_CODEPAGE=
+)
diff --git a/m_env/Scripts/deactivate.bat b/m_env/Scripts/deactivate.bat
new file mode 100644
index 0000000..62a39a7
--- /dev/null
+++ b/m_env/Scripts/deactivate.bat
@@ -0,0 +1,22 @@
+@echo off
+
+if defined _OLD_VIRTUAL_PROMPT (
+ set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
+)
+set _OLD_VIRTUAL_PROMPT=
+
+if defined _OLD_VIRTUAL_PYTHONHOME (
+ set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%"
+ set _OLD_VIRTUAL_PYTHONHOME=
+)
+
+if defined _OLD_VIRTUAL_PATH (
+ set "PATH=%_OLD_VIRTUAL_PATH%"
+)
+
+set _OLD_VIRTUAL_PATH=
+
+set VIRTUAL_ENV=
+set VIRTUAL_ENV_PROMPT=
+
+:END
diff --git a/m_env/Scripts/django-admin.exe b/m_env/Scripts/django-admin.exe
new file mode 100644
index 0000000..b001f36
Binary files /dev/null and b/m_env/Scripts/django-admin.exe differ
diff --git a/m_env/Scripts/f2py.exe b/m_env/Scripts/f2py.exe
new file mode 100644
index 0000000..e0462d3
Binary files /dev/null and b/m_env/Scripts/f2py.exe differ
diff --git a/m_env/Scripts/imageio_download_bin.exe b/m_env/Scripts/imageio_download_bin.exe
new file mode 100644
index 0000000..93a730e
Binary files /dev/null and b/m_env/Scripts/imageio_download_bin.exe differ
diff --git a/m_env/Scripts/imageio_remove_bin.exe b/m_env/Scripts/imageio_remove_bin.exe
new file mode 100644
index 0000000..c81a4de
Binary files /dev/null and b/m_env/Scripts/imageio_remove_bin.exe differ
diff --git a/m_env/Scripts/normalizer.exe b/m_env/Scripts/normalizer.exe
new file mode 100644
index 0000000..826203f
Binary files /dev/null and b/m_env/Scripts/normalizer.exe differ
diff --git a/m_env/Scripts/pip.exe b/m_env/Scripts/pip.exe
new file mode 100644
index 0000000..26eef3f
Binary files /dev/null and b/m_env/Scripts/pip.exe differ
diff --git a/m_env/Scripts/pip3.10.exe b/m_env/Scripts/pip3.10.exe
new file mode 100644
index 0000000..26eef3f
Binary files /dev/null and b/m_env/Scripts/pip3.10.exe differ
diff --git a/m_env/Scripts/pip3.exe b/m_env/Scripts/pip3.exe
new file mode 100644
index 0000000..26eef3f
Binary files /dev/null and b/m_env/Scripts/pip3.exe differ
diff --git a/m_env/Scripts/python.exe b/m_env/Scripts/python.exe
new file mode 100644
index 0000000..5e578f9
Binary files /dev/null and b/m_env/Scripts/python.exe differ
diff --git a/m_env/Scripts/pythonw.exe b/m_env/Scripts/pythonw.exe
new file mode 100644
index 0000000..df036b8
Binary files /dev/null and b/m_env/Scripts/pythonw.exe differ
diff --git a/m_env/Scripts/sqlformat.exe b/m_env/Scripts/sqlformat.exe
new file mode 100644
index 0000000..ce02af1
Binary files /dev/null and b/m_env/Scripts/sqlformat.exe differ
diff --git a/m_env/Scripts/tqdm.exe b/m_env/Scripts/tqdm.exe
new file mode 100644
index 0000000..9ad6fab
Binary files /dev/null and b/m_env/Scripts/tqdm.exe differ
diff --git a/m_env/pyvenv.cfg b/m_env/pyvenv.cfg
new file mode 100644
index 0000000..5d6dc7c
--- /dev/null
+++ b/m_env/pyvenv.cfg
@@ -0,0 +1,3 @@
+home = C:\Users\Temiloluwa\AppData\Local\Programs\Python\Python310
+include-system-site-packages = false
+version = 3.10.2
diff --git a/manage.py b/manage.py
new file mode 100644
index 0000000..f04478e
--- /dev/null
+++ b/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', 'movie.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/media/avatar/FOUNDATION_LOGO.jpg b/media/avatar/FOUNDATION_LOGO.jpg
new file mode 100644
index 0000000..6bfb429
Binary files /dev/null and b/media/avatar/FOUNDATION_LOGO.jpg differ
diff --git a/media/avatar/_24_visitor-cliparts-website_119799964.jpg b/media/avatar/_24_visitor-cliparts-website_119799964.jpg
new file mode 100644
index 0000000..297ea70
Binary files /dev/null and b/media/avatar/_24_visitor-cliparts-website_119799964.jpg differ
diff --git a/media/avatar/dummy.png b/media/avatar/dummy.png
new file mode 100644
index 0000000..6bd8a7f
Binary files /dev/null and b/media/avatar/dummy.png differ
diff --git a/media/avatar/dummy_ULmT0vh.png b/media/avatar/dummy_ULmT0vh.png
new file mode 100644
index 0000000..6bd8a7f
Binary files /dev/null and b/media/avatar/dummy_ULmT0vh.png differ
diff --git a/media/avatar/old-rich-man-sun-glasse-beard-street-portrait-happy-posing-smiling-186133275.jpg b/media/avatar/old-rich-man-sun-glasse-beard-street-portrait-happy-posing-smiling-186133275.jpg
new file mode 100644
index 0000000..de47954
Binary files /dev/null and b/media/avatar/old-rich-man-sun-glasse-beard-street-portrait-happy-posing-smiling-186133275.jpg differ
diff --git a/media/avatar/old-rich-man-sun-glasse-beard-street-portrait-happy-posing-smiling-186133275_lH92zwH.jpg b/media/avatar/old-rich-man-sun-glasse-beard-street-portrait-happy-posing-smiling-186133275_lH92zwH.jpg
new file mode 100644
index 0000000..de47954
Binary files /dev/null and b/media/avatar/old-rich-man-sun-glasse-beard-street-portrait-happy-posing-smiling-186133275_lH92zwH.jpg differ
diff --git a/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions.mp4 b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions.mp4
new file mode 100644
index 0000000..c407c3d
Binary files /dev/null and b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions.mp4 differ
diff --git a/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_76tKC5o.mp4 b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_76tKC5o.mp4
new file mode 100644
index 0000000..c407c3d
Binary files /dev/null and b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_76tKC5o.mp4 differ
diff --git a/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_CmCpHWK.mp4 b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_CmCpHWK.mp4
new file mode 100644
index 0000000..c407c3d
Binary files /dev/null and b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_CmCpHWK.mp4 differ
diff --git a/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_HdRBP4w.mp4 b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_HdRBP4w.mp4
new file mode 100644
index 0000000..c407c3d
Binary files /dev/null and b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_HdRBP4w.mp4 differ
diff --git a/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_Q24ji6G.mp4 b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_Q24ji6G.mp4
new file mode 100644
index 0000000..c407c3d
Binary files /dev/null and b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_Q24ji6G.mp4 differ
diff --git a/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_UOKnw2C.mp4 b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_UOKnw2C.mp4
new file mode 100644
index 0000000..c407c3d
Binary files /dev/null and b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_UOKnw2C.mp4 differ
diff --git a/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_hbtcBrX.mp4 b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_hbtcBrX.mp4
new file mode 100644
index 0000000..c407c3d
Binary files /dev/null and b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_hbtcBrX.mp4 differ
diff --git a/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_tTvs4ws.mp4 b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_tTvs4ws.mp4
new file mode 100644
index 0000000..c407c3d
Binary files /dev/null and b/media/videos/Progress_-_Lift_Me_Up_Live_Performance_-_Glitch_Sessions_tTvs4ws.mp4 differ
diff --git a/media/videos/THINGS_THAT_GUYS_DO_THAT_GIRLS_SECRETLY_LIKE__im_back_Trim.mp4 b/media/videos/THINGS_THAT_GUYS_DO_THAT_GIRLS_SECRETLY_LIKE__im_back_Trim.mp4
new file mode 100644
index 0000000..288b031
Binary files /dev/null and b/media/videos/THINGS_THAT_GUYS_DO_THAT_GIRLS_SECRETLY_LIKE__im_back_Trim.mp4 differ
diff --git a/media/videos/THINGS_THAT_GUYS_DO_THAT_GIRLS_SECRETLY_LIKE__im_back_Trim_vdJuIdV.mp4 b/media/videos/THINGS_THAT_GUYS_DO_THAT_GIRLS_SECRETLY_LIKE__im_back_Trim_vdJuIdV.mp4
new file mode 100644
index 0000000..288b031
Binary files /dev/null and b/media/videos/THINGS_THAT_GUYS_DO_THAT_GIRLS_SECRETLY_LIKE__im_back_Trim_vdJuIdV.mp4 differ
diff --git a/movie/__init__.py b/movie/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/movie/asgi.py b/movie/asgi.py
new file mode 100644
index 0000000..c0aaa1a
--- /dev/null
+++ b/movie/asgi.py
@@ -0,0 +1,16 @@
+"""
+ASGI config for movie 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', 'movie.settings')
+
+application = get_asgi_application()
diff --git a/movie/settings.py b/movie/settings.py
new file mode 100644
index 0000000..f1e9add
--- /dev/null
+++ b/movie/settings.py
@@ -0,0 +1,152 @@
+"""
+Django settings for movie project.
+
+Generated by 'django-admin startproject' using Django 4.0.6.
+
+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
+import os
+
+# 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-7wjn62oc!1qm#eb&6(aqh4)hu@cc(h#^b8c7ls+2c7x)34%f#0'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = []
+
+
+# Application definition
+
+INSTALLED_APPS = [
+
+ 'movies',
+ 'accounts',
+
+ 'django.contrib.admin',
+ 'django.contrib.auth',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.messages',
+ 'django.contrib.staticfiles',
+ 'django_extensions',
+]
+
+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 = 'movie.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',
+ 'django.template.context_processors.media',
+ ],
+ },
+ },
+]
+
+WSGI_APPLICATION = 'movie.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 = 'UTC'
+
+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'
+
+#Me
+
+MEDIA_URL='/media/'
+MEDIA_ROOT=BASE_DIR/'media'
+STATIC_ROOT = BASE_DIR/'static_root'
+
+STATICFILES_DIRS=[
+ BASE_DIR/'static'
+]
+
+# Auth Settings
+# AUTH_USER_MODEL = 'movies.CustomUser'
+
+LOGIN_REDIRECT_URL = "movies:index"
+
+LOGOUT_REDIRECT_URL = "movies:index"
+
+
+GRAPH_MODELS = {
+ 'all_applications': True,
+ 'group_models': True,
+}
\ No newline at end of file
diff --git a/movie/urls.py b/movie/urls.py
new file mode 100644
index 0000000..5196971
--- /dev/null
+++ b/movie/urls.py
@@ -0,0 +1,29 @@
+"""movie 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
+from django.conf import settings
+from django.conf.urls.static import static
+
+urlpatterns = [
+ path('', include('movies.urls')),
+ path('accounts/', include('accounts.urls')),
+ path('admin/', admin.site.urls),
+]
+
+if settings.DEBUG:
+ urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+ urlpatterns+=static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)
\ No newline at end of file
diff --git a/movie/wsgi.py b/movie/wsgi.py
new file mode 100644
index 0000000..2a0f6f1
--- /dev/null
+++ b/movie/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for movie 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', 'movie.settings')
+
+application = get_wsgi_application()
diff --git a/movies/__init__.py b/movies/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/movies/admin.py b/movies/admin.py
new file mode 100644
index 0000000..b3ca5d7
--- /dev/null
+++ b/movies/admin.py
@@ -0,0 +1,12 @@
+from django.contrib import admin
+from .models import Movie, MovieComment, School, UserInfo, Like
+# from .forms import CustomSignupForm
+
+# admin.site.register(CustomSignupForm)
+
+# Register your models here.
+admin.site.register(Movie)
+admin.site.register(MovieComment)
+admin.site.register(School)
+admin.site.register(UserInfo)
+admin.site.register(Like)
\ No newline at end of file
diff --git a/movies/apps.py b/movies/apps.py
new file mode 100644
index 0000000..0a30ddd
--- /dev/null
+++ b/movies/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class MoviesConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'movies'
diff --git a/movies/decorators.py b/movies/decorators.py
new file mode 100644
index 0000000..7296d82
--- /dev/null
+++ b/movies/decorators.py
@@ -0,0 +1,10 @@
+from django.http import HttpResponse
+from .models import UserInfo
+
+def student_only(func):
+ def wrapper(request, *args, **kwargs):
+ if UserInfo.objects.filter(pk = request.user.id, user_type = "Student").exists():
+ return func(request, *args, **kwargs)
+ else:
+ return HttpResponse("You have no permission to upload videos, Please sign up as Student!")
+ return wrapper
\ No newline at end of file
diff --git a/movies/forms.py b/movies/forms.py
new file mode 100644
index 0000000..4fe1451
--- /dev/null
+++ b/movies/forms.py
@@ -0,0 +1,39 @@
+from django import forms
+from .models import Movie, MovieComment, School, UserInfo
+from django.contrib.auth.models import User
+from django.contrib.auth.forms import UserCreationForm
+
+class MovieForm(forms.ModelForm):
+ class Meta:
+ model = Movie
+ fields = {'title' : '', 'description': '', 'video' : ''}
+
+class MovieCommentForm(forms.ModelForm):
+ class Meta:
+ model = MovieComment
+ fields = {'comment_text' : ''}
+
+class CustomUserCreationForm(UserCreationForm):
+ email = forms.EmailField(required=True)
+ first_name = forms.CharField(max_length=30)
+ last_name = forms.CharField(max_length=150)
+
+ class Meta:
+ model = User
+ fields = ('username', 'email', 'first_name', 'last_name', 'password1', 'password2')
+
+ def save(self, commit=True):
+ user = super().save(commit=False)
+
+ user.email = self.cleaned_data['email']
+ user.first_name = self.cleaned_data['first_name']
+ user.last_name = self.cleaned_data['last_name']
+
+ if commit:
+ user.save()
+ return user
+
+class UserInfoForm(forms.ModelForm):
+ class Meta:
+ model = UserInfo
+ fields = {'user_type' : '', 'avatar': ''}
\ No newline at end of file
diff --git a/movies/migrations/0001_initial.py b/movies/migrations/0001_initial.py
new file mode 100644
index 0000000..d8903d9
--- /dev/null
+++ b/movies/migrations/0001_initial.py
@@ -0,0 +1,72 @@
+# Generated by Django 4.0.6 on 2022-08-03 14:02
+
+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='Movie',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=200)),
+ ('description', models.TextField(blank=True, null=True, verbose_name='Description')),
+ ('video', models.FileField(null=True, upload_to='videos/', verbose_name='')),
+ ('created', models.DateField(auto_now_add=True)),
+ ('updated', models.DateField(auto_now=True)),
+ ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ('favourites', models.ManyToManyField(blank=True, default=None, related_name='favourite', to=settings.AUTH_USER_MODEL)),
+ ('liked', models.ManyToManyField(blank=True, default=None, related_name='liked', to=settings.AUTH_USER_MODEL)),
+ ],
+ options={
+ 'verbose_name_plural': 'movies',
+ },
+ ),
+ migrations.CreateModel(
+ name='School',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('school_name', models.CharField(max_length=200)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='UserInfo',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('user_type', models.CharField(choices=[('', 'select'), ('Viewer', 'Viewer'), ('Student', 'Student')], max_length=10)),
+ ('avatar', models.FileField(null=True, upload_to='avatar/', verbose_name='Avatar')),
+ ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='MovieComment',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('comment_text', models.TextField()),
+ ('date_added', models.DateTimeField(auto_now_add=True)),
+ ('comment_author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ('movie', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='movies.movie')),
+ ],
+ options={
+ 'verbose_name_plural': 'comments',
+ },
+ ),
+ migrations.CreateModel(
+ name='Like',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('value', models.CharField(choices=[('Like', 'Like'), ('Unlike', 'Unlike')], default='Like', max_length=10)),
+ ('movie', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='movies.movie')),
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ ]
diff --git a/movies/migrations/__init__.py b/movies/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/movies/models.py b/movies/models.py
new file mode 100644
index 0000000..db6ceeb
--- /dev/null
+++ b/movies/models.py
@@ -0,0 +1,87 @@
+from django.db import models
+from django import forms
+# from django.contrib.auth.models import AbstractUser
+from django.contrib.auth.models import User
+
+ACCOUNT_TYPE = (
+ ('','select'),
+ ('Viewer','Viewer'),
+ ('Student', 'Student')
+)
+
+class UserInfo(models.Model):
+ user = models.OneToOneField(User, on_delete=models.CASCADE)
+
+ user_type = models.CharField(max_length=10,choices=ACCOUNT_TYPE)
+
+
+ #these are extended models features
+ #user_type = models.CharField(max_length=6,null=True)
+
+ avatar = models.FileField(upload_to='avatar/', null=True, verbose_name="Avatar")
+
+ def __str__(self):
+ return self.user.username
+
+
+class Movie(models.Model):
+ # define a username filed with bound max length it can have
+
+ title = models.CharField(max_length=200)
+
+ description = models.TextField(blank=True, null=True, verbose_name="Description")
+
+ # This is used to get the video
+ video = models.FileField(upload_to='videos/', null=True, verbose_name="")
+
+ author = models.ForeignKey(User, on_delete=models.CASCADE)
+
+ liked = models.ManyToManyField(User, related_name='liked', default=None, blank=True)
+
+ created = models.DateField(auto_now_add=True)
+
+ updated = models.DateField(auto_now=True)
+
+ favourites = models.ManyToManyField(User, related_name='favourite', default=None, blank=True)
+
+ class Meta:
+ """Special Class to return plural of Movies"""
+ verbose_name_plural = 'movies'
+
+
+ def __str__(self):
+ return f"{self.title} - {self.video} - {self.author} "
+
+ @property
+ def num_likes(self):
+ return self.liked.count()
+
+LIKE_CHOICES = (
+ ("Like", "Like"),
+ ("Unlike", "Unlike"),
+)
+
+class Like(models.Model):
+ user = models.ForeignKey(User, on_delete=models.CASCADE)
+ movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
+ value = models.CharField(choices=LIKE_CHOICES, default="Like", max_length=10)
+
+ def __str__(self):
+ return self.movie
+
+class MovieComment(models.Model):
+ """Comment on a Movie"""
+
+ movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
+ comment_author = models.ForeignKey(User, on_delete=models.CASCADE)
+ comment_text = models.TextField()
+ date_added = models.DateTimeField(auto_now_add=True)
+
+ class Meta:
+ """Special Class to return plural of Entry"""
+ verbose_name_plural = 'comments'
+
+class School(models.Model):
+ school_name = models.CharField(max_length=200)
+ def __str__(self):
+ return f"{self.school_name}"
\ No newline at end of file
diff --git a/movies/templates/1base.html b/movies/templates/1base.html
new file mode 100644
index 0000000..bcc7bb4
--- /dev/null
+++ b/movies/templates/1base.html
@@ -0,0 +1,48 @@
+
+
+
+ Add a new Movie.
+
+
+
+ {% if user.is_authenticated %}
+ {% if user.userinfo.user_type == "Student" %}
+
+ {% else %}
+
+ {% endif %}
+ {% else %}
+
+
+ {% endif %}
+
+
+ {% block content %}
+
+ {% endblock content %}
+
+
+
+
+
diff --git a/movies/templates/base.html b/movies/templates/base.html
new file mode 100644
index 0000000..d005794
--- /dev/null
+++ b/movies/templates/base.html
@@ -0,0 +1,279 @@
+{% load static %}
+
+
+
+
+ {% load static %}
+
+
+
+ Base page
+
+
+
+
+
+
+
+ {% if user.is_authenticated %}
+ {% if user.userinfo.user_type == "Student" %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% else %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% endif %}
+
+ {% else %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% endif %}
+
+
+ {% block content %}
+
+ {% endblock content %}
+
+
+
\ No newline at end of file
diff --git a/movies/templates/movies/edit_comment.html b/movies/templates/movies/edit_comment.html
new file mode 100644
index 0000000..6b2054f
--- /dev/null
+++ b/movies/templates/movies/edit_comment.html
@@ -0,0 +1,32 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+
+
+
+
+
+
+
+
+
+
+
+ {% if msg %} {% autoescape off %} {{ msg }} {% endautoescape %} {% endif %}
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/movies/templates/movies/index.html b/movies/templates/movies/index.html
new file mode 100644
index 0000000..7116a66
--- /dev/null
+++ b/movies/templates/movies/index.html
@@ -0,0 +1,17 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+This is the Index Page
+
+
+
+
+
+
+
+
+
+{% endblock content %}
diff --git a/movies/templates/movies/login.html b/movies/templates/movies/login.html
new file mode 100644
index 0000000..862b1be
--- /dev/null
+++ b/movies/templates/movies/login.html
@@ -0,0 +1,14 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/movies/templates/movies/movies.html b/movies/templates/movies/movies.html
new file mode 100644
index 0000000..dee366a
--- /dev/null
+++ b/movies/templates/movies/movies.html
@@ -0,0 +1,26 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+Lists of all posts
+
+{% for movie in movies %}
+
+
+
+
+
+
+
+
+{% empty %}
+
+
+ No Movies have been added yet.
+
+
+Add Movie
+
+{% endfor %}
+
+{% endblock content %}
\ No newline at end of file
diff --git a/movies/templates/movies/new_comment.html b/movies/templates/movies/new_comment.html
new file mode 100644
index 0000000..805ae63
--- /dev/null
+++ b/movies/templates/movies/new_comment.html
@@ -0,0 +1,32 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+
+
+
+
+
+
+
+
+
+
+
+ {% if msg %} {% autoescape off %} {{ msg }} {% endautoescape %} {% endif %}
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/movies/templates/movies/new_movie.html b/movies/templates/movies/new_movie.html
new file mode 100644
index 0000000..248a933
--- /dev/null
+++ b/movies/templates/movies/new_movie.html
@@ -0,0 +1,36 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+
+ {% if msg %} {% autoescape off %} {{ msg }} {% endautoescape %} {% endif %}
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/movies/templates/movies/view_movie.html b/movies/templates/movies/view_movie.html
new file mode 100644
index 0000000..998ed3b
--- /dev/null
+++ b/movies/templates/movies/view_movie.html
@@ -0,0 +1,82 @@
+{% extends "base.html" %}
+{% load static %}
+
+{% block content %}
+
+{{ movie.title }}
+
+
+
+
+
+
+
+
+
+ Movie Author: {{movie.author}}
+
+
+ {% if movie.description %}
+ Movie Description: {{ movie.description }}
+ {% else %}
+ Movie Description: No Description has been added to this video!
+ {% endif %}
+
+
+
+ `
+ {% if movie.liked.count < 1 %}
+ No Likes Yet!
+ {% elif movie.liked.count == 1 %}
+ 1 Like
+ {% else %}
+ {{ movie.liked.count }} Likes
+ {% endif %}
+
+
+
+ {% if fav %}
+ Remove from Favourites
+ {% else %}
+ Add to Favourites
+ {% endif %}
+
+
+ Download
+ Add Comment
+
+
+
+
+Comments
+{% for comment in comments %}
+
+
+ {% if comment.comment_author.userinfo.avatar %}
+
+ {% else %}
+ nawa
+ {% endif %}
+
+
+ Comment Author: {{ comment.comment_author }}
+ Comment Author Type - {{ comment.comment_author.userinfo.user_type }}
+ Date Published - {{ comment.date_added }}
+ Comment Text: {{ comment.comment_text}}
+
+ {% if request.user == comment.comment_author %}
+ Edit Comment
+ {% else %}
+
+ {% endif %}
+
+
+{% endfor %}
+{% endblock content %}
\ No newline at end of file
diff --git a/movies/templates/movies/viewcommentprofile.html b/movies/templates/movies/viewcommentprofile.html
new file mode 100644
index 0000000..b5d61f9
--- /dev/null
+++ b/movies/templates/movies/viewcommentprofile.html
@@ -0,0 +1,46 @@
+{% extends "base.html" %}
+
+{% block page_header %}
+Log in to your account.
+{% endblock page_header %}
+
+{% block content %}
+
+
+ User Details
+
+
+ {{ user.username }}
+
+ {{ user.userinfo.user_type }}
+
+
+
+ Lists of all User's Videos
+
+ {% for movie in movies %}
+
+
+
+
+
+
+
+ {% empty %}
+
+
+ No movie Yet!
+
+ {% endfor %}
+
+{% endblock content %}
+
+
+
+
+
+
+
+
+
+
diff --git a/movies/templates/movies/viewprofile.html b/movies/templates/movies/viewprofile.html
new file mode 100644
index 0000000..5ed9f9c
--- /dev/null
+++ b/movies/templates/movies/viewprofile.html
@@ -0,0 +1,47 @@
+{% extends "base.html" %}
+
+{% block page_header %}
+Log in to your account.
+{% endblock page_header %}
+
+{% block content %}
+
+
+
+ User Details
+
+
+ {{ user.username }}
+
+ {{ user.userinfo.user_type }}
+
+
+
+ Lists of all User's Videos
+
+ {% for movie in movies %}
+
+
+
+
+
+
+
+ {% empty %}
+
+
+ No movie Yet!
+
+ {% endfor %}
+
+{% endblock content %}
+
+
+
+
+
+
+
+
+
+
diff --git a/movies/templates/registra/logged_out.html b/movies/templates/registra/logged_out.html
new file mode 100644
index 0000000..1953744
--- /dev/null
+++ b/movies/templates/registra/logged_out.html
@@ -0,0 +1,22 @@
+{% extends "learning_logs/base.html" %}
+
+
+{% block page_header %}
+ Logged Out
+{% endblock page_header %}
+
+{% block content %}
+
+{% endblock content %}
+
+
+
diff --git a/movies/templates/registra/login.html b/movies/templates/registra/login.html
new file mode 100644
index 0000000..862b1be
--- /dev/null
+++ b/movies/templates/registra/login.html
@@ -0,0 +1,14 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/movies/templates/registra/password_change_done.html b/movies/templates/registra/password_change_done.html
new file mode 100644
index 0000000..8f6b3cf
--- /dev/null
+++ b/movies/templates/registra/password_change_done.html
@@ -0,0 +1,9 @@
+
+
+{% extends 'base.html' %}
+
+{% block content %}
+Password changed
+
+Back to index
+{% endblock %}
\ No newline at end of file
diff --git a/movies/templates/registra/password_change_form.html b/movies/templates/registra/password_change_form.html
new file mode 100644
index 0000000..cb153a0
--- /dev/null
+++ b/movies/templates/registra/password_change_form.html
@@ -0,0 +1,15 @@
+
+
+{% extends 'base.html' %}
+
+{% block content %}
+Change password
+
+
+
+Back to Index
+{% endblock %}
\ No newline at end of file
diff --git a/movies/templates/registra/password_reset_complete.html b/movies/templates/registra/password_reset_complete.html
new file mode 100644
index 0000000..1dcc74a
--- /dev/null
+++ b/movies/templates/registra/password_reset_complete.html
@@ -0,0 +1,9 @@
+
+
+{% extends 'base.html' %}
+
+{% block content %}
+Password reset complete
+
+Back to login
+{% endblock %}
\ No newline at end of file
diff --git a/movies/templates/registra/password_reset_confirm.html b/movies/templates/registra/password_reset_confirm.html
new file mode 100644
index 0000000..2c2430b
--- /dev/null
+++ b/movies/templates/registra/password_reset_confirm.html
@@ -0,0 +1,13 @@
+
+
+{% extends 'base.html' %}
+
+{% block content %}
+Confirm password reset
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/movies/templates/registra/password_reset_done.html b/movies/templates/registra/password_reset_done.html
new file mode 100644
index 0000000..a0755ea
--- /dev/null
+++ b/movies/templates/registra/password_reset_done.html
@@ -0,0 +1,9 @@
+
+
+{% extends 'base.html' %}
+
+{% block content %}
+Password reset done
+
+Back to login
+{% endblock %}
\ No newline at end of file
diff --git a/movies/templates/registra/password_reset_form.html b/movies/templates/registra/password_reset_form.html
new file mode 100644
index 0000000..59f7abd
--- /dev/null
+++ b/movies/templates/registra/password_reset_form.html
@@ -0,0 +1,15 @@
+
+
+{% extends 'base.html' %}
+
+{% block content %}
+Send password reset link
+
+
+
+Back to dashboard
+{% endblock %}
\ No newline at end of file
diff --git a/movies/templates/registra/register.html b/movies/templates/registra/register.html
new file mode 100644
index 0000000..d652d56
--- /dev/null
+++ b/movies/templates/registra/register.html
@@ -0,0 +1,14 @@
+{% extends "base.html" %}
+
+{% block content %}
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/movies/tests.py b/movies/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/movies/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/movies/urls.py b/movies/urls.py
new file mode 100644
index 0000000..02d9bf2
--- /dev/null
+++ b/movies/urls.py
@@ -0,0 +1,47 @@
+"""movie 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
+from . import views
+from django.conf import settings
+from django.conf.urls.static import static
+
+
+app_name = 'movies'
+urlpatterns = [
+ path('', views.index, name='index'),
+
+ path('new_movie/', views.new_movie, name='new_movie'),
+
+ path('movies/', views.all_movies, name='all_movies'),
+
+ path('view_movie/', views.view_movie, name='view_movie'),
+
+ path('view-profile//', views.view_profile, name='view_profile'),
+
+ path('viewcommentprofile//', views.view_comment_profile, name='view_commenter'),
+
+ path('like//', views.like_movie, name='like_movie'),
+
+ path('view_movie//new_comment/', views.new_comment, name='new_comment'),
+
+ path('edit_comment//', views.edit_comment, name='edit_comment'),
+
+ #path('accounts/', include('django.contrib.auth.urls')),
+
+ # path("accounts/register/", views.register, name="register"),
+
+]
\ No newline at end of file
diff --git a/movies/views.py b/movies/views.py
new file mode 100644
index 0000000..0cd6be9
--- /dev/null
+++ b/movies/views.py
@@ -0,0 +1,149 @@
+from django.http import HttpResponse
+from django.shortcuts import redirect, render
+from django.contrib.auth.decorators import login_required
+from django.contrib.auth.forms import UserCreationForm
+from django.contrib.auth import login
+from .decorators import student_only
+
+# Create your views here.
+from .forms import MovieForm, MovieCommentForm
+from .models import Movie, MovieComment, Like
+from django.http import Http404
+
+#Check that the topic owner is the one requesting
+def check_comment_owner(author, user):
+ if author != user:
+ raise Http404
+
+def index(request):
+ """Returns to the Homepage"""
+ return render(request, "movies/index.html")
+
+@login_required
+@student_only
+def new_movie(request):
+ """Handles new movie uploads"""
+
+ if request.method != "POST":
+ form = MovieForm()
+ else:
+ form = MovieForm(request.POST or None, request.FILES or None)
+ if form.is_valid():
+ new_vid = form.save(commit=False)
+ new_vid.author = request.user
+ new_vid.save()
+ return redirect("movies:all_movies")
+
+ context = {"form" : form}
+ return render(request, "movies/new_movie.html", context)
+
+@login_required
+def new_comment(request, movie_id):
+ """Handles new movie comments"""
+ movie = Movie.objects.get(id=movie_id)
+
+ if request.method != "POST":
+ form = MovieCommentForm()
+ else:
+ form = MovieCommentForm(request.POST or None, request.FILES or None)
+ if form.is_valid():
+ new_comment = form.save(commit=False)
+ new_comment.movie = movie
+ new_comment.comment_author = request.user
+ new_comment.save()
+ return redirect("movies:view_movie", movie_id=movie_id)
+
+ context = {"form" : form, "movie" : movie}
+ return render(request, "movies/new_comment.html", context)
+
+
+@login_required
+def edit_comment(request, comment_id):
+ """Edit an exisiting comment."""
+ comment = MovieComment.objects.get(id=comment_id)
+ movie = comment.movie
+
+ #check topic belongs to the current user
+ check_comment_owner(comment.comment_author, request.user)
+
+ if request.method != 'POST':
+ # Initial request; prefill from with current entry.
+ form = MovieCommentForm(instance=comment)
+ else:
+ # Change the data since its POST request
+ form = MovieCommentForm(instance=comment, data=request.POST)
+ if form.is_valid():
+ form.save()
+ return redirect('movies:view_movie',movie_id=movie.id)
+
+ context = {'movie': movie,'comment': comment, 'form': form}
+ return render(request, 'movies/edit_comment.html', context)
+
+def all_movies(request):
+ """Handles new movie uploads"""
+ # try:
+ movies = Movie.objects.all()
+
+ #movie = random.choice(movies) , "movie" : movie
+
+ context = {"movies" : movies}
+ return render(request, "movies/movies.html", context)
+
+@login_required
+def view_movie(request, movie_id):
+ """Handles new movie uploads"""
+ movie = Movie.objects.get(id=movie_id)
+
+ fav = bool
+
+ if movie.favourites.filter(id=request.user.id).exists():
+
+ fav = True
+
+ lik = bool
+
+ if movie.liked.filter(id=request.user.id).exists():
+ lik = True
+
+
+ comments = movie.moviecomment_set.order_by('-date_added')
+
+ context = {"movie" : movie, "comments" : comments, "fav" : fav, "lik" : lik}
+ return render(request, "movies/view_movie.html", context)
+
+@login_required
+def like_movie(request, movie_id):
+ movie = Movie.objects.get(id=movie_id)
+ if movie.liked.filter(id=request.user.id).exists():
+ movie.liked.remove(request.user)
+ else:
+ movie.liked.add(request.user)
+ return redirect('movies:view_movie', movie_id = movie_id)
+
+@login_required
+def view_profile(request, movie_id):
+ movie = Movie.objects.get(id=movie_id)
+
+ user = movie.author
+
+ movies = Movie.objects.filter(author=user)
+
+ favourites = Movie.objects.filter(favourites=user)
+
+ context = {'favourites' : favourites, 'movies' : movies, 'user' : user}
+
+ return render(request, 'movies/viewprofile.html', context)
+
+@login_required
+def view_comment_profile(request,comment_id):
+ comment = MovieComment.objects.get(id=comment_id)
+
+ user = comment.comment_author
+
+ movies = Movie.objects.filter(author=user)
+
+ favourites = Movie.objects.filter(favourites=user)
+
+ context = {'favourites' : favourites, 'movies' : movies, 'user' : user}
+
+ return render(request, 'movies/viewprofile.html', context)
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..afb3618
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,34 @@
+asgiref==3.5.2
+certifi==2022.6.15
+cffi==1.15.1
+charset-normalizer==2.1.0
+colorama==0.4.5
+cryptography==37.0.4
+decorator==4.4.2
+defusedxml==0.7.1
+Django==4.0.6
+django-allauth==0.51.0
+django-extensions==3.2.0
+graphviz==0.20.1
+idna==3.3
+imageio==2.19.5
+imageio-ffmpeg==0.4.7
+moviepy==1.0.3
+numpy==1.23.1
+oauthlib==3.2.0
+opencv-python==4.6.0.66
+Pillow==9.2.0
+proglog==0.1.10
+pycparser==2.21
+pydot==1.4.2
+pydotplus==2.0.2
+PyJWT==2.4.0
+pymediainfo==5.1.0
+pyparsing==3.0.9
+python3-openid==3.2.0
+requests==2.28.1
+requests-oauthlib==1.3.1
+sqlparse==0.4.2
+tqdm==4.64.0
+tzdata==2022.1
+urllib3==1.26.10
diff --git a/static/assets/404 PAGE NOT FOUND - Desktop.png b/static/assets/404 PAGE NOT FOUND - Desktop.png
new file mode 100644
index 0000000..99ca6e1
Binary files /dev/null and b/static/assets/404 PAGE NOT FOUND - Desktop.png differ
diff --git a/static/assets/Forgot Password - Mobile.png b/static/assets/Forgot Password - Mobile.png
new file mode 100644
index 0000000..6effaec
Binary files /dev/null and b/static/assets/Forgot Password - Mobile.png differ
diff --git a/static/assets/Forgot password - Desktop.png b/static/assets/Forgot password - Desktop.png
new file mode 100644
index 0000000..53260c3
Binary files /dev/null and b/static/assets/Forgot password - Desktop.png differ
diff --git a/static/assets/IMAGE (1).png b/static/assets/IMAGE (1).png
new file mode 100644
index 0000000..f0539b5
Binary files /dev/null and b/static/assets/IMAGE (1).png differ
diff --git a/static/assets/IMAGE.png b/static/assets/IMAGE.png
new file mode 100644
index 0000000..5eb2db3
Binary files /dev/null and b/static/assets/IMAGE.png differ
diff --git a/static/assets/Icon.png b/static/assets/Icon.png
new file mode 100644
index 0000000..d7b7878
Binary files /dev/null and b/static/assets/Icon.png differ
diff --git a/static/assets/Page not Found - Mobile.png b/static/assets/Page not Found - Mobile.png
new file mode 100644
index 0000000..77e4b19
Binary files /dev/null and b/static/assets/Page not Found - Mobile.png differ
diff --git a/static/assets/Search.png b/static/assets/Search.png
new file mode 100644
index 0000000..78e74b8
Binary files /dev/null and b/static/assets/Search.png differ
diff --git a/static/assets/Sign in page.png b/static/assets/Sign in page.png
new file mode 100644
index 0000000..e2c9a47
Binary files /dev/null and b/static/assets/Sign in page.png differ
diff --git a/static/assets/Yasmine.jpg b/static/assets/Yasmine.jpg
new file mode 100644
index 0000000..3a18a09
Binary files /dev/null and b/static/assets/Yasmine.jpg differ
diff --git a/static/assets/bell.png b/static/assets/bell.png
new file mode 100644
index 0000000..ceed70b
Binary files /dev/null and b/static/assets/bell.png differ
diff --git a/static/assets/hamburger.png b/static/assets/hamburger.png
new file mode 100644
index 0000000..12474ed
Binary files /dev/null and b/static/assets/hamburger.png differ
diff --git a/static/assets/image 1.png b/static/assets/image 1.png
new file mode 100644
index 0000000..e7749e5
Binary files /dev/null and b/static/assets/image 1.png differ
diff --git a/static/assets/manage.py b/static/assets/manage.py
new file mode 100644
index 0000000..f04478e
--- /dev/null
+++ b/static/assets/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', 'movie.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/static/assets/mic.png b/static/assets/mic.png
new file mode 100644
index 0000000..88bed81
Binary files /dev/null and b/static/assets/mic.png differ
diff --git a/static/assets/rafiki.png b/static/assets/rafiki.png
new file mode 100644
index 0000000..ede079b
Binary files /dev/null and b/static/assets/rafiki.png differ
diff --git a/static/assets/video_upload.png b/static/assets/video_upload.png
new file mode 100644
index 0000000..1b7433f
Binary files /dev/null and b/static/assets/video_upload.png differ
diff --git a/static/dummy.png b/static/dummy.png
new file mode 100644
index 0000000..6bd8a7f
Binary files /dev/null and b/static/dummy.png differ