changes on entering cities

This commit is contained in:
Flatlogic Bot 2026-01-25 10:31:06 +00:00
parent f213aed6e7
commit bae3510e83
12 changed files with 166 additions and 26 deletions

View File

@ -3,20 +3,20 @@ from .models import Profile, Parcel, Country, Governate, City
@admin.register(Country) @admin.register(Country)
class CountryAdmin(admin.ModelAdmin): class CountryAdmin(admin.ModelAdmin):
list_display = ('name',) list_display = ('name_en', 'name_ar')
search_fields = ('name',) search_fields = ('name_en', 'name_ar')
@admin.register(Governate) @admin.register(Governate)
class GovernateAdmin(admin.ModelAdmin): class GovernateAdmin(admin.ModelAdmin):
list_display = ('name', 'country') list_display = ('name_en', 'name_ar', 'country')
list_filter = ('country',) list_filter = ('country',)
search_fields = ('name',) search_fields = ('name_en', 'name_ar')
@admin.register(City) @admin.register(City)
class CityAdmin(admin.ModelAdmin): class CityAdmin(admin.ModelAdmin):
list_display = ('name', 'governate') list_display = ('name_en', 'name_ar', 'governate')
list_filter = ('governate__country', 'governate') list_filter = ('governate__country', 'governate')
search_fields = ('name',) search_fields = ('name_en', 'name_ar')
@admin.register(Profile) @admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin): class ProfileAdmin(admin.ModelAdmin):
@ -26,7 +26,7 @@ class ProfileAdmin(admin.ModelAdmin):
@admin.register(Parcel) @admin.register(Parcel)
class ParcelAdmin(admin.ModelAdmin): class ParcelAdmin(admin.ModelAdmin):
list_display = ('tracking_number', 'shipper', 'carrier', 'status', 'created_at') list_display = ('tracking_number', 'shipper', 'carrier', 'status', 'payment_status', 'created_at')
list_filter = ('status', 'pickup_country', 'delivery_country') list_filter = ('status', 'payment_status', 'pickup_country', 'delivery_country')
search_fields = ('tracking_number', 'shipper__username', 'carrier__username', 'receiver_name') search_fields = ('tracking_number', 'shipper__username', 'carrier__username', 'receiver_name')
readonly_fields = ('tracking_number', 'created_at', 'updated_at') readonly_fields = ('tracking_number', 'created_at', 'updated_at')

View File

