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 - - - -
-
- 404 image -

Oops, We can't seem to find
- the page that you are looking for.

- -
-
- - \ 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 - - - -
-
- 504 image -

The server encountered a temporary error and could not complete
- your request.
Please try again in 30 seconds.

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

    {{ movie }}

    + +
    + +
    +
    +

    + Download + +

    +
    + +
    + {% if msg %} {% autoescape off %} {{ msg }} {% endautoescape %} {% endif %} +
    + {% csrf_token %} +
    + {{ form.as_p }} +

    + +

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

    {{ movie }}

    + +
    + +
    +
    +

    + Download + +

    +
    + +
    + {% if msg %} {% autoescape off %} {{ msg }} {% endautoescape %} {% endif %} +
    + {% csrf_token %} +
    + {{ form.as_p }} +

    + +

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

    + +

    +
    +
    + +{% 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 }}

    +
    + +
    + +
    + +
    + +

    Comments

    +{% for comment in comments %} + +{% 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 %} + +
    + {% csrf_token %} + {{ form.as_p }} + + + + +
    + +{% 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

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

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

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