From 8ebc8cb35414261558c110fb177df266f68e7d3f Mon Sep 17 00:00:00 2001 From: Karen <96887635+KJSonnenberg@users.noreply.github.com> Date: Wed, 5 Jan 2022 08:41:38 -0500 Subject: [PATCH 1/4] First major test changes --- polls/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/polls/models.py b/polls/models.py index ebbb1858..ba437ea7 100644 --- a/polls/models.py +++ b/polls/models.py @@ -18,7 +18,7 @@ def was_published_recently(self): class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) - choice_text = models.CharField(max_length=200) + choice_text = models.CharField(max_length=100) votes = models.IntegerField(default=0) def __str__(self): return self.choice_text From e35621cd8ba96f02ca2e6473a1965b758af374e1 Mon Sep 17 00:00:00 2001 From: Karen <96887635+KJSonnenberg@users.noreply.github.com> Date: Wed, 5 Jan 2022 08:41:57 -0500 Subject: [PATCH 2/4] The migration --- polls/migrations/0002_auto_20220105_0821.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 polls/migrations/0002_auto_20220105_0821.py diff --git a/polls/migrations/0002_auto_20220105_0821.py b/polls/migrations/0002_auto_20220105_0821.py new file mode 100644 index 00000000..94967ec2 --- /dev/null +++ b/polls/migrations/0002_auto_20220105_0821.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2022-01-05 13:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('polls', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='choice', + name='choice_text', + field=models.CharField(max_length=100), + ), + ] From 588bdf0bea66de22443917addccf832534d93eae Mon Sep 17 00:00:00 2001 From: Karen <96887635+KJSonnenberg@users.noreply.github.com> Date: Wed, 12 Jan 2022 12:21:01 -0500 Subject: [PATCH 3/4] push delete of Polls App --- papermasters/urls.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 papermasters/urls.py diff --git a/papermasters/urls.py b/papermasters/urls.py new file mode 100644 index 00000000..1ebb1cfd --- /dev/null +++ b/papermasters/urls.py @@ -0,0 +1,10 @@ +from django.contrib import admin +from django.urls import include, path + +from . import views + +urlpatterns = [ + path('', views.index, name='index'), + path('papermasters/', include('papermasters.urls')), + path('admin/', admin.site.urls), +] \ No newline at end of file From acf21ad36b94d8108edf7836e0e3fc3e900fa234 Mon Sep 17 00:00:00 2001 From: Karen <96887635+KJSonnenberg@users.noreply.github.com> Date: Wed, 12 Jan 2022 12:21:35 -0500 Subject: [PATCH 4/4] 2nd push --- {polls => papermasters}/__init__.py | 0 papermasters/admin.py | 3 + papermasters/apps.py | 6 + .../migrations/__init__.py | 0 papermasters/models.py | 3 + papermasters/tests.py | 3 + papermasters/views.py | 6 + polls/admin.py | 19 --- polls/apps.py | 5 - polls/migrations/0001_initial.py | 36 ----- polls/migrations/0002_auto_20220105_0821.py | 18 --- polls/models.py | 24 ---- polls/static/polls/style.css | 3 - polls/templates/polls/detail.html | 12 -- polls/templates/polls/index.html | 15 --- polls/templates/polls/results.html | 9 -- polls/tests.py | 124 ------------------ polls/urls.py | 11 -- polls/views.py | 56 -------- 19 files changed, 21 insertions(+), 332 deletions(-) rename {polls => papermasters}/__init__.py (100%) create mode 100644 papermasters/admin.py create mode 100644 papermasters/apps.py rename {polls => papermasters}/migrations/__init__.py (100%) create mode 100644 papermasters/models.py create mode 100644 papermasters/tests.py create mode 100644 papermasters/views.py delete mode 100644 polls/admin.py delete mode 100644 polls/apps.py delete mode 100644 polls/migrations/0001_initial.py delete mode 100644 polls/migrations/0002_auto_20220105_0821.py delete mode 100644 polls/models.py delete mode 100644 polls/static/polls/style.css delete mode 100644 polls/templates/polls/detail.html delete mode 100644 polls/templates/polls/index.html delete mode 100644 polls/templates/polls/results.html delete mode 100644 polls/tests.py delete mode 100644 polls/urls.py delete mode 100644 polls/views.py diff --git a/polls/__init__.py b/papermasters/__init__.py similarity index 100% rename from polls/__init__.py rename to papermasters/__init__.py diff --git a/papermasters/admin.py b/papermasters/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/papermasters/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/papermasters/apps.py b/papermasters/apps.py new file mode 100644 index 00000000..b28e5919 --- /dev/null +++ b/papermasters/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class PapermastersConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'papermasters' diff --git a/polls/migrations/__init__.py b/papermasters/migrations/__init__.py similarity index 100% rename from polls/migrations/__init__.py rename to papermasters/migrations/__init__.py diff --git a/papermasters/models.py b/papermasters/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/papermasters/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/papermasters/tests.py b/papermasters/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/papermasters/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/papermasters/views.py b/papermasters/views.py new file mode 100644 index 00000000..1d9be571 --- /dev/null +++ b/papermasters/views.py @@ -0,0 +1,6 @@ +from django.shortcuts import render +from django.http import HttpResponse + +# Create your views here. +def index(request): + return HttpResponse("Hello, world. You're at the polls index.") \ No newline at end of file diff --git a/polls/admin.py b/polls/admin.py deleted file mode 100644 index 88813f43..00000000 --- a/polls/admin.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.contrib import admin - -from .models import Choice, Question - -class ChoiceInline(admin.TabularInline): - model = Choice - extra = 3 - -class QuestionAdmin(admin.ModelAdmin): - fieldsets = [ - (None, {'fields': ['question_text']}), - ('Date information', {'fields': ['pub_date']}), - ] - inlines = [ChoiceInline] - list_display = ('question_text', 'pub_date', 'was_published_recently') - list_filter = ['pub_date'] - search_fields = ['question_text'] - -admin.site.register(Question, QuestionAdmin) diff --git a/polls/apps.py b/polls/apps.py deleted file mode 100644 index d0f109e6..00000000 --- a/polls/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class PollsConfig(AppConfig): - name = 'polls' diff --git a/polls/migrations/0001_initial.py b/polls/migrations/0001_initial.py deleted file mode 100644 index 42515184..00000000 --- a/polls/migrations/0001_initial.py +++ /dev/null @@ -1,36 +0,0 @@ -# Generated by Django 2.1.2 on 2018-10-23 09:01 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Choice', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('choice_text', models.CharField(max_length=200)), - ('votes', models.IntegerField(default=0)), - ], - ), - migrations.CreateModel( - name='Question', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('question_text', models.CharField(max_length=200)), - ('pub_date', models.DateTimeField(verbose_name='date published')), - ], - ), - migrations.AddField( - model_name='choice', - name='question', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.Question'), - ), - ] diff --git a/polls/migrations/0002_auto_20220105_0821.py b/polls/migrations/0002_auto_20220105_0821.py deleted file mode 100644 index 94967ec2..00000000 --- a/polls/migrations/0002_auto_20220105_0821.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.1 on 2022-01-05 13:21 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('polls', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='choice', - name='choice_text', - field=models.CharField(max_length=100), - ), - ] diff --git a/polls/models.py b/polls/models.py deleted file mode 100644 index ba437ea7..00000000 --- a/polls/models.py +++ /dev/null @@ -1,24 +0,0 @@ -import datetime - -from django.db import models -from django.utils import timezone - -# Create your models here. -class Question(models.Model): - question_text = models.CharField(max_length=200) - pub_date = models.DateTimeField('date published') - def __str__(self): - return self.question_text - def was_published_recently(self): - now = timezone.now() - return now - datetime.timedelta(days=1) <= self.pub_date <= now - was_published_recently.admin_order_field = 'pub_date' - was_published_recently.boolean = True - was_published_recently.short_description = 'Published recently?' - -class Choice(models.Model): - question = models.ForeignKey(Question, on_delete=models.CASCADE) - choice_text = models.CharField(max_length=100) - votes = models.IntegerField(default=0) - def __str__(self): - return self.choice_text diff --git a/polls/static/polls/style.css b/polls/static/polls/style.css deleted file mode 100644 index 03836011..00000000 --- a/polls/static/polls/style.css +++ /dev/null @@ -1,3 +0,0 @@ -li a { - color: green; -} diff --git a/polls/templates/polls/detail.html b/polls/templates/polls/detail.html deleted file mode 100644 index 3e555446..00000000 --- a/polls/templates/polls/detail.html +++ /dev/null @@ -1,12 +0,0 @@ -

