Coverage for src/accounts/models/user_profile.py: 100%
16 statements
« prev ^ index » next coverage.py v7.9.2, created at 2025-08-04 12:59 +0300
« prev ^ index » next coverage.py v7.9.2, created at 2025-08-04 12:59 +0300
1"""
2This module defines the UserProfile model which extends the user model with
3shipping information.
5The UserProfile model contains:
6- Personal information (first name, last name, phone)
7- Shipping address information (country, city, zip code, street address)
8- One-to-one relationship with the main user model
9"""
11from django.contrib.auth import get_user_model
12from django.db import models
13from django.core.validators import MinLengthValidator
15from src.accounts.validators.models import OnlyDigitsValidator, NameValidator
16from src.accounts.constants import UserFieldLengths
18UserModel = get_user_model()
21class UserProfile(models.Model):
22 first_name = models.CharField(
23 max_length=UserFieldLengths.FIRST_NAME_MAX, # Maximum length from constants
24 validators=[
25 MinLengthValidator(
26 UserFieldLengths.FIRST_NAME_MIN,
27 ),
28 NameValidator(), # Custom validator for name format (letters only)
29 ],
30 null=True,
31 blank=False,
32 )
34 # Last name with same validation as first name
35 last_name = models.CharField(
36 max_length=UserFieldLengths.LAST_NAME_MAX,
37 validators=[
38 MinLengthValidator(
39 UserFieldLengths.LAST_NAME_MIN,
40 ),
41 NameValidator(),
42 ],
43 null=True,
44 blank=False,
45 )
47 # Phone number with digit-only validation
48 phone_number = models.CharField(
49 max_length=UserFieldLengths.PHONE_NUMBER_MAX,
50 validators=[
51 MinLengthValidator(
52 UserFieldLengths.PHONE_NUMBER_MIN,
53 ),
54 OnlyDigitsValidator(), # Custom validator for digits only
55 ],
56 null=True,
57 blank=False,
58 )
60 country = models.CharField(
61 max_length=UserFieldLengths.COUNTRY_MAX,
62 validators=[
63 MinLengthValidator(
64 UserFieldLengths.COUNTRY_MIN,
65 ),
66 NameValidator(),
67 ],
68 null=True,
69 blank=False,
70 )
72 city = models.CharField(
73 max_length=UserFieldLengths.CITY_MAX,
74 validators=[
75 MinLengthValidator(
76 UserFieldLengths.CITY_MIN,
77 ),
78 NameValidator(),
79 ],
80 null=True,
81 blank=False,
82 )
84 zip_code = models.CharField(
85 max_length=UserFieldLengths.ZIP_CODE_MAX,
86 validators=[
87 MinLengthValidator(
88 UserFieldLengths.ZIP_CODE_MIN,
89 ),
90 ],
91 null=True,
92 blank=False,
93 )
95 street_address = models.CharField(
96 max_length=UserFieldLengths.STREET_ADDRESS_MAX,
97 validators=[
98 MinLengthValidator(
99 UserFieldLengths.STREET_ADDRESS_MIN,
100 ),
101 ],
102 null=True,
103 blank=False,
104 )
106 apartment = models.CharField(
107 max_length=UserFieldLengths.APARTMENT_MAX,
108 null=True,
109 blank=True,
110 )
112 # One-to-one relationship with the user model
113 user = models.OneToOneField(
114 to=UserModel,
115 on_delete=models.CASCADE,
116 primary_key=True,
117 )