@ -1,6 +1,7 @@
from django import forms from django import forms
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils.translation import get_language
from .models import Profile, Parcel, Country, Governate, City from .models import Profile, Parcel, Country, Governate, City
class UserRegistrationForm(forms.ModelForm): class UserRegistrationForm(forms.ModelForm):
@ -25,23 +26,28 @@ class UserRegistrationForm(forms.ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
lang = get_language()
name_field = 'name_ar' if lang == 'ar' else 'name_en'
self.fields['country'].queryset = Country.objects.all().order_by(name_field)
if 'country' in self.data: if 'country' in self.data:
try: try:
country_id = int(self.data.get('country')) country_id = int(self.data.get('country'))
self.fields['governate'].queryset = Governate.objects.filter(country_id=country_id).order_by('name') self.fields['governate'].queryset = Governate.objects.filter(country_id=country_id).order_by(name_field)
except (ValueError, TypeError): except (ValueError, TypeError):
pass pass
elif self.instance.pk and hasattr(self.instance, 'profile') and self.instance.profile.country: elif self.instance.pk and hasattr(self.instance, 'profile') and self.instance.profile.country:
self.fields['governate'].queryset = self.instance.profile.country.governate_set.order_by('name') self.fields['governate'].queryset = self.instance.profile.country.governate_set.order_by(name_field)
if 'governate' in self.data: if 'governate' in self.data:
try: try:
governate_id = int(self.data.get('governate')) governate_id = int(self.data.get('governate'))
self.fields['city'].queryset = City.objects.filter(governate_id=governate_id).order_by('name') self.fields['city'].queryset = City.objects.filter(governate_id=governate_id).order_by(name_field)
except (ValueError, TypeError): except (ValueError, TypeError):
pass pass
elif self.instance.pk and hasattr(self.instance, 'profile') and self.instance.profile.governate: elif self.instance.pk and hasattr(self.instance, 'profile') and self.instance.profile.governate:
self.fields['city'].queryset = self.instance.profile.governate.city_set.order_by('name') self.fields['city'].queryset = self.instance.profile.governate.city_set.order_by(name_field)
def clean_password_confirm(self): def clean_password_confirm(self):
password = self.cleaned_data.get('password') password = self.cleaned_data.get('password')
@ -110,6 +116,13 @@ class ParcelForm(forms.ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
lang = get_language()
name_field = 'name_ar' if lang == 'ar' else 'name_en'
# Set querysets for countries
self.fields['pickup_country'].queryset = Country.objects.all().order_by(name_field)
self.fields['delivery_country'].queryset = Country.objects.all().order_by(name_field)
# Pickup # Pickup
self.fields['pickup_governate'].queryset = Governate.objects.none() self.fields['pickup_governate'].queryset = Governate.objects.none()
self.fields['pickup_city'].queryset = City.objects.none() self.fields['pickup_city'].queryset = City.objects.none()
@ -117,14 +130,14 @@ class ParcelForm(forms.ModelForm):
if 'pickup_country' in self.data: if 'pickup_country' in self.data:
try: try:
country_id = int(self.data.get('pickup_country')) country_id = int(self.data.get('pickup_country'))
self.fields['pickup_governate'].queryset = Governate.objects.filter(country_id=country_id).order_by('name') self.fields['pickup_governate'].queryset = Governate.objects.filter(country_id=country_id).order_by(name_field)
except (ValueError, TypeError): except (ValueError, TypeError):
pass pass
if 'pickup_governate' in self.data: if 'pickup_governate' in self.data:
try: try:
gov_id = int(self.data.get('pickup_governate')) gov_id = int(self.data.get('pickup_governate'))
self.fields['pickup_city'].queryset = City.objects.filter(governate_id=gov_id).order_by('name') self.fields['pickup_city'].queryset = City.objects.filter(governate_id=gov_id).order_by(name_field)
except (ValueError, TypeError): except (ValueError, TypeError):
pass pass
@ -135,13 +148,13 @@ class ParcelForm(forms.ModelForm):
if 'delivery_country' in self.data: if 'delivery_country' in self.data:
try: try:
country_id = int(self.data.get('delivery_country')) country_id = int(self.data.get('delivery_country'))
self.fields['delivery_governate'].queryset = Governate.objects.filter(country_id=country_id).order_by('name') self.fields['delivery_governate'].queryset = Governate.objects.filter(country_id=country_id).order_by(name_field)
except (ValueError, TypeError): except (ValueError, TypeError):
pass pass
if 'delivery_governate' in self.data: if 'delivery_governate' in self.data:
try: try:
gov_id = int(self.data.get('delivery_governate')) gov_id = int(self.data.get('delivery_governate'))
self.fields['delivery_city'].queryset = City.objects.filter(governate_id=gov_id).order_by('name') self.fields['delivery_city'].queryset = City.objects.filter(governate_id=gov_id).order_by(name_field)
except (ValueError, TypeError): except (ValueError, TypeError):
pass pass

View File

@ -0,0 +1,55 @@
# Generated by Django 5.2.7 on 2026-01-25 10:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('core', '0004_parcel_payment_status_parcel_price_and_more'),
]
operations = [
migrations.RemoveField(
model_name='city',
name='name',
),
migrations.RemoveField(
model_name='country',
name='name',
),
migrations.RemoveField(
model_name='governate',
name='name',
),
migrations.AddField(
model_name='city',
name='name_ar',
field=models.CharField(default='', max_length=100, verbose_name='Name (Arabic)'),
),
migrations.AddField(
model_name='city',
name='name_en',
field=models.CharField(default='', max_length=100, verbose_name='Name (English)'),
),
migrations.AddField(
model_name='country',
name='name_ar',
field=models.CharField(default='', max_length=100, verbose_name='Name (Arabic)'),
),
migrations.AddField(
model_name='country',
name='name_en',
field=models.CharField(default='', max_length=100, verbose_name='Name (English)'),
),
migrations.AddField(
model_name='governate',
name='name_ar',
field=models.CharField(default='', max_length=100, verbose_name='Name (Arabic)'),
),
migrations.AddField(
model_name='governate',
name='name_en',
field=models.CharField(default='', max_length=100, verbose_name='Name (English)'),
),
]

View File

@ -0,0 +1,43 @@
# Generated by Django 5.2.7 on 2026-01-25 10:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('core', '0005_remove_city_name_remove_country_name_and_more'),
]
operations = [
migrations.AlterField(
model_name='city',
name='name_ar',
field=models.CharField(max_length=100, verbose_name='Name (Arabic)'),
),
migrations.AlterField(
model_name='city',
name='name_en',
field=models.CharField(max_length=100, verbose_name='Name (English)'),
),
migrations.AlterField(
model_name='country',
name='name_ar',
field=models.CharField(max_length=100, verbose_name='Name (Arabic)'),
),
migrations.AlterField(
model_name='country',
name='name_en',
field=models.CharField(max_length=100, verbose_name='Name (English)'),
),
migrations.AlterField(
model_name='governate',
name='name_ar',
field=models.CharField(max_length=100, verbose_name='Name (Arabic)'),
),
migrations.AlterField(
model_name='governate',
name='name_en',
field=models.CharField(max_length=100, verbose_name='Name (English)'),
),
]

