Explorar o código

Built out the application structure a little more. Added the ability to import CSV via the admin panel for zip codes.

Adam Day %!s(int64=2) %!d(string=hai) anos
pai
achega
c931e6a490
Modificáronse 12 ficheiros con 274 adicións e 3 borrados
  1. 3 0
      .gitignore
  2. 5 0
      askpatrons/settings.py
  3. 2 1
      askpatrons/urls.py
  4. BIN=BIN
      requirements.txt
  5. 25 1
      vote/admin.py
  6. 16 0
      vote/forms.py
  7. 102 0
      vote/migrations/0001_initial.py
  8. 88 1
      vote/models.py
  9. 10 0
      vote/templates/vote/index.html
  10. 6 0
      vote/urls.py
  11. 9 0
      vote/validators.py
  12. 8 0
      vote/views.py

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+.idea
+*.db
+*.sqlite3

+ 5 - 0
askpatrons/settings.py

@@ -37,6 +37,7 @@ INSTALLED_APPS = [
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
+    'import_export',
     'vote',
 ]
 
@@ -118,6 +119,10 @@ USE_TZ = True
 
 STATIC_URL = 'static/'
 
+# Add STATIC_ROOT to collect static files
+STATIC_ROOT = BASE_DIR / 'static'
+
+
 # Default primary key field type
 # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
 

+ 2 - 1
askpatrons/urls.py

