diff --git a/civicfix/civicfix/__pycache__/settings.cpython-313.pyc b/civicfix/civicfix/__pycache__/settings.cpython-313.pyc index 9100e23..17153db 100644 Binary files a/civicfix/civicfix/__pycache__/settings.cpython-313.pyc and b/civicfix/civicfix/__pycache__/settings.cpython-313.pyc differ diff --git a/civicfix/civicfix/settings.py b/civicfix/civicfix/settings.py index b8c4d3f..8a2325a 100644 --- a/civicfix/civicfix/settings.py +++ b/civicfix/civicfix/settings.py @@ -26,7 +26,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'core', + 'core.apps.CoreConfig', ] AUTH_USER_MODEL = 'core.User' @@ -67,9 +67,9 @@ WSGI_APPLICATION = 'civicfix.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', - 'NAME': 'civixfix_db', - 'USER': 'civicfix_user', - 'PASSWORD': 'Gokul@2001', + 'NAME': 'civicfix', + 'USER': 'admin', + 'PASSWORD': 'qwerty123', 'HOST': 'localhost', 'PORT': '5432', } @@ -116,5 +116,7 @@ STATIC_URL = 'static/' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' -LOGIN_REDIRECT_URL = 'home' +# Add these settings +LOGIN_REDIRECT_URL = 'citizen_dashboard' +LOGIN_URL = 'login' LOGOUT_REDIRECT_URL = 'home' diff --git a/civicfix/core/__pycache__/forms.cpython-313.pyc b/civicfix/core/__pycache__/forms.cpython-313.pyc index 630c814..f9aea4a 100644 Binary files a/civicfix/core/__pycache__/forms.cpython-313.pyc and b/civicfix/core/__pycache__/forms.cpython-313.pyc differ diff --git a/civicfix/core/__pycache__/models.cpython-313.pyc b/civicfix/core/__pycache__/models.cpython-313.pyc index 8c0e36e..fc1ad27 100644 Binary files a/civicfix/core/__pycache__/models.cpython-313.pyc and b/civicfix/core/__pycache__/models.cpython-313.pyc differ diff --git a/civicfix/core/__pycache__/urls.cpython-313.pyc b/civicfix/core/__pycache__/urls.cpython-313.pyc index 62119fb..984f322 100644 Binary files a/civicfix/core/__pycache__/urls.cpython-313.pyc and b/civicfix/core/__pycache__/urls.cpython-313.pyc differ diff --git a/civicfix/core/__pycache__/views.cpython-313.pyc b/civicfix/core/__pycache__/views.cpython-313.pyc index dfb2473..4214db1 100644 Binary files a/civicfix/core/__pycache__/views.cpython-313.pyc and b/civicfix/core/__pycache__/views.cpython-313.pyc differ diff --git a/civicfix/core/forms.py b/civicfix/core/forms.py index f41ee0a..77787de 100644 --- a/civicfix/core/forms.py +++ b/civicfix/core/forms.py @@ -1,6 +1,6 @@ from django import forms from django.contrib.auth.forms import UserCreationForm -from .models import User +from .models import User, Issue class CitizenRegistrationForm(UserCreationForm): email = forms.EmailField(required=True) @@ -18,4 +18,32 @@ class CitizenRegistrationForm(UserCreationForm): if commit: user.save() - return user \ No newline at end of file + return user + +class CitizenRegistrationForm(UserCreationForm): + email = forms.EmailField(required=True) + phone = forms.CharField(max_length=15, required=False) + + class Meta: + model = User + fields = ['username', 'email', 'phone', 'password1', 'password2'] + + def save(self, commit=True): + user = super().save(commit=False) + user.email = self.cleaned_data['email'] + user.phone = self.cleaned_data['phone'] + user.is_citizen = True + + if commit: + user.save() + return user + +class IssueForm(forms.ModelForm): + class Meta: + model = Issue + fields = ['title', 'description', 'category', 'location', 'latitude', 'longitude', 'photo'] + widgets = { + 'latitude': forms.HiddenInput(), + 'longitude': forms.HiddenInput(), + 'description': forms.Textarea(attrs={'rows': 4, 'placeholder': 'Describe the issue in detail...'}), + } \ No newline at end of file diff --git a/civicfix/core/migrations/0001_initial.py b/civicfix/core/migrations/0001_initial.py index 7d6412f..1478ea0 100644 --- a/civicfix/core/migrations/0001_initial.py +++ b/civicfix/core/migrations/0001_initial.py @@ -1,8 +1,11 @@ -# Generated by Django 5.2.5 on 2025-08-18 15:07 +# Generated by Django 5.2.5 on 2025-08-20 06:30 import django.contrib.auth.models import django.contrib.auth.validators +import django.core.validators +import django.db.models.deletion import django.utils.timezone +from django.conf import settings from django.db import migrations, models @@ -15,6 +18,15 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='IssueCategory', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('description', models.TextField(blank=True)), + ('icon', models.CharField(default='fas fa-exclamation-circle', max_length=50)), + ], + ), migrations.CreateModel( name='User', fields=[ @@ -33,8 +45,8 @@ class Migration(migrations.Migration): ('is_moderator', models.BooleanField(default=False)), ('is_resolver', models.BooleanField(default=False)), ('phone', models.CharField(blank=True, max_length=15, null=True)), - ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), - ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to.', related_name='core_user_groups', related_query_name='core_user', to='auth.group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='core_user_permissions', related_query_name='core_user', to='auth.permission', verbose_name='user permissions')), ], options={ 'verbose_name': 'user', @@ -45,4 +57,21 @@ class Migration(migrations.Migration): ('objects', django.contrib.auth.models.UserManager()), ], ), + migrations.CreateModel( + name='Issue', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200)), + ('description', models.TextField()), + ('location', models.CharField(max_length=200)), + ('latitude', models.FloatField()), + ('longitude', models.FloatField()), + ('photo', models.ImageField(blank=True, null=True, upload_to='issue_photos/', validators=[django.core.validators.FileExtensionValidator(['jpg', 'jpeg', 'png', 'gif'])])), + ('status', models.CharField(choices=[('reported', 'Reported'), ('acknowledged', 'Acknowledged'), ('in_progress', 'In Progress'), ('resolved', 'Resolved')], default='reported', max_length=20)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('reporter', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reported_issues', to=settings.AUTH_USER_MODEL)), + ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.issuecategory')), + ], + ), ] diff --git a/civicfix/core/migrations/__pycache__/0001_initial.cpython-313.pyc b/civicfix/core/migrations/__pycache__/0001_initial.cpython-313.pyc index 4682d1c..4854e70 100644 Binary files a/civicfix/core/migrations/__pycache__/0001_initial.cpython-313.pyc and b/civicfix/core/migrations/__pycache__/0001_initial.cpython-313.pyc differ diff --git a/civicfix/core/migrations/__pycache__/0002_alter_user_groups_alter_user_user_permissions.cpython-313.pyc b/civicfix/core/migrations/__pycache__/0002_alter_user_groups_alter_user_user_permissions.cpython-313.pyc new file mode 100644 index 0000000..b64a153 Binary files /dev/null and b/civicfix/core/migrations/__pycache__/0002_alter_user_groups_alter_user_user_permissions.cpython-313.pyc differ diff --git a/civicfix/core/migrations/__pycache__/0003_alter_user_user_permissions.cpython-313.pyc b/civicfix/core/migrations/__pycache__/0003_alter_user_user_permissions.cpython-313.pyc new file mode 100644 index 0000000..1e4329e Binary files /dev/null and b/civicfix/core/migrations/__pycache__/0003_alter_user_user_permissions.cpython-313.pyc differ diff --git a/civicfix/core/migrations/__pycache__/0004_alter_user_user_permissions.cpython-313.pyc b/civicfix/core/migrations/__pycache__/0004_alter_user_user_permissions.cpython-313.pyc new file mode 100644 index 0000000..ce54275 Binary files /dev/null and b/civicfix/core/migrations/__pycache__/0004_alter_user_user_permissions.cpython-313.pyc differ diff --git a/civicfix/core/models.py b/civicfix/core/models.py index 607962c..050a1c6 100644 --- a/civicfix/core/models.py +++ b/civicfix/core/models.py @@ -1,6 +1,7 @@ from django.db import models from django.contrib.auth.models import AbstractUser from django.urls import reverse +from django.core.validators import FileExtensionValidator class User(AbstractUser): is_citizen = models.BooleanField(default=False) @@ -8,5 +9,51 @@ class User(AbstractUser): is_resolver = models.BooleanField(default=False) phone = models.CharField(max_length=15, blank=True, null=True) - def get_absolute_url(self): - return reverse('home') \ No newline at end of file + groups = models.ManyToManyField( + 'auth.Group', + verbose_name='groups', + blank=True, + help_text='The groups this user belongs to.', + related_name='core_user_groups', + related_query_name='core_user', + ) + user_permissions = models.ManyToManyField( + 'auth.Permission', + verbose_name='user permissions', + blank=True, + help_text='Specific permissions for this user.', + related_name='core_user_permissions', + related_query_name='core_user', + ) + +class IssueCategory(models.Model): + name = models.CharField(max_length=100) + description = models.TextField(blank=True) + icon = models.CharField(max_length=50, default='fas fa-exclamation-circle') + + def __str__(self): + return self.name + +class Issue(models.Model): + STATUS_CHOICES = [ + ('reported', 'Reported'), + ('acknowledged', 'Acknowledged'), + ('in_progress', 'In Progress'), + ('resolved', 'Resolved'), + ] + + title = models.CharField(max_length=200) + description = models.TextField() + category = models.ForeignKey(IssueCategory, on_delete=models.SET_NULL, null=True, blank=True) + reporter = models.ForeignKey(User, on_delete=models.CASCADE, related_name='reported_issues') + location = models.CharField(max_length=200) + latitude = models.FloatField() + longitude = models.FloatField() + photo = models.ImageField(upload_to='issue_photos/', blank=True, null=True, + validators=[FileExtensionValidator(['jpg', 'jpeg', 'png', 'gif'])]) + status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='reported') + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + def __str__(self): + return self.title \ No newline at end of file diff --git a/civicfix/core/templates/core/base.html b/civicfix/core/templates/core/base.html index e054ff4..b6cc410 100644 --- a/civicfix/core/templates/core/base.html +++ b/civicfix/core/templates/core/base.html @@ -35,32 +35,56 @@