From 0e850fd80beb1a3dad81aea1051e19d6becab27c Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 25 Jan 2026 07:26:38 +0000 Subject: [PATCH] adding thwani gateway --- config/__pycache__/settings.cpython-311.pyc | Bin 5709 -> 5788 bytes config/settings.py | 2 + core/__pycache__/forms.cpython-311.pyc | Bin 3088 -> 4701 bytes core/__pycache__/urls.cpython-311.pyc | Bin 1059 -> 1361 bytes core/__pycache__/views.cpython-311.pyc | Bin 2501 -> 6270 bytes core/forms.py | 25 ++- core/templates/base.html | 31 ++- core/templates/core/driver_dashboard.html | 82 ++++++++ core/templates/core/shipment_request.html | 36 ++-- core/templates/core/shipper_dashboard.html | 41 ++++ core/templatetags/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 170 bytes .../__pycache__/i18n_urls.cpython-311.pyc | Bin 0 -> 842 bytes core/templatetags/i18n_urls.py | 12 ++ core/urls.py | 7 +- core/views.py | 67 +++++- locale/ar/LC_MESSAGES/django.mo | Bin 5509 -> 7556 bytes locale/ar/LC_MESSAGES/django.po | 198 ++++++++++++++---- locale/en/LC_MESSAGES/django.po | 189 ++++++++++++++--- 19 files changed, 579 insertions(+), 111 deletions(-) create mode 100644 core/templates/core/driver_dashboard.html create mode 100644 core/templates/core/shipper_dashboard.html create mode 100644 core/templatetags/__init__.py create mode 100644 core/templatetags/__pycache__/__init__.cpython-311.pyc create mode 100644 core/templatetags/__pycache__/i18n_urls.cpython-311.pyc create mode 100644 core/templatetags/i18n_urls.py diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index 625a9a3b199c08d6f998fcd53e3beeed53052014..2aa9bed520adad1ffee4c93792b5f3d30441d19d 100644 GIT binary patch delta 181 zcmX@BGe?(iIWI340}wbKEzOh@oyaG__+g{^3l?7YD8m$wD5DhSU5esS33=BJeAq}mk~0=bMpT+GF?*+b|Tv-k~Bg$oQqH^gKwFbG2s GSRVjLT{ETt delta 102 zcmbQEdsc^UIWI340}!|#D$TqvGLcV$@x?~<7c8vI!3>)2n`Ky^axrNdZWa~LU{WpO t0jet!1QGl|;unWaZhlH>PO4o|E|ALz#Kr%ZH+KvDV&=ZUAOu8UwE#@H8DIba diff --git a/config/settings.py b/config/settings.py index fbbd525..abd7cb1 100644 --- a/config/settings.py +++ b/config/settings.py @@ -189,3 +189,5 @@ if EMAIL_USE_SSL: # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' +LOGIN_REDIRECT_URL = 'dashboard' +LOGOUT_REDIRECT_URL = 'index' diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index e8430d1d6a5c4c2ce92cb55a3614534232264db2..b5c40e345219e6edebbb61911688c9a1100ed8ef 100644 GIT binary patch delta 2103 zcma)7O>7%Q6y9Ci>z|F?)FGxcu`_AfrVGvg&xQV~RZAse0&NJ2)SAUJNt`-fGrLZx z1>Fh($}!O*VWCL$fXbm2DnzPsK&2P%yV4?Aix6D7rE0nK#Jt@!si{?U{N~fndvD&~ z%p0%n`}1Jphj={3u_66dDSR7SOYGynTI(J8U@n&tdTk4u=W9;HiP?tpLZ} zX44-tlBX46TG1D1wcyxAPL|eIjwS^+JW18rLXo)Qq(bwg_|yF#c|L9~3WtJmW_9g; zYU7SD%kxRIEtnU(8H@I8d>TB%qYV3&18z_w#aVg?1cw=D5Dh|z9x(q3{mOT5d?!xv z{2}w-FcSMgX~67=bo0ID@kpoqIxzYG1{t`~TrOW!G%c6Yf^5yK+@J?QI&6L(`MDjO z%lsudNnZozet-`1LbOMMP_{!bm!k*UeMi9T0eAyo*t{EUPmQxrjc0Jmw+xk}v5h~X z5^s3P0VB`m&VWc@JUYVQ8;)=@JmzKuuhKlLv~WvcXTYXEW&$|CsvC4;em&2rbg{u+ zbX)P!Jr>5UJrXc~5fa8i_^BZ*;DEr92oBz2ink$VZ{W~+;EveHV|wDkQ^On%;4qG? z3r)3luFkggXoDq#!?Bm#C^c++nSCudP~cx2l!2QnVSZhN%gw40Z*=SN5>0q}n($hi z@b)(F4Ay7NNwR^-dG1?q8#~ump6uB@*Zv8jE3)WHm}q%gDC-5a36*&_r06=;s)51&Az7er zF{`X;byBXj4h@f>i#jDlKZ?#2^lP%=%jpGh-8wopj!rL;Qib?pZ*R42QpsOc<_J2w zn{`#1_OeDtuFlET#H5!xI_;-kZ9Ti4`VJ@l-gfFJ%Tli~50sj=Q`1grx}NE)k#%*mWL>@jl>68=E>q_+wMI3d zjBaOiC!^QVz|GM2dmbdL+=oDlX6JM#r(5F{AhcwoB?m3l(?@Gl>$$tE6Jt}|U5veLtb-7(^HjMP)Ft}3;- zojUBK4%ahXHN`@Mc4o-Q4AoKhP2M^%YNIg+jn&hc+PgKwP7gTgfks8#^3QSlenm|hSey%$KK_0qZ7b^_ndnF8eVt^#5=d?N#q#YRwu5%-^NHH_!2HJWJ(ySZ)8h>ml$THxYVH{{vL(|4;w` delta 462 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 TVl@#)E5p1Dr-hpc{RaO7Y``+| delta 1015 zcmZuv%}*0S6rb6TZrk0KkJ|Df0zxY^Y891&hL9M8#Ds9sL|sjqO?NB{v#ri?ym&CaS%?YB8-3dgHS=@Ul7F15NHV*CHJMo6x4Q_06SNw@(#(i&B z&fV3x-UARsEvK|-P|FM?$5$0rr0C70V=LDnZxt=0d3YZz6E6tdV>pIf zUj1+_!@Sl&*$7om!ZnJsVcSdHG;P z3`E%SO%$~L`xQF_Y8D=65a0#cQ<9D6?=xSOK40nEi)y=S+nXW(~2TD^W-aB6iIr)M5NjXDVmpM>S?Uj88J?H0Od$Ad{cU*#~G|5i!O)=)8ZN z?V!v4apv9Ym>d}L(GlB0MgORIe#h`7314j@fFB|fS{uDhffE|WV@>owgbn`zkIMEL diff --git a/core/forms.py b/core/forms.py index 278dc97..a49a99b 100644 --- a/core/forms.py +++ b/core/forms.py @@ -1,7 +1,7 @@ from django import forms from django.contrib.auth.models import User from django.utils.translation import gettext_lazy as _ -from .models import Profile +from .models import Profile, Parcel class UserRegistrationForm(forms.ModelForm): password = forms.CharField(widget=forms.PasswordInput, label=_("Password")) @@ -36,4 +36,25 @@ class UserRegistrationForm(forms.ModelForm): role=self.cleaned_data['role'], phone_number=self.cleaned_data['phone_number'] ) - return user \ No newline at end of file + return user + +class ParcelForm(forms.ModelForm): + class Meta: + model = Parcel + fields = ['description', 'weight', 'pickup_address', 'delivery_address', 'receiver_name', 'receiver_phone'] + widgets = { + 'description': forms.Textarea(attrs={'rows': 3, 'class': 'form-control', 'placeholder': _('What are you sending?')}), + 'weight': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.1'}), + 'pickup_address': forms.TextInput(attrs={'class': 'form-control', 'placeholder': _('123 Street, City')}), + 'delivery_address': forms.TextInput(attrs={'class': 'form-control', 'placeholder': _('456 Avenue, City')}), + 'receiver_name': forms.TextInput(attrs={'class': 'form-control'}), + 'receiver_phone': forms.TextInput(attrs={'class': 'form-control'}), + } + labels = { + 'description': _('Package Description'), + 'weight': _('Weight (kg)'), + 'pickup_address': _('Pickup Address'), + 'delivery_address': _('Delivery Address'), + 'receiver_name': _('Receiver Name'), + 'receiver_phone': _('Receiver Phone'), + } diff --git a/core/templates/base.html b/core/templates/base.html index 6fef6cc..5fc0e5a 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -1,4 +1,4 @@ -{% load i18n static %} +{% load i18n static i18n_urls %} {% get_current_language as LANGUAGE_CODE %} {% get_language_info for LANGUAGE_CODE as lang %} @@ -39,6 +39,10 @@ margin-left: auto !important; margin-right: 0 !important; } + .dropdown-menu-end { + left: 0 !important; + right: auto !important; + } {% endif %} @@ -58,6 +62,9 @@ {% trans "How it Works" %} {% if user.is_authenticated %} + @@ -84,9 +91,10 @@ {% get_available_languages as LANGUAGES %} {% for lang_code, lang_name in LANGUAGES %}
  • + {% translate_url lang_code as the_redirect_url %}
    {% csrf_token %} - +
  • +
    + {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} +
    +
    {% block content %}{% endblock %}
    @@ -118,4 +141,4 @@ - + \ No newline at end of file diff --git a/core/templates/core/driver_dashboard.html b/core/templates/core/driver_dashboard.html new file mode 100644 index 0000000..7639897 --- /dev/null +++ b/core/templates/core/driver_dashboard.html @@ -0,0 +1,82 @@ +{% extends 'base.html' %} +{% load i18n %} + +{% block content %} +
    +

    {% trans "Driver Dashboard" %}

    + + + +
    + +
    + {% if available_parcels %} +
    + {% for parcel in available_parcels %} +
    +
    +
    +
    {{ parcel.description|truncatechars:30 }}
    +

    {% trans "Pickup" %}: {{ parcel.pickup_address }}

    +

    {% trans "Delivery" %}: {{ parcel.delivery_address }}

    +

    {% trans "Weight" %}: {{ parcel.weight }} kg

    + + {% csrf_token %} + + +
    +
    +
    + {% endfor %} +
    + {% else %} +

    {% trans "No shipments available at the moment." %}

    + {% endif %} +
    + + +
    + {% if my_parcels %} +
    + {% for parcel in my_parcels %} +
    +
    +
    +
    + #{{ parcel.tracking_number }} + {{ parcel.get_status_display }} +
    +
    {{ parcel.description|truncatechars:30 }}
    +

    {% trans "To" %}: {{ parcel.delivery_address }}

    +

    {% trans "Receiver" %}: {{ parcel.receiver_name }}

    + +
    + {% csrf_token %} + + +
    +
    +
    +
    + {% endfor %} +
    + {% else %} +

    {% trans "You haven't accepted any shipments yet." %}

    + {% endif %} +
    +
    +
    +{% endblock %} diff --git a/core/templates/core/shipment_request.html b/core/templates/core/shipment_request.html index de179ad..0970ab4 100644 --- a/core/templates/core/shipment_request.html +++ b/core/templates/core/shipment_request.html @@ -1,37 +1,27 @@ {% extends 'base.html' %} {% load static %} +{% load i18n %} {% block content %}
    -

    Request a Shipment

    +

    {% trans "Request a Shipment" %}

    {% csrf_token %}
    -
    - - + {% for field in form %} +
    + + {{ field }} + {% if field.errors %} +
    {{ field.errors }}
    + {% endif %}
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - + {% endfor %} +
    +
    @@ -39,4 +29,4 @@
    -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/shipper_dashboard.html b/core/templates/core/shipper_dashboard.html new file mode 100644 index 0000000..9eb4ad4 --- /dev/null +++ b/core/templates/core/shipper_dashboard.html @@ -0,0 +1,41 @@ +{% extends 'base.html' %} +{% load i18n %} + +{% block content %} +
    +
    +

    {% trans "My Shipments" %}

    + {% trans "New Shipment" %} +
    + + {% if parcels %} +
    + {% for parcel in parcels %} +
    +
    +
    +
    + #{{ parcel.tracking_number }} + + {{ parcel.get_status_display }} + +
    +
    {{ parcel.description|truncatechars:30 }}
    +

    {% trans "From" %}: {{ parcel.pickup_address }}

    +

    {% trans "To" %}: {{ parcel.delivery_address }}

    +
    +

    {% trans "Receiver" %}: {{ parcel.receiver_name }}

    +

    {% trans "Carrier" %}: {% if parcel.carrier %}{{ parcel.carrier.get_full_name|default:parcel.carrier.username }}{% else %}{% trans "Waiting for pickup" %}{% endif %}

    +
    +
    +
    + {% endfor %} +
    + {% else %} +
    +

    {% trans "You haven't sent any shipments yet." %}

    + {% trans "Send your first shipment" %} +
    + {% endif %} +
    +{% endblock %} diff --git a/core/templatetags/__init__.py b/core/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/templatetags/__pycache__/__init__.cpython-311.pyc b/core/templatetags/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b088eaee592fc6bb3a6d1663ddd73f655969e4dc GIT binary patch literal 170 zcmZ3^%ge<81l~tVGePuY5CH>>P{wCAAY(d13PUi1CZpd~ka?P09s4 zbO>EKrsGX6#r-q-2iV~tMo=(x>gM7tQ=j~cT>FrozVAs-df(I6LSYqwz4;M(9!BVw zA`8>!VDbULHFA-QebmHNj1|^=t*KWHj5I{?X=ahs1<+d%RL#ce6*x%>7meOf2()Hru` zU@A3}2;4P_Pz>w;=Hhfkms+H8&DD-jq{YiR@8_lKz0}3B4+uqigu75hZ&?Xw(GO*g z(X)_pA%RJ~PK7Lhv)_fjZ?_$BB8%>+)2at{N}*}U++3Pm@nIi?x|FHjN<*b_C9({5 zcVL|aO=^Y5VM~M-J*Tx$1k8FLum*2CHEPuYMy*9Jg;VF2x3}L?edN3C3#Klbx-0n|Kl?hye4$ZvG&a^T08_X-lt$SQhCRe!!KTmBa_8Vdk z;1pX2cb9+G4BXJC2kbFW^+mh|ZmeUBhp5y~k0E;APmd8PUF|2NG$5M^+3e&;c;yxs hZ*Vbw+Q-EK-bwJzSj*tOF#`8TN1B<6OvBT9{sQ{Y$yfjY literal 0 HcmV?d00001 diff --git a/core/templatetags/i18n_urls.py b/core/templatetags/i18n_urls.py new file mode 100644 index 0000000..db291e8 --- /dev/null +++ b/core/templatetags/i18n_urls.py @@ -0,0 +1,12 @@ +from django import template +from django.urls import translate_url as django_translate_url + +register = template.Library() + +@register.simple_tag(takes_context=True) +def translate_url(context, lang_code): + request = context.get('request') + if not request: + return '' + path = request.get_full_path() + return django_translate_url(path, lang_code) diff --git a/core/urls.py b/core/urls.py index ddda4d3..9d0cf81 100644 --- a/core/urls.py +++ b/core/urls.py @@ -7,6 +7,9 @@ urlpatterns = [ path('register/', views.register, name='register'), path('login/', auth_views.LoginView.as_view(template_name='core/login.html'), name='login'), path('logout/', auth_views.LogoutView.as_view(next_page='index'), name='logout'), + path('dashboard/', views.dashboard, name='dashboard'), path('shipment-request/', views.shipment_request, name='shipment_request'), - path('article-detail/', views.article_detail, name='article_detail'), -] + 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 diff --git a/core/views.py b/core/views.py index f9e0421..218d1cd 100644 --- a/core/views.py +++ b/core/views.py @@ -1,10 +1,11 @@ -from django.shortcuts import render, redirect -from django.contrib.auth import login, authenticate +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 .forms import UserRegistrationForm +from .forms import UserRegistrationForm, ParcelForm from django.utils.translation import gettext_lazy as _ +from django.contrib import messages def index(request): tracking_id = request.GET.get('tracking_id') @@ -28,17 +29,67 @@ def register(request): if form.is_valid(): user = form.save() login(request, user) - return redirect('index') + return redirect('dashboard') else: form = UserRegistrationForm() return render(request, 'core/register.html', {'form': form}) +@login_required +def dashboard(request): + profile = request.user.profile + if profile.role == 'shipper': + parcels = Parcel.objects.filter(shipper=request.user).order_by('-created_at') + return render(request, 'core/shipper_dashboard.html', {'parcels': parcels}) + else: + # Car Owner view + available_parcels = Parcel.objects.filter(status='pending').order_by('-created_at') + my_parcels = Parcel.objects.filter(carrier=request.user).exclude(status='delivered').order_by('-created_at') + return render(request, 'core/driver_dashboard.html', { + 'available_parcels': available_parcels, + 'my_parcels': my_parcels + }) + @login_required def shipment_request(request): + if request.user.profile.role != 'shipper': + messages.error(request, _("Only shippers can request shipments.")) + return redirect('dashboard') + if request.method == 'POST': - # Logic for creating shipment will go here - pass - return render(request, 'core/shipment_request.html') + form = ParcelForm(request.POST) + if form.is_valid(): + parcel = form.save(commit=False) + parcel.shipper = request.user + parcel.save() + messages.success(request, _("Shipment requested successfully! Tracking ID: ") + parcel.tracking_number) + return redirect('dashboard') + else: + form = ParcelForm() + return render(request, 'core/shipment_request.html', {'form': form}) + +@login_required +def accept_parcel(request, parcel_id): + if request.user.profile.role != 'car_owner': + messages.error(request, _("Only car owners can accept shipments.")) + return redirect('dashboard') + + parcel = get_object_or_404(Parcel, id=parcel_id, status='pending') + parcel.carrier = request.user + parcel.status = 'picked_up' + parcel.save() + messages.success(request, _("You have accepted the shipment!")) + return redirect('dashboard') + +@login_required +def update_status(request, parcel_id): + parcel = get_object_or_404(Parcel, id=parcel_id, carrier=request.user) + if request.method == 'POST': + new_status = request.POST.get('status') + if new_status in dict(Parcel.STATUS_CHOICES): + parcel.status = new_status + parcel.save() + messages.success(request, _("Status updated successfully!")) + return redirect('dashboard') def article_detail(request): - return render(request, 'core/article_detail.html') + return render(request, 'core/article_detail.html') \ No newline at end of file diff --git a/locale/ar/LC_MESSAGES/django.mo b/locale/ar/LC_MESSAGES/django.mo index d09703c850b57a62d182910f7e6552b25b1dfec0..874c96fdb7d3589cd83128521b1c6b7a79765d94 100644 GIT binary patch literal 7556 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 HBW3fy4aIZz delta 1807 zcmYk+Sxi({9LMo9D%;4SGr+KEuUi4BI8`Vp6-5EHvEuU3#lQX(gf2*7&3eK_6WD{S8Os$^7r+%m1D` zU)S`N#m7UljvLB*L=h32VT_MI&f-AXmTb&s+>Y7!J?7zg%);w92XA8nR&1z2cU<0b7CY+5QVJ^ln3BN)Q2XG6X#cF(vbY!Bb#%RtpsQcGp zIyR#E-HG$?AV%;@3^KkMhPAkeh0Pk`^e(V6Xy$@OFfxR zn3KsvE*TGVuoSiOwWx`0#Wcn@yIq5idaxb!U=J2zA7&1m^N4c0`sXKLrruD3vd({;2)XfKg!7z7h15GWySDY)H{2IT3ML9Y2ZB6 z%9o%zuEcU|LUr7WTEI!yeh$^oHRoTh{Sj&t&Wv-nKBq#|JE}l6>_xqb4%DvgL1khP z)!}JehNHL;|3hUU7@BUMkJ>vGsQ$L0`e{Lp^9`z>_^`X-8Y)G1P#xVzrShq}9^@ip zm>kqZicu?%q6XNHrPzf$Voo7HbCH8G_bX~aH&M_3jr12c_c+v zJ=lgCAdYH3fqHl6@Dh$;0ADYfn09!vyI6&*h;@XrLiQ7@FV**7Penzm*E?NGtRZR$ zmA8o1#AbqRlK7|83bZdgLX%NhOX#a%K8Xy#tD?_P`$I*GDNCG@Va89C3a3)EiP+%k z%dwW=(|uKx1(ml6Wk^Nu_8p>;&=;Xis(qz0bDG5K)7RGE>iV?zDAg(@#C)QT&^NBX z)^~{&go-xX%d(Oa{WUKkwE0xl6N`yAiAo|$*c+)^Y9_d@ZA!4x zz8@U6DYM7yk@T3IOs};y8LPsFW4_txALwZFz53~!yX`+21NKB_w~b_FNBq|2mUge? zP;;sIVEVlE6Yo&-$avPnfSnQg%-T?ceG(c<`t$7VKF|IZZW^i0E)R_K=d=gxWaNsy hn%85S@^{(M{CReH!H_K~{LWr3jN06yDmzwm>3^NZxv&5L diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po index b844de2..5aea45a 100644 --- a/locale/ar/LC_MESSAGES/django.po +++ b/locale/ar/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-01-25 07:13+0000\n" +"POT-Creation-Date: 2026-01-25 07:25+0000\n" "PO-Revision-Date: 2026-01-25 07:13+0000\n" "Last-Translator: Gemini\n" "Language-Team: Arabic\n" @@ -15,8 +15,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " -" && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" #: core/forms.py:7 msgid "Password" @@ -54,6 +54,42 @@ msgstr "اسم العائلة" msgid "Passwords don't match" msgstr "كلمات المرور غير متطابقة" +#: core/forms.py:46 +msgid "What are you sending?" +msgstr "ماذا سترسل؟" + +#: core/forms.py:48 +msgid "123 Street, City" +msgstr "123 شارع، مدينة" + +#: core/forms.py:49 +msgid "456 Avenue, City" +msgstr "456 جادة، مدينة" + +#: core/forms.py:54 +msgid "Package Description" +msgstr "وصف الطرد" + +#: core/forms.py:55 core/models.py:36 +msgid "Weight (kg)" +msgstr "الوزن (كجم)" + +#: core/forms.py:56 core/models.py:38 +msgid "Pickup Address" +msgstr "عنوان الاستلام" + +#: core/forms.py:57 core/models.py:39 +msgid "Delivery Address" +msgstr "عنوان التوصيل" + +#: core/forms.py:58 core/models.py:41 +msgid "Receiver Name" +msgstr "اسم المستلم" + +#: core/forms.py:59 core/models.py:42 +msgid "Receiver Phone" +msgstr "هاتف المستلم" + #: core/models.py:8 core/models.py:32 msgid "Shipper" msgstr "شاحن" @@ -102,7 +138,7 @@ msgstr "ملغي" msgid "Tracking Number" msgstr "رقم التتبع" -#: core/models.py:33 +#: core/models.py:33 core/templates/core/shipper_dashboard.html:28 msgid "Carrier" msgstr "الناقل" @@ -110,30 +146,10 @@ msgstr "الناقل" msgid "Description" msgstr "الوصف" -#: core/models.py:36 -msgid "Weight (kg)" -msgstr "الوزن (كجم)" - #: core/models.py:36 msgid "Weight in kg" msgstr "الوزن بالكيلوجرام" -#: core/models.py:38 -msgid "Pickup Address" -msgstr "عنوان الاستلام" - -#: core/models.py:39 -msgid "Delivery Address" -msgstr "عنوان التوصيل" - -#: core/models.py:41 -msgid "Receiver Name" -msgstr "اسم المستلم" - -#: core/models.py:42 -msgid "Receiver Phone" -msgstr "هاتف المستلم" - #: core/models.py:44 core/templates/core/index.html:30 msgid "Status" msgstr "الحالة" @@ -158,35 +174,94 @@ msgstr "طرود" msgid "Small Shipments, Smart Delivery" msgstr "شحنات صغيرة، توصيل ذكي" -#: core/templates/base.html:58 +#: core/templates/base.html:62 msgid "How it Works" msgstr "كيف يعمل" -#: core/templates/base.html:62 +#: core/templates/base.html:66 +msgid "Dashboard" +msgstr "لوحة التحكم" + +#: core/templates/base.html:69 msgid "Hello" msgstr "مرحباً" -#: core/templates/base.html:67 +#: core/templates/base.html:74 msgid "Logout" msgstr "تسجيل الخروج" -#: core/templates/base.html:72 core/templates/core/login.html:4 +#: core/templates/base.html:79 core/templates/core/login.html:4 #: core/templates/core/login.html:25 msgid "Login" msgstr "تسجيل الدخول" -#: core/templates/base.html:75 core/templates/core/register.html:4 +#: core/templates/base.html:82 core/templates/core/register.html:4 msgid "Register" msgstr "تسجيل" -#: core/templates/base.html:101 core/templates/core/index.html:13 +#: core/templates/base.html:110 +msgid "Find Loads" +msgstr "البحث عن شحنات" + +#: core/templates/base.html:112 core/templates/core/index.html:13 msgid "Start Shipping" msgstr "ابدأ الشحن" -#: core/templates/base.html:114 +#: core/templates/base.html:137 msgid "All rights reserved." msgstr "جميع الحقوق محفوظة." +#: core/templates/core/driver_dashboard.html:6 +msgid "Driver Dashboard" +msgstr "لوحة تحكم السائق" + +#: core/templates/core/driver_dashboard.html:10 +msgid "Available Shipments" +msgstr "الشحنات المتوفرة" + +#: core/templates/core/driver_dashboard.html:13 +msgid "My Deliveries" +msgstr "توصيلاتي" + +#: core/templates/core/driver_dashboard.html:27 +msgid "Pickup" +msgstr "الاستلام" + +#: core/templates/core/driver_dashboard.html:28 +msgid "Delivery" +msgstr "التوصيل" + +#: core/templates/core/driver_dashboard.html:29 +msgid "Weight" +msgstr "الوزن" + +#: core/templates/core/driver_dashboard.html:32 +msgid "Accept Shipment" +msgstr "قبول الشحنة" + +#: core/templates/core/driver_dashboard.html:40 +msgid "No shipments available at the moment." +msgstr "لا توجد شحنات متوفرة حالياً." + +#: core/templates/core/driver_dashboard.html:57 +#: core/templates/core/index.html:35 +#: core/templates/core/shipper_dashboard.html:25 +msgid "To" +msgstr "إلى" + +#: core/templates/core/driver_dashboard.html:58 +#: core/templates/core/shipper_dashboard.html:27 +msgid "Receiver" +msgstr "المستلم" + +#: core/templates/core/driver_dashboard.html:69 +msgid "Update" +msgstr "تحديث" + +#: core/templates/core/driver_dashboard.html:77 +msgid "You haven't accepted any shipments yet." +msgstr "لم تقبل أي شحنات بعد." + #: core/templates/core/index.html:10 msgid "Small Shipments," msgstr "شحنات صغيرة،" @@ -199,7 +274,9 @@ msgstr "توصيل ذكي." msgid "" "masarX connects shippers with local car owners for fast, reliable, and " "trackable deliveries. Your cargo, our priority." -msgstr "يربط مسارX بين الشاحنين وأصحاب السيارات المحليين لتوصيل سريع وموثوق وقابل للتتبع. شحنتك هي أولويتنا." +msgstr "" +"يربط مسارX بين الشاحنين وأصحاب السيارات المحليين لتوصيل سريع وموثوق وقابل " +"للتتبع. شحنتك هي أولويتنا." #: core/templates/core/index.html:14 msgid "Learn More" @@ -218,13 +295,10 @@ msgid "Track" msgstr "تتبع" #: core/templates/core/index.html:34 +#: core/templates/core/shipper_dashboard.html:24 msgid "From" msgstr "من" -#: core/templates/core/index.html:35 -msgid "To" -msgstr "إلى" - #: core/templates/core/index.html:42 msgid "Enter your 10-character tracking ID to see live updates." msgstr "أدخل رقم التتبع المكون من 10 أرقام لرؤية التحديثات المباشرة." @@ -311,6 +385,54 @@ msgstr "لديك حساب بالفعل؟" msgid "Login here" msgstr "سجل دخولك هنا" -#: core/views.py:17 +#: core/templates/core/shipment_request.html:10 +msgid "Request a Shipment" +msgstr "طلب شحنة" + +#: core/templates/core/shipment_request.html:24 +msgid "Submit Request" +msgstr "إرسال الطلب" + +#: core/templates/core/shipper_dashboard.html:7 +msgid "My Shipments" +msgstr "شحناتي" + +#: core/templates/core/shipper_dashboard.html:8 +msgid "New Shipment" +msgstr "شحنة جديدة" + +#: core/templates/core/shipper_dashboard.html:28 +msgid "Waiting for pickup" +msgstr "في انتظار الاستلام" + +#: core/templates/core/shipper_dashboard.html:36 +msgid "You haven't sent any shipments yet." +msgstr "لم ترسل أي شحنات بعد." + +#: core/templates/core/shipper_dashboard.html:37 +msgid "Send your first shipment" +msgstr "أرسل أول شحنة لك" + +#: core/views.py:18 msgid "Parcel not found." -msgstr "الطرد غير موجود." \ No newline at end of file +msgstr "الطرد غير موجود." + +#: core/views.py:55 +msgid "Only shippers can request shipments." +msgstr "فقط الشاحنين يمكنهم طلب شحنات." + +#: core/views.py:64 +msgid "Shipment requested successfully! Tracking ID: " +msgstr "تم طلب الشحنة بنجاح! رقم التتبع: " + +#: core/views.py:73 +msgid "Only car owners can accept shipments." +msgstr "فقط أصحاب السيارات يمكنهم قبول الشحنات." + +#: core/views.py:80 +msgid "You have accepted the shipment!" +msgstr "لقد قبلت الشحنة!" + +#: core/views.py:91 +msgid "Status updated successfully!" +msgstr "تم تحديث الحالة بنجاح!" \ No newline at end of file diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 01f7466..d380b53 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-01-25 07:13+0000\n" +"POT-Creation-Date: 2026-01-25 07:25+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,6 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" + #: core/forms.py:7 msgid "Password" msgstr "" @@ -53,6 +54,42 @@ msgstr "" msgid "Passwords don't match" msgstr "" +#: core/forms.py:46 +msgid "What are you sending?" +msgstr "" + +#: core/forms.py:48 +msgid "123 Street, City" +msgstr "" + +#: core/forms.py:49 +msgid "456 Avenue, City" +msgstr "" + +#: core/forms.py:54 +msgid "Package Description" +msgstr "" + +#: core/forms.py:55 core/models.py:36 +msgid "Weight (kg)" +msgstr "" + +#: core/forms.py:56 core/models.py:38 +msgid "Pickup Address" +msgstr "" + +#: core/forms.py:57 core/models.py:39 +msgid "Delivery Address" +msgstr "" + +#: core/forms.py:58 core/models.py:41 +msgid "Receiver Name" +msgstr "" + +#: core/forms.py:59 core/models.py:42 +msgid "Receiver Phone" +msgstr "" + #: core/models.py:8 core/models.py:32 msgid "Shipper" msgstr "" @@ -101,7 +138,7 @@ msgstr "" msgid "Tracking Number" msgstr "" -#: core/models.py:33 +#: core/models.py:33 core/templates/core/shipper_dashboard.html:28 msgid "Carrier" msgstr "" @@ -109,30 +146,10 @@ msgstr "" msgid "Description" msgstr "" -#: core/models.py:36 -msgid "Weight (kg)" -msgstr "" - #: core/models.py:36 msgid "Weight in kg" msgstr "" -#: core/models.py:38 -msgid "Pickup Address" -msgstr "" - -#: core/models.py:39 -msgid "Delivery Address" -msgstr "" - -#: core/models.py:41 -msgid "Receiver Name" -msgstr "" - -#: core/models.py:42 -msgid "Receiver Phone" -msgstr "" - #: core/models.py:44 core/templates/core/index.html:30 msgid "Status" msgstr "" @@ -157,35 +174,94 @@ msgstr "" msgid "Small Shipments, Smart Delivery" msgstr "" -#: core/templates/base.html:58 +#: core/templates/base.html:62 msgid "How it Works" msgstr "" -#: core/templates/base.html:62 +#: core/templates/base.html:66 +msgid "Dashboard" +msgstr "" + +#: core/templates/base.html:69 msgid "Hello" msgstr "" -#: core/templates/base.html:67 +#: core/templates/base.html:74 msgid "Logout" msgstr "" -#: core/templates/base.html:72 core/templates/core/login.html:4 +#: core/templates/base.html:79 core/templates/core/login.html:4 #: core/templates/core/login.html:25 msgid "Login" msgstr "" -#: core/templates/base.html:75 core/templates/core/register.html:4 +#: core/templates/base.html:82 core/templates/core/register.html:4 msgid "Register" msgstr "" -#: core/templates/base.html:101 core/templates/core/index.html:13 +#: core/templates/base.html:110 +msgid "Find Loads" +msgstr "" + +#: core/templates/base.html:112 core/templates/core/index.html:13 msgid "Start Shipping" msgstr "" -#: core/templates/base.html:114 +#: core/templates/base.html:137 msgid "All rights reserved." msgstr "" +#: core/templates/core/driver_dashboard.html:6 +msgid "Driver Dashboard" +msgstr "" + +#: core/templates/core/driver_dashboard.html:10 +msgid "Available Shipments" +msgstr "" + +#: core/templates/core/driver_dashboard.html:13 +msgid "My Deliveries" +msgstr "" + +#: core/templates/core/driver_dashboard.html:27 +msgid "Pickup" +msgstr "" + +#: core/templates/core/driver_dashboard.html:28 +msgid "Delivery" +msgstr "" + +#: core/templates/core/driver_dashboard.html:29 +msgid "Weight" +msgstr "" + +#: core/templates/core/driver_dashboard.html:32 +msgid "Accept Shipment" +msgstr "" + +#: core/templates/core/driver_dashboard.html:40 +msgid "No shipments available at the moment." +msgstr "" + +#: core/templates/core/driver_dashboard.html:57 +#: core/templates/core/index.html:35 +#: core/templates/core/shipper_dashboard.html:25 +msgid "To" +msgstr "" + +#: core/templates/core/driver_dashboard.html:58 +#: core/templates/core/shipper_dashboard.html:27 +msgid "Receiver" +msgstr "" + +#: core/templates/core/driver_dashboard.html:69 +msgid "Update" +msgstr "" + +#: core/templates/core/driver_dashboard.html:77 +msgid "You haven't accepted any shipments yet." +msgstr "" + #: core/templates/core/index.html:10 msgid "Small Shipments," msgstr "" @@ -217,13 +293,10 @@ msgid "Track" msgstr "" #: core/templates/core/index.html:34 +#: core/templates/core/shipper_dashboard.html:24 msgid "From" msgstr "" -#: core/templates/core/index.html:35 -msgid "To" -msgstr "" - #: core/templates/core/index.html:42 msgid "Enter your 10-character tracking ID to see live updates." msgstr "" @@ -310,6 +383,54 @@ msgstr "" msgid "Login here" msgstr "" -#: core/views.py:17 +#: core/templates/core/shipment_request.html:10 +msgid "Request a Shipment" +msgstr "" + +#: core/templates/core/shipment_request.html:24 +msgid "Submit Request" +msgstr "" + +#: core/templates/core/shipper_dashboard.html:7 +msgid "My Shipments" +msgstr "" + +#: core/templates/core/shipper_dashboard.html:8 +msgid "New Shipment" +msgstr "" + +#: core/templates/core/shipper_dashboard.html:28 +msgid "Waiting for pickup" +msgstr "" + +#: core/templates/core/shipper_dashboard.html:36 +msgid "You haven't sent any shipments yet." +msgstr "" + +#: core/templates/core/shipper_dashboard.html:37 +msgid "Send your first shipment" +msgstr "" + +#: core/views.py:18 msgid "Parcel not found." msgstr "" + +#: core/views.py:55 +msgid "Only shippers can request shipments." +msgstr "" + +#: core/views.py:64 +msgid "Shipment requested successfully! Tracking ID: " +msgstr "" + +#: core/views.py:73 +msgid "Only car owners can accept shipments." +msgstr "" + +#: core/views.py:80 +msgid "You have accepted the shipment!" +msgstr "" + +#: core/views.py:91 +msgid "Status updated successfully!" +msgstr ""