@@ -14,8 +14,9 @@ Including another URLconf
     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
 """
 from django.contrib import admin
-from django.urls import path
+from django.urls import path, include
 
 urlpatterns = [
     path('admin/', admin.site.urls),
+    path('', include('vote.urls')),
 ]

BIN=BIN
requirements.txt


+ 25 - 1
vote/admin.py

@@ -1,3 +1,27 @@
 from django.contrib import admin
+from .models import *
+from import_export import resources
+from import_export.admin import ImportExportModelAdmin
+
+
+class ZipCodeResource(resources.ModelResource):
+    class Meta:
+        model = ZipCode
+
+
+class ZipCodeAdmin(ImportExportModelAdmin):
+    resource_classes = [ZipCodeResource]
+    search_fields = ['zip', 'primary_city']
+    list_display = ['zip', 'primary_city', 'state', 'county', 'latitude', 'longitude', 'irs_estimated_population']
+    list_filter = ['state',]
+    ordering = ['state', 'zip', 'primary_city']
+
+
+admin.site.register(ZipCode, ZipCodeAdmin)
+admin.site.register(AgeRange)
+admin.site.register(Voter)
+admin.site.register(Question)
+admin.site.register(Vote)
+admin.site.register(VoterQuestion)
+
 
-# Register your models here.

+ 16 - 0
vote/forms.py

@@ -0,0 +1,16 @@
+from django import forms
+
+from .models import Voter, VoterQuestion, Question, Vote
+
+
+class VoterForm(forms.ModelForm):
+    class Meta:
+        model = Voter
+        fields = ['first_name', 'last_name', 'age_range', 'zip_code']
+
+
+class VoterQuestionForm(forms.ModelForm):
+    class Meta:
+        model = VoterQuestion
+        fields = ['question', 'vote']
+

+ 102 - 0
vote/migrations/0001_initial.py

@@ -0,0 +1,102 @@
+# Generated by Django 4.1.7 on 2023-03-23 16:07
+
+from django.db import migrations, models
+import django.db.models.deletion
+import vote.models
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='AgeRange',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('age_range', models.CharField(max_length=100)),
+            ],
+            options={
+                'ordering': ['age_range'],
+            },
+        ),
+        migrations.CreateModel(
+            name='Question',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('question_text', models.TextField()),
+                ('pub_date', models.DateTimeField(verbose_name='date published')),
+                ('question_id', models.CharField(default=vote.models.random_id, max_length=256)),
+            ],
+            options={
+                'ordering': ['pub_date'],
+            },
+        ),
+        migrations.CreateModel(
+            name='Voter',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('first_name', models.CharField(max_length=100)),
+                ('last_name', models.CharField(max_length=100)),
+                ('age_range', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vote.agerange')),
+            ],
+            options={
+                'ordering': ['last_name'],
+            },
+        ),
+        migrations.CreateModel(
+            name='ZipCode',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('zip', models.CharField(max_length=5)),
+                ('type', models.CharField(max_length=4)),
+                ('decommissioned', models.BooleanField()),
+                ('primary_city', models.CharField(max_length=28)),
+                ('acceptable_cities', models.CharField(max_length=100)),
+                ('unacceptable_cities', models.CharField(max_length=100)),
+                ('state', models.CharField(max_length=2)),
+                ('county', models.CharField(max_length=100)),
+                ('timezone', models.CharField(max_length=100)),
+                ('area_codes', models.CharField(max_length=100)),
+                ('world_region', models.CharField(max_length=100)),
+                ('country', models.CharField(max_length=100)),
+                ('latitude', models.FloatField()),
+                ('longitude', models.FloatField()),
+                ('irs_estimated_population', models.IntegerField()),
+            ],
+            options={
+                'ordering': ['zip'],
+            },
+        ),
+        migrations.CreateModel(
+            name='VoterQuestion',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vote.question')),
+                ('voter', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vote.voter')),
+            ],
+            options={
+                'ordering': ['voter'],
+            },
+        ),
+        migrations.AddField(
+            model_name='voter',
+            name='zip_code',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vote.zipcode'),
+        ),
+        migrations.CreateModel(
+            name='Vote',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('vote', models.BooleanField()),
+                ('vote_id', models.CharField(default=vote.models.random_id, max_length=256)),
+                ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='vote.question')),
+            ],
+            options={
+                'ordering': ['question'],
+            },
+        ),
+    ]

+ 88 - 1
vote/models.py

@@ -1,3 +1,90 @@
 from django.db import models
+import random
+import string
 
-# Create your models here.
+
+def random_id():
+    return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(256))
+
+
+class ZipCode(models.Model):
+    objects = None
+    zip = models.CharField(max_length=5)
+    type = models.CharField(max_length=4)
+    decommissioned = models.BooleanField()
+    primary_city = models.CharField(max_length=28)
+    acceptable_cities = models.CharField(max_length=100)
+    unacceptable_cities = models.CharField(max_length=100)
+    state = models.CharField(max_length=2)
+    county = models.CharField(max_length=100)
+    timezone = models.CharField(max_length=100)
+    area_codes = models.CharField(max_length=100)
+    world_region = models.CharField(max_length=100)
+    country = models.CharField(max_length=100)
+    latitude = models.FloatField()
+    longitude = models.FloatField()
+    irs_estimated_population = models.IntegerField()
+
+    def __str__(self):
+        return self.zip
+
+    class Meta:
+        ordering = ['zip']
+
+
+class AgeRange(models.Model):
+    age_range = models.CharField(max_length=100)
+
+    def __str__(self):
+        return self.age_range
+
+    class Meta:
+        ordering = ['age_range']
+
+
+class Voter(models.Model):
+    first_name = models.CharField(max_length=100)
+    last_name = models.CharField(max_length=100)
+    age_range = models.ForeignKey(AgeRange, on_delete=models.CASCADE)
+    zip_code = models.ForeignKey(ZipCode, on_delete=models.CASCADE)
+
+    def __str__(self):
+        return "%s %s (%s)" % (self.last_name, self.first_name, self.zip_code)
+
+    class Meta:
+        ordering = ['last_name']
+
+
+class Question(models.Model):
+    question_text = models.TextField()
+    pub_date = models.DateTimeField('date published')
+    question_id = models.CharField(max_length=256, default=random_id)
+
+    def __str__(self):
+        return self.question_text
+
+    class Meta:
+        ordering = ['pub_date']
+
+
+class Vote(models.Model):
+    question = models.ForeignKey(Question, on_delete=models.CASCADE)
+    vote = models.BooleanField()
+    vote_id = models.CharField(max_length=256, default=random_id)
+
+    def __str__(self):
+        return "%s (%s)" % (self.question, self.vote)
+
+    class Meta:
+        ordering = ['question']
+
+
+class VoterQuestion(models.Model):
+    voter = models.ForeignKey(Voter, on_delete=models.CASCADE)
+    question = models.ForeignKey(Question, on_delete=models.CASCADE)
+
+    def __str__(self):
+        return "%s (%s)" % (self.voter, self.question.id)
+
+    class Meta:
+        ordering = ['voter']

+ 10 - 0
vote/templates/vote/index.html

@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>AskPatrons</title>
+</head>
+<body>
+<h1>AskPatrons</h1>
+</body>
+</html>

+ 6 - 0
vote/urls.py

@@ -0,0 +1,6 @@
+from django.urls import path
+from . import views
+
+urlpatterns = [
+    path('', views.index, name='index'),
+]

+ 9 - 0
vote/validators.py

@@ -0,0 +1,9 @@
+from django.core.exceptions import ValidationError
+from . models import ZipCode
+
+
+def zi_code_validator(value):
+    zip_codes = ZipCode.objects.all()
+    if value not in zip_codes:
+        raise ValidationError("Zip code is not valid")
+

+ 8 - 0
vote/views.py

@@ -1,3 +1,11 @@
 from django.shortcuts import render
 
+
 # Create your views here.
+def index(request):
+
+    context = {
+
+    }
+
+    return render(request, 'vote/index.html', context=context)