[
  {
    "path": ".gitignore",
    "content": "### Django ###\n*.log\n*.pot\n*.pyc\n__pycache__/\nlocal_settings.py\n\nmedia\n\n# If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/\n# in your Git repository. Update and uncomment the following line accordingly.\n# <django-project-name>/staticfiles/\n\n### Django.Python Stack ###\n# Byte-compiled / optimized / DLL files\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nparts/\nsdist/\nvar/\nwheels/\npip-wheel-metadata/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\npytestdebug.log\n\n# Translations\n*.mo\n\n# Django stuff:\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\ndoc/_build/\n\n# PyBuilder\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n.python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#poetry.lock\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n# .env\n.env/\n.venv/\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\npythonenv*\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# operating system-related files\n*.DS_Store #file properties cache/storage on macOS\nThumbs.db #thumbnail cache on Windows\n\n# profiling data\n.prof\n"
  },
  {
    "path": "Pipfile",
    "content": "[[source]]\nname = \"pypi\"\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\n\n[dev-packages]\n\n[packages]\ndjango = \"*\"\n\n[requires]\npython_version = \"3.8\"\n"
  },
  {
    "path": "README.md",
    "content": "# Django-To-Do-list-with-user-authentication\nTo Do list app with User Registration, Login, Search and full Create Read Update and DELETE functionality.\n\n![DEMO](../master/Django%20To%20Do%20List%20App.jpg)\n"
  },
  {
    "path": "base/__init__.py",
    "content": ""
  },
  {
    "path": "base/admin.py",
    "content": "from django.contrib import admin\nfrom .models import Task\n\nadmin.site.register(Task)\n"
  },
  {
    "path": "base/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass BaseConfig(AppConfig):\n    name = 'base'\n"
  },
  {
    "path": "base/forms.py",
    "content": "from django import forms\n\n# Reordering Form and View\n\n\nclass PositionForm(forms.Form):\n    position = forms.CharField()\n"
  },
  {
    "path": "base/migrations/0001_initial.py",
    "content": "# Generated by Django 3.1.7 on 2021-03-22 16:37\n\nfrom django.conf import settings\nfrom django.db import migrations, models\nimport django.db.models.deletion\n\n\nclass Migration(migrations.Migration):\n\n    initial = True\n\n    dependencies = [\n        migrations.swappable_dependency(settings.AUTH_USER_MODEL),\n    ]\n\n    operations = [\n        migrations.CreateModel(\n            name='Task',\n            fields=[\n                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),\n                ('title', models.CharField(max_length=200)),\n                ('description', models.TextField(blank=True, null=True)),\n                ('complete', models.BooleanField(default=False)),\n                ('created', models.DateTimeField(auto_now_add=True)),\n                ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),\n            ],\n            options={\n                'ordering': ['-complete'],\n            },\n        ),\n    ]\n"
  },
  {
    "path": "base/migrations/0002_auto_20210322_2234.py",
    "content": "# Generated by Django 3.1.7 on 2021-03-22 17:04\n\nfrom django.db import migrations\n\n\nclass Migration(migrations.Migration):\n\n    dependencies = [\n        ('base', '0001_initial'),\n    ]\n\n    operations = [\n        migrations.AlterModelOptions(\n            name='task',\n            options={},\n        ),\n        migrations.AlterOrderWithRespectTo(\n            name='task',\n            order_with_respect_to='user',\n        ),\n    ]\n"
  },
  {
    "path": "base/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "base/models.py",
    "content": "from django.db import models\nfrom django.contrib.auth.models import User\n# Create your models here.\n\n\nclass Task(models.Model):\n    user = models.ForeignKey(\n        User, on_delete=models.CASCADE, null=True, blank=True)\n    title = models.CharField(max_length=200)\n    description = models.TextField(null=True, blank=True)\n    complete = models.BooleanField(default=False)\n    created = models.DateTimeField(auto_now_add=True)\n\n    def __str__(self):\n        return self.title\n\n    class Meta:\n        order_with_respect_to = 'user'\n"
  },
  {
    "path": "base/templates/base/login.html",
    "content": "{% extends 'base/main.html' %}\n{% block content %}\n\n<div class=\"header-bar\">\n    <h1>Login</h1>\n</div>\n\n<div class=\"card-body\">\n    <form method=\"POST\">\n        {% csrf_token %}\n        {{form.as_p}}\n        <input class=\"button\" type=\"submit\" value=\"Login\">\n    </form>\n    <p>Don't have an account? <a href=\"{% url 'register' %}\">Register</a></p>\n</div>\n\n\n\n\n\n\n{% endblock content %}"
  },
  {
    "path": "base/templates/base/main.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"description\"\n        content=\"This is to do list implemented using Django by Dennis Ivy who is a full stack web developer.\">\n\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>To Do Items</title>\n    <meta name=\"description\" content=\"\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n    <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\">\n    <link href=\"https://fonts.googleapis.com/css2?family=Nunito:wght@200&display=swap\" rel=\"stylesheet\">\n\n    <style>\n        body {\n            background-color: #FAFAFA;\n            font-family: 'Nunito', sans-serif;\n            padding-top: 50px;\n        }\n\n        h1,\n        h2,\n        h3,\n        h4,\n        h5,\n        h6,\n            {\n            font-family: 'Raleway', sans-serif;\n        }\n\n        a,\n        p {\n            color: #4b5156\n        }\n\n        a {\n            font-weight: 600;\n        }\n\n        .container {\n            max-width: 550px;\n            margin: auto;\n            background-color: #fff;\n            -webkit-box-shadow: 2px 2px 13px -4px rgba(0, 0, 0, 0.21);\n            box-shadow: 2px 2px 13px -4px rgba(0, 0, 0, 0.21);\n        }\n\n        input {\n            outline: none;\n            border: none;\n        }\n\n        .header-bar {\n            display: flex;\n            justify-content: space-between;\n            color: #fff;\n            padding: 10px;\n            border-radius: 5px 5px 0 0;\n            background: linear-gradient(90deg, #EEA390 0%, #EB796F 43%, #EB796F 100%);\n        }\n\n        .header-bar a {\n            color: rgb(247, 247, 247);\n            text-decoration: none;\n        }\n\n        .task-wrapper {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n            background-color: #fff;\n            border-top: 1px solid #dfe4ea;\n            overflow: hidden;\n        }\n\n        .task-title {\n            display: flex;\n            padding: 20px;\n        }\n\n        .task-title a {\n            text-decoration: none;\n            color: #4b5156;\n            margin-left: 10px;\n        }\n\n        .task-complete-icon {\n            height: 20px;\n            width: 20px;\n            background-color: rgb(105, 192, 105);\n            border-radius: 50%;\n        }\n\n        .task-incomplete-icon {\n            height: 20px;\n            width: 20px;\n            background-color: rgb(218, 218, 218);\n            border-radius: 50%;\n        }\n\n        .delete-link {\n            text-decoration: none;\n            font-weight: 900;\n            color: #cf4949;\n            font-size: 22px;\n            line-height: 0;\n            padding: 20px 0px;\n        }\n\n        /*Handle Classes*/\n\n        .handle {\n            display: inline-block;\n            padding: 20px 16px;\n            cursor: grab;\n            user-select: none;\n        }\n\n        .handle:after,\n        .handle:before {\n            display: block;\n            content: \"\";\n        }\n\n        .handle:active,\n        .handle:active:before,\n        .handle:active:after {\n            cursor: grabbing;\n        }\n\n        .dropArea {\n            background-color: #f1f2f6;\n            color: black;\n            border: #ced6e0 1px solid;\n        }\n\n        .selectedTask {\n            opacity: 0.6;\n        }\n\n\n        #add-link {\n            color: #EB796F;\n            text-decoration: none;\n            font-size: 42px;\n            text-shadow: 1px 1px #81413b;\n        }\n\n        #search-add-wrapper {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            padding: 20px;\n        }\n\n        @media screen and (max-width:320px) {\n            #search-add-wrapper {\n                padding: 10px;\n            }\n        }\n\n        input[type=text],\n        input[type=password],\n        textarea {\n            border: 1px solid #757575;\n            border-radius: 5px;\n            padding: 10px;\n            width: 90%;\n        }\n\n        label {\n            padding-top: 10px !important;\n            display: block;\n        }\n\n        ::placeholder {\n            font-weight: 300;\n            opacity: 0.5;\n        }\n\n        .button {\n            border: 1px solid #757575;\n            background-color: #FFF;\n            color: #EB796F;\n            padding: 10px;\n            font-size: 14px;\n            border-radius: 5px;\n            cursor: pointer;\n            text-decoration: none;\n        }\n\n        .card-body {\n            padding: 20px;\n        }\n    </style>\n</head>\n\n<body>\n\n    <div class=\"container\">\n        {% block content %} {% endblock content %}\n    </div>\n\n</body>\n\n\n</html>"
  },
  {
    "path": "base/templates/base/register.html",
    "content": "{% extends 'base/main.html' %}\n{% block content %}\n\n<div class=\"header-bar\">\n    <h1>Register</h1>\n</div>\n\n<div class=\"card-body\">\n    <form method=\"POST\">\n        {% csrf_token %}\n        <label>{{form.username.label}}</label>\n        {{form.username}}\n\n        <label>{{form.password1.label}}</label>\n        {{form.password1}}\n\n        <label>{{form.password2.label}}</label>\n        {{form.password2}}\n        <input style=\"margin-top:10px ;\" class=\"button\" type=\"submit\" value=\"Register\">\n    </form>\n    <p>Already have an account? <a href=\"{% url 'login' %}\">Login</a></p>\n</div>\n\n\n\n\n{% endblock content %}"
  },
  {
    "path": "base/templates/base/task.html",
    "content": "<h1>Task: {{task}}</h1>"
  },
  {
    "path": "base/templates/base/task_confirm_delete.html",
    "content": "{% extends 'base/main.html' %}\n{% block content %}\n\n<div class=\"header-bar\">\n    <a href=\"{% url 'tasks' %}\">&#8592; Go Back</a>\n</div>\n\n<div class=\"card-body\">\n    <form method=\"POST\">\n        {% csrf_token %}\n        <p>Are your sure you want to delete this task? <b>\"{{task}}\"</b> </p>\n        <input class=\"button\" type=\"submit\" value=\"Delete\" />\n    </form>\n</div>\n\n\n\n{% endblock content %}"
  },
  {
    "path": "base/templates/base/task_form.html",
    "content": "{% extends 'base/main.html' %}\n{% block content %}\n\n<div class=\"header-bar\">\n    <a href=\"{% url 'tasks' %}\">&#8592; Back</a>\n</div>\n\n\n<div class=\"card-body\">\n    <form method=\"POST\" action=\"\">\n        {% csrf_token %}\n        {{form.as_p}}\n        <input class=\"button\" type=\"submit\" value=\"Submit\">\n    </form>\n</div>\n\n\n{% endblock content %}"
  },
  {
    "path": "base/templates/base/task_list.html",
    "content": "{% extends 'base/main.html' %} {% block content %}\n\n<script src=\"https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js\"></script>\n<div class=\"header-bar\">\n    <div>\n        <h1>Hello {{request.user|title}}</h1>\n        <h3 style=\"margin:0\">You have <i>{{count}}</i> incomplete task{{ count|pluralize:\"s\" }}</h3>\n    </div>\n\n    {% if request.user.is_authenticated %}\n    <a href=\"{% url 'logout' %}\">Logout</a> {% else %}\n    <a href=\"{% url 'login' %}\">Login</a> {% endif %}\n</div>\n\n\n<div id=\"search-add-wrapper\">\n    <form method=\"GET\" style=\"display: flex;\">\n        <input type='text' name='search-area' placeholder=\"Search your task\" value=\"{{search_input}}\">\n        <input class=\"button\" type=\"submit\" value='Search'>\n    </form>\n    {% if tasks|length > 0 %}\n    <a id=\"add-link\" href=\"{% url 'task-create' %}\">&#x2b;</a>\n    {% endif %}\n</div>\n\n\n<!-- Hidden form. Form submits new item positions -->\n<form style=\"display: none;\" id=\"reorderForm\" method=\"post\" action=\"{% url 'task-reorder' %}\">\n    {% csrf_token %}\n    <input type=\"hidden\" id=\"positionInput\" name=\"position\">\n</form>\n\n\n<div id=\"tasklist\" class=\"task-items-wrapper\">\n    {% for task in tasks %}\n    <div class=\"task-wrapper\" data-position=\"{{task.pk}}\">\n        <div class=\"task-title\">\n            {% if task.complete %}\n            <div class=\"task-complete-icon\"></div>\n            <i><s><a href=\"{% url 'task-update' task.id %}\">{{task}}</a></s></i> {% else %}\n            <div class=\"task-incomplete-icon\"></div>\n            <a href=\"{% url 'task-update' task.id %}\">{{task}}</a> {% endif %}\n        </div>\n        <div class=\"task-controls\">\n            <a class=\"delete-link\" href=\"{% url 'task-delete' task.id %}\">&#215;</a>\n            <span class=\"handle\">&nbsp;&#10247;</span>\n        </div>\n    </div>\n\n    {% empty %}\n    <div style=\"text-align: center; padding-bottom: 10px; line-height: 1em;\">\n        <h3>No new tasks are created.</h3>\n        <h3>Create a <a style=\"text-decoration: none; color: #e53935;\" href=\"{% url 'task-create' %}\">New task</a> ! </h3>\n    </div>\n    {% endfor %}\n</div>\n\n<script>\n    var taskList = document.getElementById(\"tasklist\");\n    var reorderForm = document.getElementById(\"reorderForm\");\n    var positionInput = document.getElementById(\"positionInput\");\n\n    let sortable = Sortable.create(taskList, {\n        handle: '.handle',\n        ghostClass: 'dropArea',\n        chosenClass: 'selectedTask',\n\n    });\n\n    function reordering() {\n        const rows = document.getElementsByClassName(\"task-wrapper\");\n        let pos = [];\n        for (let row of rows) {\n            pos.push(row.dataset.position);\n        }\n        console.log(pos.join(\",\"))\n        positionInput.value = pos.join(',');\n        reorderForm.submit();\n    }\n\n    document.ondrop = reordering\n</script>\n\n{% endblock content %}"
  },
  {
    "path": "base/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "base/urls.py",
    "content": "from django.urls import path\nfrom .views import TaskList, TaskDetail, TaskCreate, TaskUpdate, DeleteView, CustomLoginView, RegisterPage, TaskReorder\nfrom django.contrib.auth.views import LogoutView\n\nurlpatterns = [\n    path('login/', CustomLoginView.as_view(), name='login'),\n    path('logout/', LogoutView.as_view(next_page='login'), name='logout'),\n    path('register/', RegisterPage.as_view(), name='register'),\n\n    path('', TaskList.as_view(), name='tasks'),\n    path('task/<int:pk>/', TaskDetail.as_view(), name='task'),\n    path('task-create/', TaskCreate.as_view(), name='task-create'),\n    path('task-update/<int:pk>/', TaskUpdate.as_view(), name='task-update'),\n    path('task-delete/<int:pk>/', DeleteView.as_view(), name='task-delete'),\n    path('task-reorder/', TaskReorder.as_view(), name='task-reorder'),\n]\n"
  },
  {
    "path": "base/views.py",
    "content": "from django.shortcuts import render, redirect\nfrom django.views.generic.list import ListView\nfrom django.views.generic.detail import DetailView\nfrom django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView\nfrom django.urls import reverse_lazy\n\nfrom django.contrib.auth.views import LoginView\nfrom django.contrib.auth.mixins import LoginRequiredMixin\nfrom django.contrib.auth.forms import UserCreationForm\nfrom django.contrib.auth import login\n\n# Imports for Reordering Feature\nfrom django.views import View\nfrom django.shortcuts import redirect\nfrom django.db import transaction\n\nfrom .models import Task\nfrom .forms import PositionForm\n\n\nclass CustomLoginView(LoginView):\n    template_name = 'base/login.html'\n    fields = '__all__'\n    redirect_authenticated_user = True\n\n    def get_success_url(self):\n        return reverse_lazy('tasks')\n\n\nclass RegisterPage(FormView):\n    template_name = 'base/register.html'\n    form_class = UserCreationForm\n    redirect_authenticated_user = True\n    success_url = reverse_lazy('tasks')\n\n    def form_valid(self, form):\n        user = form.save()\n        if user is not None:\n            login(self.request, user)\n        return super(RegisterPage, self).form_valid(form)\n\n    def get(self, *args, **kwargs):\n        if self.request.user.is_authenticated:\n            return redirect('tasks')\n        return super(RegisterPage, self).get(*args, **kwargs)\n\n\nclass TaskList(LoginRequiredMixin, ListView):\n    model = Task\n    context_object_name = 'tasks'\n\n    def get_context_data(self, **kwargs):\n        context = super().get_context_data(**kwargs)\n        context['tasks'] = context['tasks'].filter(user=self.request.user)\n        context['count'] = context['tasks'].filter(complete=False).count()\n\n        search_input = self.request.GET.get('search-area') or ''\n        if search_input:\n            context['tasks'] = context['tasks'].filter(\n                title__contains=search_input)\n\n        context['search_input'] = search_input\n\n        return context\n\n\nclass TaskDetail(LoginRequiredMixin, DetailView):\n    model = Task\n    context_object_name = 'task'\n    template_name = 'base/task.html'\n\n\nclass TaskCreate(LoginRequiredMixin, CreateView):\n    model = Task\n    fields = ['title', 'description', 'complete']\n    success_url = reverse_lazy('tasks')\n\n    def form_valid(self, form):\n        form.instance.user = self.request.user\n        return super(TaskCreate, self).form_valid(form)\n\n\nclass TaskUpdate(LoginRequiredMixin, UpdateView):\n    model = Task\n    fields = ['title', 'description', 'complete']\n    success_url = reverse_lazy('tasks')\n\n\nclass DeleteView(LoginRequiredMixin, DeleteView):\n    model = Task\n    context_object_name = 'task'\n    success_url = reverse_lazy('tasks')\n    def get_queryset(self):\n        owner = self.request.user\n        return self.model.objects.filter(user=owner)\n\nclass TaskReorder(View):\n    def post(self, request):\n        form = PositionForm(request.POST)\n\n        if form.is_valid():\n            positionList = form.cleaned_data[\"position\"].split(',')\n\n            with transaction.atomic():\n                self.request.user.set_task_order(positionList)\n\n        return redirect(reverse_lazy('tasks'))\n"
  },
  {
    "path": "manage.py",
    "content": "#!/usr/bin/env python\n\"\"\"Django's command-line utility for administrative tasks.\"\"\"\nimport os\nimport sys\n\n\ndef main():\n    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'todo_list.settings')\n    try:\n        from django.core.management import execute_from_command_line\n    except ImportError as exc:\n        raise ImportError(\n            \"Couldn't import Django. Are you sure it's installed and \"\n            \"available on your PYTHONPATH environment variable? Did you \"\n            \"forget to activate a virtual environment?\"\n        ) from exc\n    execute_from_command_line(sys.argv)\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "todo_list/__init__.py",
    "content": ""
  },
  {
    "path": "todo_list/asgi.py",
    "content": "\"\"\"\nASGI config for todo_list project.\n\nIt exposes the ASGI callable as a module-level variable named ``application``.\n\nFor more information on this file, see\nhttps://docs.djangoproject.com/en/3.0/howto/deployment/asgi/\n\"\"\"\n\nimport os\n\nfrom django.core.asgi import get_asgi_application\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'todo_list.settings')\n\napplication = get_asgi_application()\n"
  },
  {
    "path": "todo_list/settings.py",
    "content": "\"\"\"\nDjango settings for todo_list project.\n\nGenerated by 'django-admin startproject' using Django 3.0.8.\n\nFor more information on this file, see\nhttps://docs.djangoproject.com/en/3.0/topics/settings/\n\nFor the full list of settings and their values, see\nhttps://docs.djangoproject.com/en/3.0/ref/settings/\n\"\"\"\n\nimport os\n\n# Build paths inside the project like this: os.path.join(BASE_DIR, ...)\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\n\n\n# Quick-start development settings - unsuitable for production\n# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/\n\n# SECURITY WARNING: keep the secret key used in production secret!\nSECRET_KEY = 'd)=^c7!0-oqjmqve%(bt+p#sq6x*ipz2keh741j*-@f@_)f!1t'\n\n# SECURITY WARNING: don't run with debug turned on in production!\nDEBUG = True\n\nALLOWED_HOSTS = []\n\n\n# Application definition\n\nINSTALLED_APPS = [\n    'django.contrib.admin',\n    'django.contrib.auth',\n    'django.contrib.contenttypes',\n    'django.contrib.sessions',\n    'django.contrib.messages',\n    'django.contrib.staticfiles',\n    'base.apps.BaseConfig',\n]\n\nMIDDLEWARE = [\n    'django.middleware.security.SecurityMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n]\n\nROOT_URLCONF = 'todo_list.urls'\n\nTEMPLATES = [\n    {\n        'BACKEND': 'django.template.backends.django.DjangoTemplates',\n        'DIRS': [],\n        'APP_DIRS': True,\n        'OPTIONS': {\n            'context_processors': [\n                'django.template.context_processors.debug',\n                'django.template.context_processors.request',\n                'django.contrib.auth.context_processors.auth',\n                'django.contrib.messages.context_processors.messages',\n            ],\n        },\n    },\n]\n\nWSGI_APPLICATION = 'todo_list.wsgi.application'\n\n\n# Database\n# https://docs.djangoproject.com/en/3.0/ref/settings/#databases\n\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.sqlite3',\n        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),\n    }\n}\n\n\n# Password validation\n# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators\n\nAUTH_PASSWORD_VALIDATORS = [\n    {\n        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',\n    },\n]\n\n\n# Internationalization\n# https://docs.djangoproject.com/en/3.0/topics/i18n/\n\nLANGUAGE_CODE = 'en-us'\n\nTIME_ZONE = 'UTC'\n\nUSE_I18N = True\n\nUSE_L10N = True\n\nUSE_TZ = True\n\nLOGIN_URL = 'login'\n\n# Static files (CSS, JavaScript, Images)\n# https://docs.djangoproject.com/en/3.0/howto/static-files/\n\nSTATIC_URL = '/static/'\n"
  },
  {
    "path": "todo_list/urls.py",
    "content": "\"\"\"todo_list URL Configuration\n\nThe `urlpatterns` list routes URLs to views. For more information please see:\n    https://docs.djangoproject.com/en/3.0/topics/http/urls/\nExamples:\nFunction views\n    1. Add an import:  from my_app import views\n    2. Add a URL to urlpatterns:  path('', views.home, name='home')\nClass-based views\n    1. Add an import:  from other_app.views import Home\n    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')\nIncluding another URLconf\n    1. Import the include() function: from django.urls import include, path\n    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))\n\"\"\"\nfrom django.contrib import admin\nfrom django.urls import path, include\n\nurlpatterns = [\n    path('admin/', admin.site.urls),\n    path('', include('base.urls')),\n]\n"
  },
  {
    "path": "todo_list/wsgi.py",
    "content": "\"\"\"\nWSGI config for todo_list project.\n\nIt exposes the WSGI callable as a module-level variable named ``application``.\n\nFor more information on this file, see\nhttps://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/\n\"\"\"\n\nimport os\n\nfrom django.core.wsgi import get_wsgi_application\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'todo_list.settings')\n\napplication = get_wsgi_application()\n"
  }
]