View File

@ -1,13 +1,21 @@
from django.db import models from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils.translation import get_language
from django.db.models.signals import post_save from django.db.models.signals import post_save
from django.dispatch import receiver from django.dispatch import receiver
import uuid import uuid
class Country(models.Model): class Country(models.Model):
name = models.CharField(_('Name'), max_length=100) name_en = models.CharField(_('Name (English)'), max_length=100)
name_ar = models.CharField(_('Name (Arabic)'), max_length=100)
@property
def name(self):
if get_language() == 'ar':
return self.name_ar
return self.name_en
def __str__(self): def __str__(self):
return self.name return self.name
@ -17,8 +25,15 @@ class Country(models.Model):
class Governate(models.Model): class Governate(models.Model):
country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name=_('Country')) country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name=_('Country'))
name = models.CharField(_('Name'), max_length=100) name_en = models.CharField(_('Name (English)'), max_length=100)
name_ar = models.CharField(_('Name (Arabic)'), max_length=100)
@property
def name(self):
if get_language() == 'ar':
return self.name_ar
return self.name_en
def __str__(self): def __str__(self):
return f"{self.name} ({self.country.name})" return f"{self.name} ({self.country.name})"
@ -28,8 +43,15 @@ class Governate(models.Model):
class City(models.Model): class City(models.Model):
governate = models.ForeignKey(Governate, on_delete=models.CASCADE, verbose_name=_('Governate')) governate = models.ForeignKey(Governate, on_delete=models.CASCADE, verbose_name=_('Governate'))
name = models.CharField(_('Name'), max_length=100) name_en = models.CharField(_('Name (English)'), max_length=100)
name_ar = models.CharField(_('Name (Arabic)'), max_length=100)
@property
def name(self):
if get_language() == 'ar':
return self.name_ar
return self.name_en
def __str__(self): def __str__(self):
return f"{self.name} ({self.governate.name})" return f"{self.name} ({self.governate.name})"
@ -122,4 +144,4 @@ class Parcel(models.Model):
class Meta: class Meta:
verbose_name = _('Parcel') verbose_name = _('Parcel')
verbose_name_plural = _('Parcels') verbose_name_plural = _('Parcels')

View File

@ -5,6 +5,7 @@ from django.contrib.auth.decorators import login_required
from .models import Parcel, Profile, Country, Governate, City from .models import Parcel, Profile, Country, Governate, City
from .forms import UserRegistrationForm, ParcelForm from .forms import UserRegistrationForm, ParcelForm
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils.translation import get_language
from django.contrib import messages from django.contrib import messages
from django.http import JsonResponse from django.http import JsonResponse
from django.urls import reverse from django.urls import reverse
@ -168,10 +169,16 @@ def article_detail(request):
def get_governates(request): def get_governates(request):
country_id = request.GET.get('country_id') country_id = request.GET.get('country_id')
governates = Governate.objects.filter(country_id=country_id).values('id', 'name') lang = get_language()
return JsonResponse(list(governates), safe=False) field_name = 'name_ar' if lang == 'ar' else 'name_en'
governates = Governate.objects.filter(country_id=country_id).order_by(field_name)
data = [{'id': g.id, 'name': getattr(g, field_name)} for g in governates]
return JsonResponse(data, safe=False)
def get_cities(request): def get_cities(request):
governate_id = request.GET.get('governate_id') governate_id = request.GET.get('governate_id')
cities = City.objects.filter(governate_id=governate_id).values('id', 'name') lang = get_language()
return JsonResponse(list(cities), safe=False) field_name = 'name_ar' if lang == 'ar' else 'name_en'
cities = City.objects.filter(governate_id=governate_id).order_by(field_name)
data = [{'id': c.id, 'name': getattr(c, field_name)} for c in cities]
return JsonResponse(data, safe=False)