diff --git a/sahara/db.sqlite3 b/sahara/db.sqlite3 index 08c69f9..33e0fb4 100644 Binary files a/sahara/db.sqlite3 and b/sahara/db.sqlite3 differ diff --git a/sahara/main/__pycache__/admin.cpython-312.pyc b/sahara/main/__pycache__/admin.cpython-312.pyc index 125b2d4..d43cfe6 100644 Binary files a/sahara/main/__pycache__/admin.cpython-312.pyc and b/sahara/main/__pycache__/admin.cpython-312.pyc differ diff --git a/sahara/main/__pycache__/forms.cpython-312.pyc b/sahara/main/__pycache__/forms.cpython-312.pyc index 4fb3138..9e091ac 100644 Binary files a/sahara/main/__pycache__/forms.cpython-312.pyc and b/sahara/main/__pycache__/forms.cpython-312.pyc differ diff --git a/sahara/main/__pycache__/models.cpython-312.pyc b/sahara/main/__pycache__/models.cpython-312.pyc index 1aff89d..eb99c66 100644 Binary files a/sahara/main/__pycache__/models.cpython-312.pyc and b/sahara/main/__pycache__/models.cpython-312.pyc differ diff --git a/sahara/main/__pycache__/urls.cpython-312.pyc b/sahara/main/__pycache__/urls.cpython-312.pyc index 5a051a8..2496d92 100644 Binary files a/sahara/main/__pycache__/urls.cpython-312.pyc and b/sahara/main/__pycache__/urls.cpython-312.pyc differ diff --git a/sahara/main/__pycache__/views.cpython-312.pyc b/sahara/main/__pycache__/views.cpython-312.pyc index 2f14f32..a00c760 100644 Binary files a/sahara/main/__pycache__/views.cpython-312.pyc and b/sahara/main/__pycache__/views.cpython-312.pyc differ diff --git a/sahara/main/admin.py b/sahara/main/admin.py index 9e6ec17..879e25a 100644 --- a/sahara/main/admin.py +++ b/sahara/main/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin from django.contrib.auth.admin import UserAdmin -from .models import User,ServiceRequest # Import your custom User model +from .models import User,ServiceRequest,Service # Import your custom User model class CustomUserAdmin(UserAdmin): model = User @@ -17,7 +17,7 @@ class CustomUserAdmin(UserAdmin): # Fieldsets for the add and change forms in the admin fieldsets = ( (None, {'fields': ('email', 'password')}), - ('Personal Info', {'fields': ('first_name', 'last_name')}), + ('Personal Info', {'fields': ('first_name', 'last_name','profile','service_offered')}), ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser')}), ('Important Dates', {'fields': ('last_login',)}), # Remove 'date_joined' if it doesn't exist ) @@ -26,7 +26,7 @@ class CustomUserAdmin(UserAdmin): add_fieldsets = ( (None, { 'classes': ('wide',), - 'fields': ('email', 'first_name', 'last_name', 'password1', 'password2', 'is_staff', 'is_superuser', 'is_active'), + 'fields': ('email', 'first_name', 'last_name','profile','service_offered', 'password1', 'password2', 'is_staff', 'is_superuser', 'is_active'), }), ) @@ -35,4 +35,5 @@ class CustomUserAdmin(UserAdmin): # Register your custom User model with the custom UserAdmin class admin.site.register(User, CustomUserAdmin) -admin.site.register(ServiceRequest) \ No newline at end of file +admin.site.register(ServiceRequest) +admin.site.register(Service) \ No newline at end of file diff --git a/sahara/main/forms.py b/sahara/main/forms.py index 5f6afaf..acce591 100644 --- a/sahara/main/forms.py +++ b/sahara/main/forms.py @@ -2,7 +2,11 @@ from django import forms from django.contrib.auth.forms import AuthenticationForm from .models import User +from django import forms +from .models import User, Service + class UserRegistrationForm(forms.ModelForm): + # Password and confirm password fields with custom classes password = forms.CharField( widget=forms.PasswordInput(attrs={ 'class': 'form-control', @@ -18,7 +22,7 @@ class UserRegistrationForm(forms.ModelForm): class Meta: model = User - fields = ['first_name', 'last_name', 'email', 'password'] + fields = ['email', 'first_name', 'last_name', 'profile', 'price', 'bio', 'service_offered', 'login_profile'] widgets = { 'first_name': forms.TextInput(attrs={ 'class': 'form-control', @@ -32,8 +36,39 @@ class UserRegistrationForm(forms.ModelForm): 'class': 'form-control', 'placeholder': 'Enter your email address', }), + 'profile': forms.ClearableFileInput(attrs={ + 'class': 'form-control', + 'placeholder': 'Upload your profile image', + }), + 'bio': forms.Textarea(attrs={ + 'class': 'form-control', + 'placeholder': 'Enter your bio', + 'rows': 4, # You can customize the rows and columns as needed + }), + 'price': forms.NumberInput(attrs={ + 'class': 'form-control', + 'placeholder': 'Enter your price', + }), + 'service_offered': forms.Select(attrs={ + 'class': 'form-control', + }), + 'login_profile': forms.Select(attrs={ + 'class': 'form-control', + }), } + def clean(self): + cleaned_data = super().clean() + password = cleaned_data.get('password') + confirm_password = cleaned_data.get('confirm_password') + + # Check if passwords match + if password != confirm_password: + self.add_error('confirm_password', 'Passwords do not match') + + return cleaned_data + + def clean(self): cleaned_data = super().clean() password = cleaned_data.get('password') @@ -41,12 +76,3 @@ class UserRegistrationForm(forms.ModelForm): if password and confirm_password and password != confirm_password: raise forms.ValidationError("Passwords do not match.") - -class UserLoginForm(AuthenticationForm): - def __init__(self, *args, **kwargs): - self.request = kwargs.pop('request', None) - super(UserLoginForm, self).__init__(*args, **kwargs) - # Change the username field label and placeholder to 'Email' - self.fields['username'].label = 'Email' - self.fields['username'].widget.attrs.update({'placeholder': 'Enter your email'}) - self.fields['password'].widget.attrs.update({'placeholder': 'Enter your password'}) diff --git a/sahara/main/migrations/0004_user_service_offered.py b/sahara/main/migrations/0004_user_service_offered.py new file mode 100644 index 0000000..3b71748 --- /dev/null +++ b/sahara/main/migrations/0004_user_service_offered.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.4 on 2025-01-11 20:13 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0003_service_alter_user_bio_alter_user_price_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='service_offered', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='main.service'), + ), + ] diff --git a/sahara/main/migrations/0005_user_login_profile_alter_servicerequest_service_and_more.py b/sahara/main/migrations/0005_user_login_profile_alter_servicerequest_service_and_more.py new file mode 100644 index 0000000..faf1e2b --- /dev/null +++ b/sahara/main/migrations/0005_user_login_profile_alter_servicerequest_service_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 5.1.4 on 2025-01-12 01:26 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0004_user_service_offered'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='login_profile', + field=models.CharField(choices=[('NORMAL', 'Normal User'), ('SERVICE', 'Service Provider'), ('ADMIN', 'Admin User')], default='NORMAL', max_length=15), + ), + migrations.AlterField( + model_name='servicerequest', + name='service', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='service_offered', to='main.service'), + ), + migrations.AlterField( + model_name='user', + name='profile', + field=models.ImageField(blank=True, null=True, upload_to='profile-images/'), + ), + ] diff --git a/sahara/main/migrations/__pycache__/0004_user_service_offered.cpython-312.pyc b/sahara/main/migrations/__pycache__/0004_user_service_offered.cpython-312.pyc new file mode 100644 index 0000000..e7f596c Binary files /dev/null and b/sahara/main/migrations/__pycache__/0004_user_service_offered.cpython-312.pyc differ diff --git a/sahara/main/migrations/__pycache__/0005_user_login_profile_alter_servicerequest_service_and_more.cpython-312.pyc b/sahara/main/migrations/__pycache__/0005_user_login_profile_alter_servicerequest_service_and_more.cpython-312.pyc new file mode 100644 index 0000000..9e8b386 Binary files /dev/null and b/sahara/main/migrations/__pycache__/0005_user_login_profile_alter_servicerequest_service_and_more.cpython-312.pyc differ diff --git a/sahara/main/models.py b/sahara/main/models.py index fe61cac..257ba59 100644 --- a/sahara/main/models.py +++ b/sahara/main/models.py @@ -32,7 +32,6 @@ class UserManager(BaseUserManager): user.set_password(password) user.save(using=self._db) - # Send verification email try: self.send_verification_email(user) except: @@ -76,6 +75,12 @@ class UserManager(BaseUserManager): ) +OPTIONS = [ + ('NORMAL','Normal User'), + ('SERVICE', 'Service Provider'), + ('ADMIN', 'Admin User'), + ] + class User(AbstractBaseUser, PermissionsMixin): email = models.EmailField(unique=True) first_name = models.CharField(max_length=30) @@ -83,13 +88,19 @@ class User(AbstractBaseUser, PermissionsMixin): is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) is_superuser = models.BooleanField(default=False) - profile = models.ImageField(blank=True,null=True) + profile = models.ImageField(blank=True,null=True, upload_to="profile-images/") price = models.PositiveBigIntegerField(blank=True, null=True) bio = models.CharField(max_length=200, blank=True, null=True) member_since = models.DateTimeField(auto_now_add=True) updated_on = models.DateField(auto_now=True) + service_offered = models.ForeignKey(Service, on_delete=models.CASCADE,blank=True,null=True) + login_profile = models.CharField( + max_length=15, + choices=OPTIONS, + default='NORMAL', + ) USERNAME_FIELD = 'email' - REQUIRED_FIELDS = ['first_name', 'last_name'] + REQUIRED_FIELDS = ['first_name', 'last_name','price','bio'] objects = UserManager() @@ -112,7 +123,7 @@ class ServiceRequest(models.Model): remarks = models.TextField(blank=True, null=True) is_completed = models.BooleanField(default=False) completed_date = models.DateTimeField(null=True,blank=True) - service = models.ForeignKey(Service, on_delete=models.CASCADE, related_name="service") + service = models.ForeignKey(Service, on_delete=models.CASCADE, related_name="service_offered") def __str__(self): return self.service.name diff --git a/sahara/main/templates/main/home.html b/sahara/main/templates/main/home.html index c2af0db..0a76e01 100644 --- a/sahara/main/templates/main/home.html +++ b/sahara/main/templates/main/home.html @@ -1,63 +1,152 @@ {% extends 'base.html' %} +{% load static %} {% block content %} - - -
- - -