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

1""" 

2This module defines the UserProfile model which extends the user model with 

3shipping information. 

4 

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""" 

10 

11from django.contrib.auth import get_user_model 

12from django.db import models 

13from django.core.validators import MinLengthValidator 

14 

15from src.accounts.validators.models import OnlyDigitsValidator, NameValidator 

16from src.accounts.constants import UserFieldLengths 

17 

18UserModel = get_user_model() 

19 

20 

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 ) 

33 

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 ) 

46 

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 ) 

59 

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 ) 

71 

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 ) 

83 

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 ) 

94 

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 ) 

105 

106 apartment = models.CharField( 

107 max_length=UserFieldLengths.APARTMENT_MAX, 

108 null=True, 

109 blank=True, 

110 ) 

111 

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 )