diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index bed47d4..64e66ae 100644 Binary files a/core/__pycache__/forms.cpython-311.pyc and b/core/__pycache__/forms.cpython-311.pyc differ diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 0676643..125f3bd 100644 Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index ee86b23..a02e5b3 100644 Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ diff --git a/core/forms.py b/core/forms.py index 5345c0d..0f55053 100644 --- a/core/forms.py +++ b/core/forms.py @@ -10,8 +10,8 @@ class UserRegistrationForm(forms.ModelForm): phone_number = forms.CharField(max_length=20, label=_("Phone Number")) country = forms.ModelChoiceField(queryset=Country.objects.all(), required=False, label=_("Country")) - governate = forms.ModelChoiceField(queryset=Governate.objects.all(), required=False, label=_("Governate")) - city = forms.ModelChoiceField(queryset=City.objects.all(), required=False, label=_("City")) + governate = forms.ModelChoiceField(queryset=Governate.objects.none(), required=False, label=_("Governate")) + city = forms.ModelChoiceField(queryset=City.objects.none(), required=False, label=_("City")) class Meta: model = User @@ -23,6 +23,26 @@ class UserRegistrationForm(forms.ModelForm): 'last_name': _('Last Name'), } + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if 'country' in self.data: + try: + country_id = int(self.data.get('country')) + self.fields['governate'].queryset = Governate.objects.filter(country_id=country_id).order_by('name') + except (ValueError, TypeError): + pass + 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') + + if 'governate' in self.data: + try: + governate_id = int(self.data.get('governate')) + self.fields['city'].queryset = City.objects.filter(governate_id=governate_id).order_by('name') + except (ValueError, TypeError): + pass + 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') + def clean_password_confirm(self): password = self.cleaned_data.get('password') password_confirm = self.cleaned_data.get('password_confirm') @@ -84,4 +104,42 @@ class ParcelForm(forms.ModelForm): 'delivery_address': _('Delivery Address (Street/Building)'), 'receiver_name': _('Receiver Name'), 'receiver_phone': _('Receiver Phone'), - } \ No newline at end of file + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # Pickup + self.fields['pickup_governate'].queryset = Governate.objects.none() + self.fields['pickup_city'].queryset = City.objects.none() + + if 'pickup_country' in self.data: + try: + country_id = int(self.data.get('pickup_country')) + self.fields['pickup_governate'].queryset = Governate.objects.filter(country_id=country_id).order_by('name') + except (ValueError, TypeError): + pass + + if 'pickup_governate' in self.data: + try: + gov_id = int(self.data.get('pickup_governate')) + self.fields['pickup_city'].queryset = City.objects.filter(governate_id=gov_id).order_by('name') + except (ValueError, TypeError): + pass + + # Delivery + self.fields['delivery_governate'].queryset = Governate.objects.none() + self.fields['delivery_city'].queryset = City.objects.none() + + if 'delivery_country' in self.data: + try: + country_id = int(self.data.get('delivery_country')) + self.fields['delivery_governate'].queryset = Governate.objects.filter(country_id=country_id).order_by('name') + except (ValueError, TypeError): + pass + + if 'delivery_governate' in self.data: + try: + gov_id = int(self.data.get('delivery_governate')) + self.fields['delivery_city'].queryset = City.objects.filter(governate_id=gov_id).order_by('name') + except (ValueError, TypeError): + pass diff --git a/core/templates/core/register.html b/core/templates/core/register.html index 2bdddbf..58735ff 100644 --- a/core/templates/core/register.html +++ b/core/templates/core/register.html @@ -11,11 +11,11 @@

{% trans "Join masarX" %}

-
+ {% csrf_token %} {% for field in form %}
- + {{ field }} {% if field.help_text %}
{{ field.help_text }}
@@ -37,6 +37,51 @@
+ + -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/shipment_request.html b/core/templates/core/shipment_request.html index 0970ab4..5afb913 100644 --- a/core/templates/core/shipment_request.html +++ b/core/templates/core/shipment_request.html @@ -13,7 +13,7 @@
{% for field in form %}
- + {{ field }} {% if field.errors %}
{{ field.errors }}
@@ -29,4 +29,56 @@
-{% endblock %} \ No newline at end of file + + +{% endblock %} diff --git a/core/urls.py b/core/urls.py index 9d0cf81..3b347d2 100644 --- a/core/urls.py +++ b/core/urls.py @@ -12,4 +12,8 @@ urlpatterns = [ path('accept-parcel//', views.accept_parcel, name='accept_parcel'), path('update-status//', views.update_status, name='update_status'), path('article/', views.article_detail, name='article_detail'), -] \ No newline at end of file + + # AJAX for locations + path('ajax/get-governates/', views.get_governates, name='get_governates'), + path('ajax/get-cities/', views.get_cities, name='get_cities'), +] diff --git a/core/views.py b/core/views.py index ccbb40a..09b0517 100644 --- a/core/views.py +++ b/core/views.py @@ -2,10 +2,11 @@ from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth import login, authenticate, logout from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth.decorators import login_required -from .models import Parcel, Profile +from .models import Parcel, Profile, Country, Governate, City from .forms import UserRegistrationForm, ParcelForm from django.utils.translation import gettext_lazy as _ from django.contrib import messages +from django.http import JsonResponse def index(request): tracking_id = request.GET.get('tracking_id') @@ -96,4 +97,14 @@ def update_status(request, parcel_id): return redirect('dashboard') def article_detail(request): - return render(request, 'core/article_detail.html') \ No newline at end of file + return render(request, 'core/article_detail.html') + +def get_governates(request): + country_id = request.GET.get('country_id') + governates = Governate.objects.filter(country_id=country_id).values('id', 'name') + return JsonResponse(list(governates), safe=False) + +def get_cities(request): + governate_id = request.GET.get('governate_id') + cities = City.objects.filter(governate_id=governate_id).values('id', 'name') + return JsonResponse(list(cities), safe=False)