from django.db import modelsfrom django.contrib.auth import get_user_modelfrom django.utils.text import slugifyfrom django.urls import reverse
User = get_user_model()# Create your models here.class List(models.Model):
LIST_TYPES = [('daily','Daily'), ('weekly','Weekly'), ('monthly', 'Monthly'), ('lifelong', 'Life Long')] list_type = models.CharField(max_length = 10, choices = LIST_TYPES) user = models.ForeignKey(User, related_name = 'list', on_delete = models.CASCADE) title = models.CharField(max_length = 32) slug = models.SlugField(allow_unicode = True, unique = True) created_at = models.DateTimeField(auto_now_add = True)
def __str__(self): return self.title
def save(self, *args, **kwargs): self.slug = slugify(self.title) super().save( *args, **kwargs)
class Meta(): ordering = ['title']
class Task(models.Model):
list = models.ForeignKey(List, related_name = 'tasks', on_delete = models.CASCADE) user = models.ForeignKey(User, related_name = 'tasks', on_delete = models.CASCADE) name = models.CharField(max_length = 64) task_slug = models.SlugField(allow_unicode = True) completed = models.BooleanField(default = False) created_at = models.DateTimeField(auto_now_add = True) complete_before = models.DateTimeField() class Meta(): ordering = ['complete_before']
def __str__(self): return self.name
def save(self,*args, **kwargs): self.task_slug = slugify(self.name) super().save(*args, **kwargs)
def get_absolute_url(self): return reverse('listApp:detail', kwargs={'slug':self.slug})
from django.urls import pathfrom . import views
app_name = 'listApp'
urlpatterns = [ path('', views.ListListView.as_view(), name = 'all'), path('create', views.ListCreateView.as_view(), name = 'create'), path('<slug:slug>', views.ListDetailView.as_view(), name = 'detail'), path('<slug:slug>/createtask', views.TaskCreateView.as_view(), name = 'createtask'), path('<slug:slug>/updatetask/<slug:task_slug>', views.TaskUpdateView.as_view(), name = 'updatetask'), path('update/<slug:slug>', views.ListUpdateView.as_view(), name='update'), path('delete/<slug:slug>', views.ListDeleteView.as_view(), name='delete'),
]
from django.shortcuts import renderfrom django.views.generic import CreateView, ListView, DetailView, UpdateView, DeleteViewfrom django.contrib.auth.mixins import LoginRequiredMixinfrom django.urls import reverse_lazyfrom django.utils.text import slugifyfrom braces.views import SelectRelatedMixinfrom .forms import ListCreateForm,TaskCreateFormfrom .models import List,Task
# Create your views here.class ListCreateView(LoginRequiredMixin, CreateView):
form_class = ListCreateForm success_url = reverse_lazy('listApp:all') template_name = 'listApp/list_form.html'
def form_valid(self, form): self.object = form.save(commit = False) self.object.user = self.request.user self.object.save() return super().form_valid(form)
class ListListView(LoginRequiredMixin, ListView):
model = List template_name = 'listApp/list_list.html' context_object_name = 'lists'
def get_queryset(self): self.user = self.request.user return List.objects.filter(user=self.user)
class ListDetailView(LoginRequiredMixin, DetailView):
model = List template_name = 'listApp/list_detail.html' context_object_name = 'list_detail'
class ListUpdateView(LoginRequiredMixin, UpdateView): model = List fields = ('title', 'list_type') template_name_suffix = '_update_form' success_url = reverse_lazy('listApp:all') # # def get_success_url(self): # current_slug = self.kwargs['slug'] # return reverse_lazy('listApp:detail', kwargs={'slug': current_slug})
class ListDeleteView(LoginRequiredMixin, DeleteView):
model = List template_name_suffix = '_check_delete' success_url = reverse_lazy('listApp:all')
class TaskCreateView(LoginRequiredMixin, CreateView):
form_class = TaskCreateForm template_name = 'listApp/task_form.html'
def form_valid(self, form): self.object = form.save(commit = False) self.object.user = self.request.user self.object.list = List.objects.get(slug=self.kwargs['slug']) self.object.save() return super().form_valid(form)
def get_success_url(self): current_slug = self.kwargs['slug'] return reverse_lazy('listApp:detail', kwargs={'slug': current_slug})
class TaskUpdateView(LoginRequiredMixin, UpdateView):
model = Task template_name_suffix = '_update_form' fields = ('name','complete_before')
def form_valid(self, form): self.object = form.save(commit = False) self.object.user = self.request.user self.object.list = List.objects.get(slug=self.kwargs['slug']) self.object.save() return super().form_valid(form)
def get_success_url(self): current_slug = self.kwargs['slug'] current_task_slug = self.kwargs['task_slug'] return reverse_lazy('listApp:detail', kwargs={'slug': current_slug, 'task_slug': current_task_slug})
<div class="container my-5 py-3"> <h2>{{list_detail.title}}</h2> <p>Created: {{list_detail.created_at}}</p>
<h3 class="d-inline">Tasks:</h3> <a class="btn btn-primary float-right d-inline" href="{% url 'listApp:createtask' slug=list_detail.slug %}">Add Task</a> <div class="container mt-4"> {% for task in list_detail.tasks.all %} <div class="container rounded" style="background-color:#bdc1c7;"> {% if task.completed %} <input type="checkbox" class="d-inline" checked> {% else %} <input type="checkbox" class="d-inline"> {% endif %} <h5 class="d-inline">{{task.name}}</h5> <a href="{% url 'listApp:updatetask' slug=list_detail.slug task_slug=task.task_slug %}" class="btn btn-warning btn-small float-right d-inline">Update Task</a> <p>Due Before:{{task.complete_before}} and Created:{{task.created_at}}</p> </div> {% endfor %} </div> </div>
{% extends "base.html" %}{% load bootstrap4 %}{% bootstrap_javascript jquery='full' %}
{% block head_content %} <title>{{user.first_name}}|Update Task</title>{% endblock %}{% block body_content %} <div class="container my-5 py-3"> <h2>Update Task </h2> <form method="post"> {% csrf_token %} {% bootstrap_form form %} {{ form.media }} <input type="submit" class="btn btn-warning mt-3" value="Update"> </form> </div>
{% endblock %}
<div class="container my-5 py-3"> <h2>{{list_detail.title}}</h2> <p>Created: {{list_detail.created_at}}</p>
<h3 class="d-inline">Tasks:</h3> <a class="btn btn-primary float-right d-inline" href="{% url 'listApp:createtask' slug=list_detail.slug %}">Add Task</a> <div class="container mt-4"> {% for task in list_detail.tasks.all %} <div class="container rounded" style="background-color:#bdc1c7;"> {% if task.completed %} <input type="checkbox" class="d-inline" checked> {% else %} <input type="checkbox" class="d-inline"> {% endif %} <h5 class="d-inline">{{task.name}}</h5> <a href="{% url 'listApp:updatetask' slug=list_detail.slug task_slug=task.task_slug %}" class="btn btn-warning btn-small float-right d-inline">Update Task</a> <p>Due Before:{{task.complete_before}} and Created:{{task.created_at}}</p> </div> {% endfor %} </div> </div>
{% extends "base.html" %}{% load bootstrap4 %}{% bootstrap_javascript jquery='full' %}
{% block head_content %} <title>{{user.first_name}}|Update Task</title>{% endblock %}{% block body_content %} <div class="container my-5 py-3"> <h2>Update Task </h2> <form method="post"> {% csrf_token %} {% bootstrap_form form %} {{ form.media }} <input type="submit" class="btn btn-warning mt-3" value="Update"> </form> </div>
{% endblock %}