{{ question.question_text }}

- -{% if error_message %}

{{ error_message }}

{% endif %} - -
-{% csrf_token %} -{% for choice in question.choice_set.all %} - -
-{% endfor %} - -
diff --git a/polls/templates/polls/index.html b/polls/templates/polls/index.html deleted file mode 100644 index 18260b0d..00000000 --- a/polls/templates/polls/index.html +++ /dev/null @@ -1,15 +0,0 @@ -{% load static %} - - - -

Polls app

- -{% if latest_question_list %} - -{% else %} -

No polls are available.

-{% endif %} diff --git a/polls/templates/polls/results.html b/polls/templates/polls/results.html deleted file mode 100644 index 3b2c74f4..00000000 --- a/polls/templates/polls/results.html +++ /dev/null @@ -1,9 +0,0 @@ -

{{ question.question_text }}

- - - -Vote again? diff --git a/polls/tests.py b/polls/tests.py deleted file mode 100644 index 2a9ecb2b..00000000 --- a/polls/tests.py +++ /dev/null @@ -1,124 +0,0 @@ -import datetime - -from django.test import TestCase -from django.utils import timezone -from django.urls import reverse - -from .models import Question - - -class QuestionModelTests(TestCase): - - def test_was_published_recently_with_future_question(self): - """ - was_published_recently() returns False for questions whose pub_date - is in the future. - """ - time = timezone.now() + datetime.timedelta(days=30) - future_question = Question(pub_date=time) - self.assertIs(future_question.was_published_recently(), False) - - def test_was_published_recently_with_old_question(self): - """ - was_published_recently() returns False for questions whose pub_date - is older than 1 day. - """ - time = timezone.now() - datetime.timedelta(days=1, seconds=1) - old_question = Question(pub_date=time) - self.assertIs(old_question.was_published_recently(), False) - - def test_was_published_recently_with_recent_question(self): - """ - was_published_recently() returns True for questions whose pub_date - is within the last day. - """ - time = timezone.now() - datetime.timedelta(hours=23, minutes=59, seconds=59) - recent_question = Question(pub_date=time) - self.assertIs(recent_question.was_published_recently(), True) - -def create_question(question_text, days): - """ - Create a question with the given `question_text` and published the - given number of `days` offset to now (negative for questions published - in the past, positive for questions that have yet to be published). - """ - time = timezone.now() + datetime.timedelta(days=days) - return Question.objects.create(question_text=question_text, pub_date=time) - -class QuestionIndexViewTests(TestCase): - def test_no_questions(self): - """ - If no questions exist, an appropriate message is displayed. - """ - response = self.client.get(reverse('polls:index')) - self.assertEqual(response.status_code, 200) - self.assertContains(response, "No polls are available.") - self.assertQuerysetEqual(response.context['latest_question_list'], []) - - def test_past_question(self): - """ - Questions with a pub_date in the past are displayed on the - index page. - """ - create_question(question_text="Past question.", days=-30) - response = self.client.get(reverse('polls:index')) - self.assertQuerysetEqual( - response.context['latest_question_list'], - [''] - ) - - def test_future_question(self): - """ - Questions with a pub_date in the future aren't displayed on - the index page. - """ - create_question(question_text="Future question.", days=30) - response = self.client.get(reverse('polls:index')) - self.assertContains(response, "No polls are available.") - self.assertQuerysetEqual(response.context['latest_question_list'], []) - - def test_future_question_and_past_question(self): - """ - Even if both past and future questions exist, only past questions - are displayed. - """ - create_question(question_text="Past question.", days=-30) - create_question(question_text="Future question.", days=30) - response = self.client.get(reverse('polls:index')) - self.assertQuerysetEqual( - response.context['latest_question_list'], - [''] - ) - - def test_two_past_questions(self): - """ - The questions index page may display multiple questions. - """ - create_question(question_text="Past question 1.", days=-30) - create_question(question_text="Past question 2.", days=-5) - response = self.client.get(reverse('polls:index')) - self.assertQuerysetEqual( - response.context['latest_question_list'], - ['', ''] - ) - -class QuestionDetailViewTests(TestCase): - def test_future_question(self): - """ - The detail view of a question with a pub_date in the future - returns a 404 not found. - """ - future_question = create_question(question_text='Future question.', days=5) - url = reverse('polls:detail', args=(future_question.id,)) - response = self.client.get(url) - self.assertEqual(response.status_code, 404) - - def test_past_question(self): - """ - The detail view of a question with a pub_date in the past - displays the question's text. - """ - past_question = create_question(question_text='Past Question.', days=-5) - url = reverse('polls:detail', args=(past_question.id,)) - response = self.client.get(url) - self.assertContains(response, past_question.question_text) diff --git a/polls/urls.py b/polls/urls.py deleted file mode 100644 index eff2be0b..00000000 --- a/polls/urls.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.urls import path - -from . import views - -app_name = 'polls' -urlpatterns = [ - path('', views.IndexView.as_view(), name='index'), - path('/', views.DetailView.as_view(), name='detail'), - path('/results/', views.ResultsView.as_view(), name='results'), - path('/vote/', views.vote, name='vote'), -] diff --git a/polls/views.py b/polls/views.py deleted file mode 100644 index 1652a6eb..00000000 --- a/polls/views.py +++ /dev/null @@ -1,56 +0,0 @@ -from django.shortcuts import get_object_or_404, render -from django.http import HttpResponseRedirect -from django.urls import reverse -from django.views import generic -from django.utils import timezone - -from .models import Choice, Question - -class IndexView(generic.ListView): - template_name = 'polls/index.html' - context_object_name = 'latest_question_list' - - def get_queryset(self): - """ - Return the last five published questions (not including those set to be - published in the future). - """ - return Question.objects.filter( - pub_date__lte=timezone.now() - ).order_by('-pub_date')[:5] - -class DetailView(generic.DetailView): - model = Question - template_name = 'polls/detail.html' - def get_queryset(self): - """ - Update the model, excluding any questions that aren't published yet. - """ - return Question.objects.filter(pub_date__lte=timezone.now()) - -class ResultsView(generic.DetailView): - model = Question - template_name = 'polls/results.html' - def get_queryset(self): - """ - Excludes any questions that aren't published yet. - """ - return Question.objects.filter(pub_date__lte=timezone.now()) - -def vote(request, question_id): - question = get_object_or_404(Question, pk=question_id) - try: - selected_choice = question.choice_set.get(pk=request.POST['choice']) - except (KeyError, Choice.DoesNotExist): - # Redisplay the question voting form. - return render(request, 'polls/detail.html', { - 'question': question, - 'error_message': "You didn't select a choice.", - }) - else: - selected_choice.votes += 1 - selected_choice.save() - # Always return an HttpResponseRedirect after successfully dealing - # with POST data. This prevents data from being posted twice if a - # user hits the Back button. - return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))