Skip to content

Commit f67acd2

Browse files
committed
uber clone
1 parent c112d1d commit f67acd2

31 files changed

+1035
-0
lines changed

Uber_Clone/.env.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
GOOGLE_API_KEY=your_google_api_key_here
2+
OPENWEATHER_API_KEY=your_openweather_api_key_here

Uber_Clone/account/__init__.py

Whitespace-only changes.

Uber_Clone/account/admin.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.contrib import admin
2+
from .models import User
3+
4+
# Register your models here.
5+
admin.site.register(User)

Uber_Clone/account/apps.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.apps import AppConfig
2+
3+
4+
class AccountConfig(AppConfig):
5+
default_auto_field = "django.db.models.BigAutoField"
6+
name = "account"
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
# Generated by Django 5.1.7 on 2025-03-29 05:30
2+
3+
import django.contrib.auth.models
4+
import django.utils.timezone
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
initial = True
11+
12+
dependencies = [
13+
("auth", "0012_alter_user_first_name_max_length"),
14+
]
15+
16+
operations = [
17+
migrations.CreateModel(
18+
name="User",
19+
fields=[
20+
(
21+
"id",
22+
models.BigAutoField(
23+
auto_created=True,
24+
primary_key=True,
25+
serialize=False,
26+
verbose_name="ID",
27+
),
28+
),
29+
("password", models.CharField(max_length=128, verbose_name="password")),
30+
(
31+
"last_login",
32+
models.DateTimeField(
33+
blank=True, null=True, verbose_name="last login"
34+
),
35+
),
36+
(
37+
"is_superuser",
38+
models.BooleanField(
39+
default=False,
40+
help_text="Designates that this user has all permissions without explicitly assigning them.",
41+
verbose_name="superuser status",
42+
),
43+
),
44+
(
45+
"first_name",
46+
models.CharField(
47+
blank=True, max_length=150, verbose_name="first name"
48+
),
49+
),
50+
(
51+
"last_name",
52+
models.CharField(
53+
blank=True, max_length=150, verbose_name="last name"
54+
),
55+
),
56+
(
57+
"is_staff",
58+
models.BooleanField(
59+
default=False,
60+
help_text="Designates whether the user can log into this admin site.",
61+
verbose_name="staff status",
62+
),
63+
),
64+
(
65+
"is_active",
66+
models.BooleanField(
67+
default=True,
68+
help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.",
69+
verbose_name="active",
70+
),
71+
),
72+
(
73+
"date_joined",
74+
models.DateTimeField(
75+
default=django.utils.timezone.now, verbose_name="date joined"
76+
),
77+
),
78+
("email", models.EmailField(max_length=254, unique=True)),
79+
(
80+
"user_type",
81+
models.CharField(
82+
choices=[("DRIVER", "Driver"), ("CUSTOMER", "Customer")],
83+
default="CUSTOMER",
84+
max_length=10,
85+
),
86+
),
87+
("phone", models.CharField(max_length=15, unique=True)),
88+
(
89+
"profile_picture",
90+
models.ImageField(
91+
blank=True, null=True, upload_to="profile_pictures/"
92+
),
93+
),
94+
(
95+
"groups",
96+
models.ManyToManyField(
97+
blank=True,
98+
help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.",
99+
related_name="user_set",
100+
related_query_name="user",
101+
to="auth.group",
102+
verbose_name="groups",
103+
),
104+
),
105+
(
106+
"user_permissions",
107+
models.ManyToManyField(
108+
blank=True,
109+
help_text="Specific permissions for this user.",
110+
related_name="user_set",
111+
related_query_name="user",
112+
to="auth.permission",
113+
verbose_name="user permissions",
114+
),
115+
),
116+
],
117+
options={
118+
"verbose_name": "user",
119+
"verbose_name_plural": "users",
120+
"abstract": False,
121+
},
122+
managers=[
123+
("objects", django.contrib.auth.models.UserManager()),
124+
],
125+
),
126+
]
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Generated by Django 5.1.7 on 2025-03-29 05:48
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("account", "0001_initial"),
10+
]
11+
12+
operations = [
13+
migrations.AlterModelManagers(
14+
name="user",
15+
managers=[],
16+
),
17+
]

Uber_Clone/account/migrations/__init__.py

Whitespace-only changes.

Uber_Clone/account/models.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from django.db import models
2+
from django.contrib.auth.models import AbstractUser
3+
4+
from django.contrib.auth.models import BaseUserManager
5+
6+
7+
# Create your models here.
8+
class CustomUserManager(BaseUserManager):
9+
def create_user(self, email, password=None, **extra_fields):
10+
if not email:
11+
raise ValueError("The Email field must be set")
12+
email = self.normalize_email(email)
13+
user = self.model(email=email, **extra_fields)
14+
user.set_password(password)
15+
user.save()
16+
return user
17+
18+
def create_superuser(self, email, password=None, **extra_fields):
19+
extra_fields.setdefault('is_staff', True)
20+
extra_fields.setdefault('is_superuser', True)
21+
extra_fields.setdefault('user_type', 'CUSTOMER') # ou DRIVER si tu préfères
22+
23+
if extra_fields.get('is_staff') is not True:
24+
raise ValueError('Superuser must have is_staff=True.')
25+
if extra_fields.get('is_superuser') is not True:
26+
raise ValueError('Superuser must have is_superuser=True.')
27+
28+
return self.create_user(email, password, **extra_fields)
29+
30+
31+
class User(AbstractUser):
32+
username = None
33+
34+
email = models.EmailField(unique=True)
35+
36+
USER_TYPE_CHOICES = (
37+
("DRIVER", "Driver"),
38+
("CUSTOMER", "Customer"),
39+
)
40+
41+
user_type = models.CharField(max_length=10, choices=USER_TYPE_CHOICES, default="CUSTOMER")
42+
phone = models.CharField(max_length=15, unique=True)
43+
profile_picture = models.ImageField(upload_to='profile_pictures/', null=True, blank=True)
44+
45+
USERNAME_FIELD = 'email'
46+
47+
REQUIRED_FIELDS = ['user_type', 'phone']
48+
49+
objects = CustomUserManager()
50+
51+
def get_full_name(self):
52+
super().get_full_name()
53+
54+
def __str__(self):
55+
return f"{self.email} - Nom Complet : {self.get_full_name()}"

Uber_Clone/account/serializers.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from .models import User
2+
from rest_framework import serializers
3+
4+
class UserCreateSerializer(serializers.ModelSerializer):
5+
class Meta:
6+
model = User
7+
fields = ('id','email', 'first_name', 'last_name','user_type','phone','password','profile_picture')
8+
extra_kwargs = {'password': {'write_only': True}}
9+
10+
def create(self, validated_data):
11+
user = User.objects.create_user(
12+
email = validated_data.get('email'),
13+
password = validated_data.get('password'),
14+
user_type = validated_data.get('user_type'),
15+
phone = validated_data.get('phone'),
16+
profile_picture = validated_data.get('profile_picture'),
17+
)
18+
return user
19+
20+
class UserSerializer(serializers.ModelSerializer):
21+
class Meta:
22+
model = User
23+
fields = ('id','email','user_type','phone','profile_picture')
24+

Uber_Clone/account/tests.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.test import TestCase
2+
3+
# Create your tests here.

0 commit comments

Comments
 (0)